Starting a web project with servlet 3.0 does not require the web.xml configuration file at all, so the configuration in this article is only valid in web containers that support servlet 3.0 and above
The use is spring mvc (4.3.2.RELEASE) + thymeleaf (3.0.2.RELEASE), the persistence layer uses spring's JdbcTemplate. PS: I recommend a useful framework for encapsulating JdbcTemplate: https://github.com/selfly/dexcoder-assistant. Let's start the specific configuration:
Configure spring mvc DispatcherServlet
DispatcherServlet is the core of spring mvc. Spring provides a class AbstractAnnotationConfigDispatcherServletInitializer to quickly configure DispatcherServlet. The specific code is as follows:
where onStartup() is the method in the WebApplicationInitializer interface. User Configure other filters and listeners
getRootConfigClasses() gets the configuration class, which I understand is equivalent to the context created by applicationContext.xml
getServletConfigClasses() gets the configuration class, which is equivalent to the context created by mvc-servlet.xml
This class No annotations are required,
package com.liulu.bank.config; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; import javax.servlet.FilterRegistration; import javax.servlet.ServletContext; import javax.servlet.ServletException; import java.nio.charset.StandardCharsets; /** * User : liulu * Date : 2016-10-7 15:12 */ public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer implements WebApplicationInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[]{RootConfig.class}; } @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[]{WebConfig.class}; } /** * 配置DispatcherServlet 匹配的路径 * @return */ @Override protected String[] getServletMappings() { return new String[]{"/"}; } /** * 配置其他的 servlet 和 filter * * @param servletContext * @throws ServletException */ @Override public void onStartup(ServletContext servletContext) throws ServletException { FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("encodingFilter", CharacterEncodingFilter.class); encodingFilter.setInitParameter("encoding", String.valueOf(StandardCharsets.UTF_8)); encodingFilter.setInitParameter("forceEncoding", "true"); encodingFilter.addMappingForUrlPatterns(null, false, "/*"); } }
configure applicationContext.xml, implemented by RootConfig class
package com.liulu.bank.config; import com.mchange.v2.c3p0.ComboPooledDataSource; import org.springframework.context.annotation.*; import org.springframework.core.env.Environment; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.stereotype.Controller; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.annotation.Resource; import javax.sql.DataSource; import java.beans.PropertyVetoException; /** * User : liulu * Date : 2016-10-7 15:36 */ @Configuration @PropertySource("classpath:config.properties") // 导入属性文件 @EnableAspectJAutoProxy // 相当于 xml 中的 <aop:aspectj-autoproxy/> @EnableTransactionManagement // 开启注解事务 @ComponentScan(basePackages = {"com.liulu.lit", "com.liulu.bank"}, excludeFilters = @ComponentScan.Filter(classes = Controller.class )) public class RootConfig { // 上面导入的属性文件中的属性会 注入到 Environment 中 @Resource private Environment env; /** * 配置数据库连接池 c3p0, * @return * @throws PropertyVetoException */ @Bean public DataSource dataSource() throws PropertyVetoException { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setJdbcUrl(env.getProperty("db.url")); dataSource.setDriverClass(env.getProperty("db.driver")); dataSource.setUser(env.getProperty("db.user")); dataSource.setPassword(env.getProperty("db.password")); dataSource.setMinPoolSize(Integer.valueOf(env.getProperty("pool.minPoolSize"))); dataSource.setMaxPoolSize(Integer.valueOf(env.getProperty("pool.maxPoolSize"))); dataSource.setAutoCommitOnClose(false); dataSource.setCheckoutTimeout(Integer.valueOf(env.getProperty("pool.checkoutTimeout"))); dataSource.setAcquireRetryAttempts(2); return dataSource; } /** * 配置事物管理器 * @param dataSource * @return */ @Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean public JdbcTemplate jdbcTemplate (DataSource dataSource) { return new JdbcTemplate(dataSource); } }
config.properties file in the resources directory
#数据库配置 db.url=jdbc:mysql://192.168.182.135:3306/bank db.driver=com.mysql.jdbc.Driver db.user=root db.password=123456 #数据库连接池配置 #连接池中保留的最小连接数 pool.minPoolSize=5 #连接池中保留的最大连接数 pool.maxPoolSize=30 #获取连接超时时间 pool.checkoutTimeout=1000
configure servlet.xml, implemented by WebConfig class
Thymeleaf template configuration is also below
package com.liulu.bank.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Controller; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.thymeleaf.TemplateEngine; import org.thymeleaf.spring4.SpringTemplateEngine; import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver; import org.thymeleaf.spring4.view.ThymeleafViewResolver; import org.thymeleaf.templatemode.TemplateMode; import java.nio.charset.StandardCharsets; /** * User : liulu * Date : 2016-10-7 15:16 */ @Configuration @EnableWebMvc // 启用 SpringMVC ,相当于 xml中的 <mvc:annotation-driven/> @ComponentScan(basePackages = {"com.liulu.bank.controller", "com.liulu.lit"}, includeFilters = @ComponentScan.Filter(classes = Controller.class), useDefaultFilters = false) public class WebConfig extends WebMvcConfigurerAdapter { /** * 设置由 web容器处理静态资源 ,相当于 xml中的<mvc:default-servlet-handler/> */ @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } /** * 下面三个bean 配置 Thymeleaf 模板 * @return */ @Bean public SpringResourceTemplateResolver templateResolver() { SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode(TemplateMode.HTML); templateResolver.setCharacterEncoding(String.valueOf(StandardCharsets.UTF_8)); return templateResolver; } @Bean public TemplateEngine templateEngine(SpringResourceTemplateResolver templateResolver) { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver); return templateEngine; } @Bean public ViewResolver viewResolver(TemplateEngine templateEngine) { ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); viewResolver.setTemplateEngine(templateEngine); viewResolver.setCharacterEncoding(String.valueOf(StandardCharsets.UTF_8)); return viewResolver; } }