提到Spring MVC ,是Web工程,那肯定需要web.xml,Spring的配置application.xml,Spring MVC的核心spring-mvc.xml。
有些开发喜欢把MVC的控制和Spring的配置放一起,但我自己觉得,还是分开的比较好,spring-mvc.xml就配置mvc相关东西,也就是Controller类,和视图解析。
一、Web.xml -> web项目的核心
1、配置servlet
// 配置Spring主文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-application.xml</param-value>
</context-param>
// 配置Spring监听
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
// 配置servlet
<servlet>
<servlet-name>springservlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servert-mapping>
<servlet-name>springservlet</servlet-name>
<url-patten>/</url-patten>
<servlet-mapping>
其他可以配置一些设置编码格式,或filter,这些在下面给出,并不是必须的
二、spring-application.xml配置
// Spring扫描配置
<context:component-scan base-package="com.spring.project"">
<context:exclude-filter type="annotaction" expression="org.springframework.stereotype.Controller"></context:excelude-filter>
// 该配置<context:exclude>表示不包含这些配置,Controller的扫描我们放到spring-mvc.xml里面,这样可以避免重复扫描
</context:component-scan>
// 读取属性文件
<context:property-placeholder ignore-resource-not-found="true" ignore-unresolvable="true" file-encoding="UTF-8" location="file:${configRootPath}/server.properties"
properties-ref="localProperties">
</context:property-placeholder>
<bean id = "localProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="fileEncoding" value="utf-8"/>
<property name="locations">
<list>
<value>classpath:server.properties</value>
</list>
</property>
</bean>
// 一般只需上面<context:property-placeholder>即可,但有时会找不到对应位置的配置文件,这时候就使用properties-ref bean的相关配置
在程序里使用配置文件,可以使用@Value("${key}") ,但要注意:上面那个配置是在application配置里,只能用在除了Controller的地方,如果要在Controller的地方使用,则需要在DispatcherServlet配置中的mvc配置里,加上上面的配置,不然会出现空的情况
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<!-- Connection Info -->
<property name="driverClassName" value="${jdbc.driver}" />
<!-- Connection Pooling Info -->
<!-- 连接池中最多可空闲maxIdle个连接 -->
<property name="maxIdle" value="${dbcp.maxIdle}" />
<property name="minIdle" value="${dbcp.minIdle}" />
<property name="initialSize" value="${dbcp.initialSize}" />
<!-- 连接池支持的最大连接数 -->
<property name="maxActive" value="${dbcp.maxActive}" />
<!-- 连接池中连接用完时,新的请求等待时间,毫秒 -->
<property name="maxWait" value="${dbcp.maxWait}" />
<property name="defaultAutoCommit" value="false" />
<!-- 是否自动回收超时连接 -->
<property name="removeAbandoned" value="true" />
<!-- 超时时间(以秒数为单位) -->
<property name="removeAbandonedTimeout" value="${dbcp.removeAbandonedTimeout}" />
<!-- ,将会在回收事件后,在log中打印出回收Connection的错误信息,包括在哪个地方用了Connection却忘记关闭了,在调试的时候很有用 -->
<property name="logAbandoned" value="true" />
<!-- 那么在getNumActive()快要到getMaxActive()的时候,系统会进行无效的 Connection的回收,回收的Connection为removeAbandonedTimeout(默认300秒)中设置的秒数后没有使用的
Connection -->
<property name="poolPreparedStatements" value="true" />
<!-- 每timeBetweenEvictionRunsMillis毫秒检查一次连接池中空闲的连接,把空闲时间超过minEvictableIdleTimeMillis毫秒的连接断开,直到连接池中的连接数到minIdle为止 -->
<property name="timeBetweenEvictionRunsMillis" value="${dbcp.timeBetweenEvictionRunsMillis}" />
<!-- 连接池中连接可空闲的时间(毫秒),一定要小于mysql的wait_timeout的值 -->
<property name="minEvictableIdleTimeMillis" value="${dbcp.minEvictableIdleTimeMillis}" />
<!--<property name="numTestsPerEvictionRun" value="${dbcp.maxActive}" /> -->
<!-- 取得连接时验证其有效性 -->
<property name="testOnBorrow" value="false" />
<!-- 返回连接时验证其有效性 -->
<property name="testOnReturn" value="false" />
<!-- 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除 -->
<property name="testWhileIdle" value="true" />
<!-- 验证sql -->
<property name="validationQuery" value="select 1" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:/mybatis/bc/Configuration.xml" />
<property name="mapperLocations" value="classpath:/mybatis/project/*Mapper.xml" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.project.dao.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
三、Spring-mvc.xml相关配置,主要配置扫描controoler、视图解析、编码
<context:component-scan base-package="com.project" use-default-filters="false">
<context:include-filter type="annotation" expression="com.project.controller" />
</context:component-scan>
// 注意:一定要加上use-default-filters="false",否则事务会不起效。use-default-filter默认为true,表示会自动扫描标识Controller,service,component的表示。此处写false,表示不采用默认扫描,只扫描<context:include-filter>里面的注解
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">
<mvc:message-converters register-defaults="true">
<!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
</bean>
<!-- 使用fastjson转换 -->
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="features">
<list>
<value>WriteEnumUsingToString</value>
<value>PrettyFormat</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- REST中根据URL后缀自动判定Content-Type及相应的View -->
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="ignoreAcceptHeader" value="true" />
<property name="defaultContentType" value="application/json" />
<property name="mediaTypes">
<value>
json=application/json
xml=application/xml
</value>
</property>
</bean>
<!-- 容器默认的DefaultServletHandler处理 所有静态内容与无RequestMapping处理的URL -->
<mvc:default-servlet-handler />