Maven+Spirng+SpringMVC+Mybatis+MySQL+Log4j+Junit项目配置
这是本人第一次写文章,难免有些疏漏,欢迎大家指正。近期完成了一个项目demo,发现项目框架搭建真的是很耗时的事,因此记录了这篇文章。
本人用的是intellij idea,用IDE创建maven项目就不再赘述了,有兴趣的童鞋请自行百度。
1、项目文件结构

2、编辑pom文件
PS:maven插件tomcat7-maven-plugin可以直接用maven命令运行项目,无需配置本地tomcat服务器;具体运行方式会在下一篇文章中介绍。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <groupId>MyPrj</groupId> 6 <artifactId>MyPrj</artifactId> 7 <version>1.0.0-SNAPSHOT</version> 8 <packaging>war</packaging> 9 <name>MyPrj</name> 10 <!--统一配置jar包版本--> 11 <properties> 12 <springmvc-version>4.3.0.RELEASE</springmvc-version> 13 <commons.lang3.version>3.3.2</commons.lang3.version> 14 <slf4j.version>1.7.6</slf4j.version> 15 <log4j.version>1.2.17</log4j.version> 16 <jackson.version>2.7.4</jackson.version> 17 <pagehelper.version>5.0.3-beta</pagehelper.version> 18 </properties> 19 <!--项目所需jar包--> 20 <dependencies> 21 <!--单元测试依赖包--> 22 <dependency> 23 <groupId>junit</groupId> 24 <artifactId>junit</artifactId> 25 <version>4.12</version> 26 <scope>test</scope> 27 </dependency> 28 <dependency> 29 <groupId>javax.servlet</groupId> 30 <artifactId>jstl</artifactId> 31 <version>1.2</version> 32 </dependency> 33 <dependency> 34 <groupId>javax.servlet</groupId> 35 <artifactId>javax.servlet-api</artifactId> 36 <version>3.0.1</version> 37 <scope>provided</scope> 38 </dependency> 39 <!--spring mvc depend jars begin --> 40 <dependency> 41 <groupId>aopalliance</groupId> 42 <artifactId>aopalliance</artifactId> 43 <version>1.0</version> 44 </dependency> 45 <dependency> 46 <groupId>commons-logging</groupId> 47 <artifactId>commons-logging</artifactId> 48 <version>1.2</version> 49 </dependency> 50 <dependency> 51 <groupId>org.springframework</groupId> 52 <artifactId>spring-aop</artifactId> 53 <version>${springmvc-version}</version> 54 </dependency> 55 <dependency> 56 <groupId>org.springframework</groupId> 57 <artifactId>spring-aspects</artifactId> 58 <version>${springmvc-version}</version> 59 </dependency> 60 <dependency> 61 <groupId>org.springframework</groupId> 62 <artifactId>spring-beans</artifactId> 63 <version>${springmvc-version}</version> 64 </dependency> 65 <dependency> 66 <groupId>org.springframework</groupId> 67 <artifactId>spring-context</artifactId> 68 <version>${springmvc-version}</version> 69 </dependency> 70 <dependency> 71 <groupId>org.springframework</groupId> 72 <artifactId>spring-context-support</artifactId> 73 <version>${springmvc-version}</version> 74 </dependency> 75 <dependency> 76 <groupId>org.springframework</groupId> 77 <artifactId>spring-core</artifactId> 78 <version>${springmvc-version}</version> 79 </dependency> 80 <dependency> 81 <groupId>org.springframework</groupId> 82 <artifactId>spring-expression</artifactId> 83 <version>${springmvc-version}</version> 84 </dependency> 85 <dependency> 86 <groupId>org.springframework</groupId> 87 <artifactId>spring-instrument</artifactId> 88 <version>${springmvc-version}</version> 89 </dependency> 90 <dependency> 91 <groupId>org.springframework</groupId> 92 <artifactId>spring-instrument-tomcat</artifactId> 93 <version>${springmvc-version}</version> 94 </dependency> 95 <dependency> 96 <groupId>org.springframework</groupId> 97 <artifactId>spring-jdbc</artifactId> 98 <version>${springmvc-version}</version> 99 </dependency> 100 <dependency> 101 <groupId>org.springframework</groupId> 102 <artifactId>spring-jms</artifactId> 103 <version>${springmvc-version}</version> 104 </dependency> 105 <dependency> 106 <groupId>org.springframework</groupId> 107 <artifactId>spring-messaging</artifactId> 108 <version>${springmvc-version}</version> 109 </dependency> 110 <dependency> 111 <groupId>org.springframework</groupId> 112 <artifactId>spring-orm</artifactId> 113 <version>${springmvc-version}</version> 114 </dependency> 115 <dependency> 116 <groupId>org.springframework</groupId> 117 <artifactId>spring-oxm</artifactId> 118 <version>${springmvc-version}</version> 119 </dependency> 120 <dependency> 121 <groupId>org.springframework</groupId> 122 <artifactId>spring-test</artifactId> 123 <version>${springmvc-version}</version> 124 <scope>test</scope> 125 </dependency> 126 <dependency> 127 <groupId>org.springframework</groupId> 128 <artifactId>spring-tx</artifactId> 129 <version>${springmvc-version}</version> 130 </dependency> 131 <dependency> 132 <groupId>org.springframework</groupId> 133 <artifactId>spring-web</artifactId> 134 <version>${springmvc-version}</version> 135 </dependency> 136 <dependency> 137 <groupId>org.springframework</groupId> 138 <artifactId>spring-websocket</artifactId> 139 <version>${springmvc-version}</version> 140 </dependency> 141 <dependency> 142 <groupId>org.springframework</groupId> 143 <artifactId>spring-webmvc</artifactId> 144 <version>${springmvc-version}</version> 145 </dependency> 146 <dependency> 147 <groupId>org.springframework</groupId> 148 <artifactId>spring-webmvc-portlet</artifactId> 149 <version>${springmvc-version}</version> 150 </dependency> 151 <!--spring mvc depend jars end --> 152 153 <!-- ssm or ssh need spring jar --> 154 <!-- 添加mybatis的核心包 --> 155 <dependency> 156 <groupId>org.mybatis</groupId> 157 <artifactId>mybatis</artifactId> 158 <version>3.3.0</version> 159 </dependency> 160 <!-- 添加mybatis与Spring整合的核心包 --> 161 <dependency> 162 <groupId>org.mybatis</groupId> 163 <artifactId>mybatis-spring</artifactId> 164 <version>1.2.2</version> 165 </dependency> 166 <!-- mysql驱动包 --> 167 <dependency> 168 <groupId>mysql</groupId> 169 <artifactId>mysql-connector-java</artifactId> 170 <version>5.1.8</version> 171 </dependency> 172 <dependency> 173 <groupId>c3p0</groupId> 174 <artifactId>c3p0</artifactId> 175 <version>0.9.1.2</version> 176 </dependency> 177 <dependency> 178 <groupId>net.sf.ehcache</groupId> 179 <artifactId>ehcache-core</artifactId> 180 <version>2.5.3</version> 181 </dependency> 182 <dependency> 183 <groupId>org.mybatis.caches</groupId> 184 <artifactId>mybatis-ehcache</artifactId> 185 <version>1.1.0</version> 186 </dependency> 187 <!---sitemesh pom--> 188 <dependency> 189 <groupId>org.sitemesh</groupId> 190 <artifactId>sitemesh</artifactId> 191 <version>3.0.0</version> 192 </dependency> 193 194 <dependency> 195 <groupId>org.apache.commons</groupId> 196 <artifactId>commons-lang3</artifactId> 197 <version>${commons.lang3.version}</version> 198 </dependency> 199 200 <dependency> 201 <groupId>commons-beanutils</groupId> 202 <artifactId>commons-beanutils</artifactId> 203 <version>1.6</version> 204 </dependency> 205 206 <dependency> 207 <groupId>commons-collections</groupId> 208 <artifactId>commons-collections</artifactId> 209 <version>3.2.2</version> 210 </dependency> 211 212 213 <dependency> 214 <groupId>com.google.guava</groupId> 215 <artifactId>guava</artifactId> 216 <version>15.0</version> 217 </dependency> 218 219 <dependency> 220 <groupId>net.sf.json-lib</groupId> 221 <artifactId>json-lib</artifactId> 222 <version>2.4</version> 223 <classifier>jdk15</classifier> 224 </dependency> 225 226 <!-- logging BEGIN --> 227 <dependency> 228 <groupId>log4j</groupId> 229 <artifactId>log4j</artifactId> 230 <version>${log4j.version}</version> 231 </dependency> 232 <dependency> 233 <groupId>org.slf4j</groupId> 234 <artifactId>slf4j-api</artifactId> 235 <version>${slf4j.version}</version> 236 </dependency> 237 <dependency> 238 <groupId>org.slf4j</groupId> 239 <artifactId>slf4j-log4j12</artifactId> 240 <version>${slf4j.version}</version> 241 </dependency> 242 243 <!--json--> 244 <dependency> 245 <groupId>com.fasterxml.jackson.core</groupId> 246 <artifactId>jackson-databind</artifactId> 247 <version>${jackson.version}</version> 248 </dependency> 249 250 <dependency> 251 <groupId>com.github.pagehelper</groupId> 252 <artifactId>pagehelper</artifactId> 253 <version>${pagehelper.version}</version> 254 </dependency> 255 </dependencies> 256 <!--项目构建--> 257 <build> 258 <!--项目打包之后的名称--> 259 <finalName>MyPrj</finalName> 260 <!--构建需要的插件--> 261 <plugins> 262 <!--编译插件--> 263 <plugin> 264 <groupId>org.apache.maven.plugins</groupId> 265 <artifactId>maven-compiler-plugin</artifactId> 266 <version>3.1</version> 267 <configuration> 268 <source>1.8</source> 269 <target>1.8</target> 270 </configuration> 271 </plugin> 272 273 <!-- 本地tomcat7插件 --> 274 <plugin> 275 <groupId>org.apache.tomcat.maven</groupId> 276 <artifactId>tomcat7-maven-plugin</artifactId> 277 <version>2.1</version> 278 <configuration> 279 <path>/</path> 280 <uriEncoding>UTF-8</uriEncoding> 281 <port>8888</port> 282 </configuration> 283 </plugin> 284 </plugins> 285 </build> 286 </project>
3、MyBatis配置及数据源配置
1)MyBatis配置:src-resources-mybatis下创建mybatis-config.xml文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd"> 3 <configuration> 4 <!--数据库配置--> 5 <properties> 6 <property name="dialect" value="mysql" /> 7 </properties> 8 9 <settings> 10 <!--支持属性运用驼峰的命名--> 11 <setting name="mapUnderscoreToCamelCase" value="true"/> 12 <!--指定log4j提供日志功能--> 13 <setting name="logImpl" value="LOG4J"/> 14 </settings> 15 </configuration>
2)数据源配置:
src-resources-properties创建jdbc.properties文件
src-resources-spring创建applicationContext-datasource.xml文件
1 driverClass=com.mysql.jdbc.Driver 2 jdbcUrl=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8 3 user=root 4 password=123456 5 minPoolSize=5 6 maxPoolSize=200 7 initialPoolSize=10 8 maxIdleTime=60 9 acquireIncrement=5 10 maxStatements=0 11 idleConnectionTestPeriod=60 12 acquireRetryAttempts=30 13 breakAfterAcquireFailure=true 14 testConnectionOnCheckout=false
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/aop 9 http://www.springframework.org/schema/aop/spring-aop.xsd 10 http://www.springframework.org/schema/tx 11 http://www.springframework.org/schema/tx/spring-tx.xsd"> 12 13 14 <!--引入配置文件--> 15 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 16 <property name="locations"> 17 <list> 18 <value>classpath:properties/*.properties</value> 19 <!--要是有多个配置文件,只需在这里继续添加即可 --> 20 </list> 21 </property> 22 </bean> 23 24 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 25 <property name="driverClass"> 26 <value>${driverClass}</value> 27 </property> 28 <property name="jdbcUrl"> 29 <value>${jdbcUrl}</value> 30 </property> 31 <!--MySQL数据库的用户名 --> 32 <property name="user"> 33 <value>${user}</value> 34 </property> 35 <!--MySQL数据库 密码 --> 36 <property name="password"> 37 <value>${password}</value> 38 </property> 39 <!--连接池中保留的最小连接数。--> 40 <property name="minPoolSize"> 41 <value>${minPoolSize}</value> 42 </property> 43 <!--连接池中保留的最大连接数。Default: 15 --> 44 <property name="maxPoolSize"> 45 <value>${maxPoolSize}</value> 46 </property> 47 <!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> 48 <property name="initialPoolSize"> 49 <value>${initialPoolSize}</value> 50 </property> 51 <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> 52 <property name="maxIdleTime"> 53 <value>${maxIdleTime}</value> 54 </property> 55 <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> 56 <property name="acquireIncrement"> 57 <value>${acquireIncrement}</value> 58 </property> 59 <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的 60 statements属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面 61 的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0--> 62 <property name="maxStatements"> 63 <value>${maxStatements}</value> 64 </property> 65 <!--每60秒检查所有连接池中的空闲连接。Default: 0 --> 66 <property name="idleConnectionTestPeriod"> 67 <value>${idleConnectionTestPeriod}</value> 68 </property> 69 <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> 70 <property name="acquireRetryAttempts"> 71 <value>${acquireRetryAttempts}</value> 72 </property> 73 <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 74 保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试 75 获取连接失败后该数据源将申明已断开并永久关闭。Default: false--> 76 <property name="breakAfterAcquireFailure"> 77 <value>${breakAfterAcquireFailure}</value> 78 </property> 79 <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 80 时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable 81 等方法来提升连接测试的性能。Default: false --> 82 <property name="testConnectionOnCheckout"> 83 <value>${testConnectionOnCheckout}</value> 84 </property> 85 </bean> 86 <!-- spring管理事务 --> 87 <bean id="txManager" 88 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 89 <property name="dataSource" ref="dataSource" /> 90 </bean> 91 <!-- Spring的声明式事务管理 --> 92 <!-- 设置与事务有关的各种属性 --> 93 <tx:advice id="txAdvice" transaction-manager="txManager"> 94 <tx:attributes> 95 <tx:method name="insert*" propagation="REQUIRED" 96 rollback-for="Exception" /> 97 <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception" /> 98 <tx:method name="update*" propagation="REQUIRED" 99 rollback-for="Exception" /> 100 <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception" /> 101 <tx:method name="*" read-only="false" /> 102 </tx:attributes> 103 </tx:advice> 104 </beans>
4、Spring配置
1)spring基本配置:src-resources-spring创建applicationContext-context.xml文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/aop 9 http://www.springframework.org/schema/aop/spring-aop.xsd 10 http://www.springframework.org/schema/mvc 11 http://www.springframework.org/schema/mvc/spring-mvc.xsd 12 http://www.springframework.org/schema/context 13 http://www.springframework.org/schema/context/spring-context.xsd"> 14 <!-- 全局context类配置 --> 15 <!--对静态资源文件的访问:所有URL请求都将被Spring MVC的DispatcherServlet截获,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理--> 16 <mvc:default-servlet-handler /> 17 <!-- 激活自动代理功能 --> 18 <aop:aspectj-autoproxy proxy-target-class="true" /> 19 <!-- 启动注解扫描 --> 20 <mvc:annotation-driven /> 21 <context:component-scan base-package="chin"></context:component-scan> 22 <!-- start视图配置 --> 23 <bean id="viewResolver" 24 class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 25 <property name="prefix"> 26 <value>/WEB-INF/view/</value> 27 </property> 28 <property name="suffix"> 29 <value>.jsp</value> 30 </property> 31 <property name="viewClass"> 32 <value>org.springframework.web.servlet.view.JstlView</value> 33 </property> 34 </bean> 35 <!-- end视图配置 --> 36 </beans>
2)spring整合mybatis配置:src-resources-spring创建applicationContext-mybatis.xml文件
PS:MyBatis拦截器用于打印MyBatis的SQL执行时间;代码会后续贴出来。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans.xsd 6 "> 7 <!-- 通过扫描的模式,自动注入bean --> 8 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 9 <property name="basePackage" value="chin.dao" /> 10 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> 11 </bean> 12 13 14 <!-- 配置sqlSessionFactory --> 15 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 16 <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/> 17 <property name="dataSource" ref="dataSource" /> 18 <!-- 如果 Mapper 和 xml 不在同一目录或名称不同,需要用多个路径,分隔不行 --> 19 <property name="mapperLocations"> 20 <list> 21 <value>classpath:mapper/**/*Mapper.xml</value> 22 </list> 23 </property> 24 <property name="typeAliasesPackage" value="chin.entity"/> 25 26 <!--MyBatis拦截器,用于记录sql执行时间--> 27 <property name="plugins"> 28 <array> 29 <bean id="sqlStatementInterceptor" class="chin.interceptor.SqlStatementInterceptor"/> 30 </array> 31 </property> 32 </bean> 33 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> 34 <constructor-arg index="0" ref="sqlSessionFactory" /> 35 </bean> 36 </beans>
5、项目web.xml配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 4 version="3.0"> 5 <display-name>MyPrj 3.0 Web Application</display-name> 6 <!-- 起始欢迎界面 --> 7 <welcome-file-list> 8 <welcome-file>index.jsp</welcome-file> 9 <welcome-file>index.html</welcome-file> 10 </welcome-file-list> 11 <!--siteMesh 控制器 --> 12 <filter> 13 <filter-name>sitemesh</filter-name> 14 <filter-class>org.sitemesh.config.ConfigurableSiteMeshFilter</filter-class> 15 </filter> 16 <filter-mapping> 17 <filter-name>sitemesh</filter-name> 18 <url-pattern>/*</url-pattern> 19 </filter-mapping> 20 <!-- spring 装载xml文件--> 21 <listener> 22 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 23 </listener> 24 <context-param> 25 <param-name>contextConfigLocation</param-name> 26 <param-value>classpath:spring/applicationContext-*.xml</param-value> 27 </context-param> 28 <context-param> 29 <param-name>spring.liveBeansView.mbeanDomain</param-name> 30 <param-value>dev</param-value> 31 </context-param> 32 33 <!-- Spring字符集过滤器 --> 34 <filter> 35 <filter-name>characterEncodingFilter</filter-name> 36 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 37 <init-param> 38 <param-name>encoding</param-name> 39 <param-value>UTF-8</param-value> 40 </init-param> 41 <init-param> 42 <param-name>forceEncoding</param-name> 43 <param-value>true</param-value> 44 </init-param> 45 </filter> 46 <filter-mapping> 47 <filter-name>characterEncodingFilter</filter-name> 48 <url-pattern>/*</url-pattern> 49 </filter-mapping> 50 51 <!--通过容器来处理静态资源文件--> 52 <servlet-mapping> 53 <servlet-name>default</servlet-name> 54 <url-pattern>/static/*</url-pattern> 55 </servlet-mapping> 56 57 <!-- springMVC核心配置 --> 58 <servlet> 59 <servlet-name>DispatcherServlet</servlet-name> 60 <!--在DispatcherServlet的初始化过程中,框架会在web应用的 WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml 的配置文件,生成文件中定义的bean。--> 61 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 62 <!--指明了配置文件的文件名,不使用默认配置文件名,而使用dispatcher-servlet.xml配置文件。--> 63 <init-param> 64 <param-name>contextConfigLocation</param-name> 65 <!--其中<param-value>**.xml</param-value> 这里可以使用多种写法--> 66 <!--1、不写,使用默认值:/WEB-INF/<servlet-name>-servlet.xml--> 67 <!--2、<param-value>/WEB-INF/classes/dispatcher-servlet.xml</param-value>--> 68 <!--3、<param-value>classpath*:dispatcher-servlet.xml</param-value>--> 69 <!--4、多个值用逗号分隔--> 70 <param-value>classpath:spring/spring-context.xml</param-value> 71 </init-param> 72 <load-on-startup>1</load-on-startup><!--是启动顺序,让这个Servlet随Servletp容器一起启动。--> 73 </servlet> 74 <servlet-mapping> 75 <!--这个Servlet的名字是dispatcher,可以有多个DispatcherServlet,是通过名字来区分的。每一个DispatcherServlet有自己的WebApplicationContext上下文对象。同时保存的ServletContext中和Request对象中.--> 76 <!--ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,ApplicationContext则是“应用的容器”了:P,Spring把Bean放在这个容器中,在需要的时候,用getBean方法取出--> 77 <servlet-name>DispatcherServlet</servlet-name> 78 <!--Servlet拦截匹配规则可以自已定义,当映射为@RequestMapping("/user/add")时,为例,拦截哪种URL合适?--> 79 <!--1、拦截*.do、*.htm, 例如:/user/add.do,这是最传统的方式,最简单也最实用。不会导致静态文件(jpg,js,css)被拦截。--> 80 <!--2、拦截/,例如:/user/add,可以实现现在很流行的REST风格。很多互联网类型的应用很喜欢这种风格的URL。弊端:会导致静态文件(jpg,js,css)被拦截后不能正常显示。 --> 81 <url-pattern>/</url-pattern> <!--会拦截URL中带“/”的请求。--> 82 </servlet-mapping> 83 <!--日志环境配置--> 84 <!-- 加载log4j的配置文件log4j.properties --> 85 <context-param> 86 <param-name>log4jConfigLocation</param-name> 87 <param-value>classpath:logs/log4j.properties</param-value> 88 </context-param> 89 <!-- 加载Spring框架中的log4j监听器Log4jConfigListener --> 90 <listener> 91 <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 92 </listener> 93 94 <!--公用环境配置:session-config,error_page,404,500--> 95 </web-app>
6、日志Log4J配置
1)log4j配置文件:在src-resources-logs下创建log4j.properties
1 #定义LOG输出级别 2 log4j.rootLogger=INFO,Console,File 3 4 #定义日志输出目的地为控制台 5 log4j.appender.Console=org.apache.log4j.ConsoleAppender 6 log4j.appender.Console.Target=System.out 7 #可以灵活的指定日志输出格式,下面一行是指定具体的格式 8 log4j.appender.Console.layout=org.apache.log4j.PatternLayout 9 log4j.appender.Console.layout.ConversionPattern=[%c]-%m%n 10 11 #mybatis显示SQL语句日志配置 12 #log4j.logger.org.mybatis=DEBUG 13 log4j.logger.chin.dao=DEBUG 14 15 16 #文件大小到达指定尺寸的时候产生一个新的文件 17 log4j.appender.File=org.apache.log4j.RollingFileAppender 18 #指定输出目录 19 log4j.appender.File.File=logs/ssm.log 20 #定义文件最大大小 21 log4j.appender.File.MaxFileSize=10MB 22 #输出所有日志,如果换成DEBUG表示输出DEBUG以上级别日志 23 log4j.appender.File.Threshold=ALL 24 log4j.appender.File.layout=org.apache.log4j.PatternLayout 25 log4j.appender.File.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm|\:ss}][%c]%m%n
2)在web.xml中配置日志
PS:以下配置已在上述的web.xml中存在,此处仅是说明
1 <!--日志环境配置--> 2 <!-- 加载log4j的配置文件log4j.properties --> 3 <context-param> 4 <param-name>log4jConfigLocation</param-name> 5 <param-value>classpath:logs/log4j.properties</param-value> 6 </context-param> 7 <!-- 加载Spring框架中的log4j监听器Log4jConfigListener --> 8 <listener> 9 <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 10 </listener>
7、MyBatis拦截器
上述的日志配置仅能打印出sql,并不能打印出sql的执行时间;可以添加拦截器记录sql的执行时间
1)添加拦截器
1 /** 2 * 数据库操作性能拦截器,记录耗时 3 */ 4 @Intercepts(value = { 5 @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }), 6 @Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class, 7 RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class }), 8 @Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class, 9 RowBounds.class, ResultHandler.class }) }) 10 public class SqlStatementInterceptor implements Interceptor 11 { 12 private static Logger logger = LoggerFactory.getLogger(SqlStatementInterceptor.class); 13 14 private Properties properties; 15 16 @Override 17 public Object intercept(Invocation arg0) throws Throwable 18 { 19 MappedStatement mappedStatement = (MappedStatement) arg0.getArgs()[0]; 20 String sqlId = mappedStatement.getId(); 21 Object returnValue; 22 23 long start = System.currentTimeMillis(); 24 returnValue = arg0.proceed(); 25 long end = System.currentTimeMillis(); 26 long time = end - start; 27 28 StringBuilder str = new StringBuilder(100); 29 str.append(sqlId); 30 str.append(": "); 31 str.append("cost time "); 32 str.append(time); 33 str.append(" ms."); 34 String sqlInfo = str.toString(); 35 logger.info(sqlInfo); 36 //logger.debug(sqlInfo); 37 38 return returnValue; 39 } 40 41 @Override 42 public Object plugin(Object arg0) 43 { 44 return Plugin.wrap(arg0, this); 45 } 46 47 @Override 48 public void setProperties(Properties arg0) 49 { 50 this.properties = arg0; 51 } 52 }
2)配置拦截器:在applicationContext-mybatis.xml中添加拦截器配置,上面第4步已经配置,不再赘述。
8、Junit测试基类
PS:此处用的是AbstractTransactionalJUnit4SpringContextTests类,此类支持事务;若需测试新增或修改功能,执行后此类能够回滚修改,数据库中不会因测试需要而修改数据。
1 /** 2 * spring 测试基类 3 * 此类作为测试基类,其余其实类只要继承此类即可,无需再进行配置 4 */ 5 @RunWith(SpringJUnit4ClassRunner.class) //使用标准的JUnit @RunWith注释来告诉JUnit使用Spring TestRunner 6 @ContextConfiguration(locations = {"classpath:spring/*.xml"}) //指定bean注入的配置文件 7 public class SpringBaseTestCase extends AbstractTransactionalJUnit4SpringContextTests { 8 9 protected static final Logger LOG = LoggerFactory.getLogger(ProductTestCase.class); 10 //加载日志配置文件 11 @BeforeClass 12 public static void initLogs() { 13 PropertyConfigurator.configure(Test.class.getClassLoader().getResource("logs/log4j.properties")); 14 } 15 }

浙公网安备 33010602011771号