自從有了spring boot以後, 起一個web項目變的很是簡單, 本篇文章主要講解在不使用spring boot的自動配置的狀況下, 如何使用spring mvc 搭建一個web項目 servlet3.0 後能夠拋棄web.xml了, 因此本文也不會有任何xml文件, 所有使用`java config`的形式
首先, 使用idea建立一個maven項目, 就叫 spring-web好了
使用spring mvc + mybatis + freemarker 搭建項目 spring.version=4.3.14.RELEASE 依賴的jar, 完整的 pom 文件以下:
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <exclusions> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> </exclusions> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.8</version> </dependency> <!-- freemarker --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.28</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <!-- database --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> </dependencies>
servlet 3.0 後, servlet 容器啓動時會調用實現了ServletContainerInitializer接口的類,
spring mvc 的 SpringServletContainerInitializer實現了此接口, 在源碼中能夠看到實現中會循環調用WebApplicationInitializer的實現類html
spring mvc 爲了簡化java的配置, 提供了AbstractAnnotationConfigDispatcherServletInitializer抽象類來簡化配置, 雖然類名很長
新建一個配置類叫 WebAppInitializer, 繼承上面那個名字很長的類⬆️
感受這個就至關於以前的web.xml了, 若是之前熟悉spring web項目xml配置的同窗, 很容易就能發現rootConfig 和 ServletConfig 很像以前的兩個spring的 xml配置文件
若是須要配置其餘 servlet 能夠重寫 onStartup()java
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { // rootConfig 想當於以前的 application-context.xml @Override protected Class<?>[] getRootConfigClasses() { return new Class[]{SpringContextConfig.class}; } // servletConfig 至關於以前的 mvc-servlet.xml @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } // DispatchServlet 路徑 @Override protected String[] getServletMappings() { return new String[]{"/*"}; } // 配置filters @Override protected Filter[] getServletFilters() { CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter(); encodingFilter.setEncoding(String.valueOf(StandardCharsets.UTF_8)); encodingFilter.setForceEncoding(true); return new Filter[]{encodingFilter}; } }
這裏能夠配置數據源, 事務管理器, 啓用註解掃描, 開啓aop, 和其餘框架集成(通常是orm框架, 這裏咱們使用mybatis)
是否是感受很想以前的 application-context.xml裏面的配置mysql
PS: 若是 SpringMvcConfig 配置類在 SpringContextConfig 配置的包掃描下的話, 那須要將 SpringMvcConfig類排除掉, 要否則 SpringMvcConfig 類會初始化2次web
@EnableAspectJAutoProxy @EnableTransactionManagement @PropertySource("classpath:application.properties") @ComponentScan(basePackages = {"cat.spring.web"}, excludeFilters = {@ComponentScan.Filter(classes = Controller.class), @ComponentScan.Filter(classes = EnableWebMvc.class)}) public class SpringContextConfig { @Bean public DataSource dataSource(Environment env) 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 * @retur */ @Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } /** * myBatis 配置 * * @param dataSource * @return */ @Bean public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource); sessionFactoryBean.setTypeAliasesPackage("cat.spring.web.entity"); sessionFactoryBean.setMapperLocations(new ClassPathResource[]{new ClassPathResource("/mapper/**/*.xml")}); Configuration configuration = new Configuration(); configuration.setUseGeneratedKeys(true); configuration.setMapUnderscoreToCamelCase(true); configuration.setUseColumnLabel(true); sessionFactoryBean.setConfiguration(configuration); return sessionFactoryBean; } @Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer configurer = new MapperScannerConfigurer(); configurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); configurer.setBasePackage("cat.spring.web.mapper"); return configurer; } }
給出 application.properties文件的配置spring
db.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&allowMultiQueries=true db.driver=com.mysql.jdbc.Driver db.user=root db.password=123456 #數據庫鏈接池配置 #鏈接池中保留的最小鏈接數 pool.minPoolSize=5 #鏈接池中保留的最大鏈接數 pool.maxPoolSize=30 #獲取鏈接超時時間 pool.checkoutTimeout=1000 freemarker.request-context-attribute=rc freemarker.expose-request-attributes=true freemarker.expose-session-attributes=true freemarker.prefer-file-system-access=false
SpringMvcConfig 主要配置spring mvc的攔截器, jsp或者freemarke等視圖, 或者其餘一些spring mvc 的配置sql
@EnableWebMvc @PropertySource("classpath:application.properties") @ComponentScan(basePackages = "cat.spring.web.controller", includeFilters = @ComponentScan.Filter(classes = Controller.class), useDefaultFilters = false) public class SpringMvcConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**").addResourceLocations("classpath:/static/"); } @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/index").setViewName("index"); } /** * 配置 freemarker * @return FreeMarkerConfigurer */ @Bean public FreeMarkerConfigurer freeMarkerConfigurer(Environment env) { FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer(); freeMarkerConfigurer.setTemplateLoaderPath("classpath:/templates/"); freeMarkerConfigurer.setPreferFileSystemAccess(env.getProperty("freemarker.prefer-file-system-access", boolean.class, false)); freeMarkerConfigurer.setDefaultEncoding(String.valueOf(StandardCharsets.UTF_8)); return freeMarkerConfigurer; } @Bean public ViewResolver freemarkerViewResolver(Environment env) { FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver("", ".ftl"); viewResolver.setViewClass(FreeMarkerView.class); viewResolver.setCache(false); viewResolver.setContentType("text/html;charset=utf-8"); viewResolver.setRequestContextAttribute(env.getProperty("freemarker.request-context-attribute", "rc")); viewResolver.setExposeRequestAttributes(env.getProperty("freemarker.expose-request-attributes", boolean.class, true)); viewResolver.setExposeSessionAttributes(env.getProperty("freemarker.expose-session-attributes", boolean.class, true)); return viewResolver; } }
到這裏項目配置部分就結束了, 咱們可使用maven 的tomecat插件運行數據庫
<build> <finalName>spring-web</finalName> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.0.0</version> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <username>tomcat</username> <password>123456</password> <uriEncoding>utf-8</uriEncoding> <path>/cat</path> <port>8080</port> <update>false</update> <!--<warSourceDirectory>${basedir}/src/main/webapp</warSourceDirectory>--> </configuration> </plugin> </plugins> </build>
執行命令: mvn tomcat7:runapache