spring开发环境搭建环境搭建

标题架构演变历史

spring开发环境搭建环境搭建

标题Maven构建的Spring项目需要哪些依赖?

Spring相关的依赖我参考的是这篇文章:

https://www.cnblogs.com/javafucker/p/7566733.html
1)spring核心依赖
spring-core、spring-beans、spring-context
2)spring dao依赖(提供JDBCTemplate)
spring-jdbc、spring-tx
3)spring web依赖
spring-web、spring-webmvc
4)spring test依赖
spring-test

标题完整的pom.xml文件如下

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.tusuzer</groupId>
   <artifactId>springmvc_demo</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>war</packaging>

   <name>springmvc_demo Maven Webapp</name>
   <!-- FIXME change it to the project's website -->
   <url>http://www.example.com</url>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
      <spring.version>4.3.7.RELEASE</spring.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.11</version>
         <scope>test</scope>
      </dependency>
      <!--1:日志相关依赖-->
      <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-api</artifactId>
         <version>1.7.21</version>
      </dependency>
      <dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-classic</artifactId>
         <version>1.1.7</version>
      </dependency>
      <dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-core</artifactId>
         <version>1.1.7</version>
      </dependency>
      <!--2:数据库相关依赖-->
      <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis</artifactId>
         <version>3.3.0</version>
      </dependency>
      <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis-spring</artifactId>
         <version>1.3.1</version>
      </dependency>
      <dependency>
         <groupId>joda-time</groupId>
         <artifactId>joda-time</artifactId>
         <version>2.3</version>
      </dependency>
      <dependency>
         <groupId>c3p0</groupId>
         <artifactId>c3p0</artifactId>
         <version>0.9.1.2</version>
      </dependency>
      <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <version>5.1.25</version>
      </dependency>
      <!--3:Servlet web相关依赖-->
      <dependency>
         <groupId>javax.servlet</groupId>
         <artifactId>javax.servlet-api</artifactId>
         <version>3.1.0</version>
      </dependency>
      <dependency>
         <groupId>taglibs</groupId>
         <artifactId>standard</artifactId>
         <version>1.1.2</version>
      </dependency>
      <dependency>
         <groupId>jstl</groupId>
         <artifactId>jstl</artifactId>
         <version>1.2</version>
      </dependency>
      <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-core</artifactId>
         <version>2.8.7</version>
      </dependency>
      <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-databind</artifactId>
         <version>2.8.7</version>
      </dependency>
      <dependency>
         <groupId>commons-fileupload</groupId>
         <artifactId>commons-fileupload</artifactId>
         <version>1.3.1</version>
      </dependency>
      <dependency>
         <groupId>commons-io</groupId>
         <artifactId>commons-io</artifactId>
         <version>2.4</version>
      </dependency>

      <!--4:spring依赖-->
      <!--spring核心依赖-->
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-core</artifactId>
         <version>${spring.version}</version>
      </dependency>
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-context</artifactId>
         <version>${spring.version}</version>
      </dependency>
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-beans</artifactId>
         <version>${spring.version}</version>
      </dependency>
      <!--spring dao层依赖-->
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-tx</artifactId>
         <version>${spring.version}</version>
      </dependency>
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-jdbc</artifactId>
         <version>${spring.version}</version>
      </dependency>
      <!--spring web相关依赖-->
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-web</artifactId>
         <version>${spring.version}</version>
      </dependency>
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-webmvc</artifactId>
         <version>${spring.version}</version>
      </dependency>
      <!--spring test相关依赖-->
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-test</artifactId>
         <version>${spring.version}</version>
      </dependency>
   </dependencies>

   <build>
      <finalName>springmvc_demo</finalName>
      <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
         <plugins>
            <plugin>
               <artifactId>maven-clean-plugin</artifactId>
               <version>3.1.0</version>
            </plugin>
            <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
            <plugin>
               <artifactId>maven-resources-plugin</artifactId>
               <version>3.0.2</version>
            </plugin>
            <plugin>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>3.8.0</version>
            </plugin>
            <plugin>
               <artifactId>maven-surefire-plugin</artifactId>
               <version>2.22.1</version>
            </plugin>
            <plugin>
               <artifactId>maven-war-plugin</artifactId>
               <version>3.2.2</version>
            </plugin>
            <plugin>
               <artifactId>maven-install-plugin</artifactId>
               <version>2.5.2</version>
            </plugin>
            <plugin>
               <artifactId>maven-deploy-plugin</artifactId>
               <version>2.8.2</version>
            </plugin>
         </plugins>
      </pluginManagement>
   </build>
</project>

web.xml解析

容器在解析web.xml时,首先会去读取`,提供应用程序上下文信息;

contextConfigLocation classpath:spring/root-context.xml

然后会加载节点,该节点会用到上下文的信息;

org.springframework.web.context.ContextLoaderListener

然后会加载拦截器节点,如果有多个拦截器,则是按照拦截器配置的顺序来进行调用的;

1、字符过滤器
web.xml中写法如下

<filter>
   <filter-name>CharacterEncodingFilter</filter-name>
   <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
   <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>CharacterEncodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

2、文件上传的过滤器
web.xml中写法如下

<filter>
   <filter-name>MultipartFilter</filter-name>
   <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
   <init-param>
      <param-name>multipartResolverBeanName</param-name>
      <param-value>multipartResolver</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>MultipartFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

3、扩展form所支持的http方法的过滤器
web.xml中写法如下

<filter>
   <filter-name>hiddenHttpMethodFilter</filter-name>
   <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>hiddenHttpMethodFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求,该过滤器为HiddenHttpMethodFilter。
需要注意的是,由于doFilterInternal方法只对method为post的表单进行过滤,所以在页面中必须如下设置:

<form action="..." method="post">
        <input type="hidden" name="_method" value="put" />
        ......
</form>

而不是使用:

    <form action="..." method="put">
            ......
    </form>

HiddenHttpMethodFilter的实现原理其实就是新建了个HttpMethodRequestWrapper类,覆写了getMethod()方法,也就是将原来本身的HTTP请求方式(POST)给隐藏掉了。

然后才会加载对应的节点;

DispatcherServlet是前端控制器设计模式的实现,提供SpringWebMVC的集中访问点,而且负责职责的分派,而且与
spring IOC容器无缝集成,从而可以获得Spring的优势。
关于DispatcherServlet的执行原理可以看这篇文章。
https://blog.csdn.net/jinnianshilongnian/article/details/84254470
其主要职责是调度工作,本身用于控制流程,具体为:

1.文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
2.通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
3.通过handlerAdapter支持多种类型的处理器(handlerExceptionChain中的处理器);
4.通过ViewResolver解析逻辑视图名到具体视图实现;
5.本地化解析;
6.渲染具体的视图等;
7.如果执行过程中遇到异常将交给handlerExceptionResolver来解析;

	<servlet>
       <servlet-name>spring</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring/applicationContext.xml</param-value>
       </init-param>
       <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
       <servlet-name>spring</servlet-name>
       <url-pattern>/</url-pattern>
    </servlet-mapping>

也就是说,web.xml中的加载顺序是:context-param -> listener -> filter > servlet;而同类型之间的加载顺序则是根据配置的顺序来进行加载的。所以我们配置的时候,需要注意下同类型标签的配置顺序;

完整的web.xml文件如下

web.xml的作用解析我参考的是这篇文章:
https://www.jianshu.com/p/c52776217bab

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
            http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
   <display-name>大众点评</display-name>
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring/root-context.xml</param-value>
   </context-param>
   
   <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>
   
   <filter>
      <filter-name>CharacterEncodingFilter</filter-name>
      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
         <param-name>encoding</param-name>
         <param-value>UTF-8</param-value>
      </init-param>
   </filter>
   <filter-mapping>
      <filter-name>CharacterEncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
   
   <filter>
      <filter-name>MultipartFilter</filter-name>
      <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
      <init-param>
         <param-name>multipartResolverBeanName</param-name>
         <param-value>multipartResolver</param-value>
      </init-param>
   </filter>
   <filter-mapping>
      <filter-name>MultipartFilter</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
   
   <filter>
      <filter-name>hiddenHttpMethodFilter</filter-name>
      <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
   </filter>
   <filter-mapping>
      <filter-name>hiddenHttpMethodFilter</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>

   <servlet>
      <servlet-name>spring</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:spring/applicationContext.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
      <servlet-name>spring</servlet-name>
      <url-pattern>/</url-pattern>
   </servlet-mapping>
   
   <jsp-config>
      <jsp-property-group>
         <url-pattern>*.jsp</url-pattern>
         <include-prelude>/WEB-INF/jsp/system/common.jsp</include-prelude>
      </jsp-property-group>
   </jsp-config>
</web-app>

一系列applicationContext配置文件

spring开发环境搭建环境搭建
因为spring的配置太多,我们这里分成好几个配置文件来进行配置,他们之间的关系是这样的。

  • applicationContext.xml
    • applicationContext-dao.xml
    • applicationContext-service.xml
    • applicationContext-web.xml

这里的配置文件被加载的流程是这样的。
1、applicationContext被web.xml中的下面代码加载
需要注意的是如果我们不像我这样显示的contextConfigLocation的值为classpath:spring/applicationContext.xml的话,系统是去查找默认值的

<servlet>
		<servlet-name>spring</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/applicationContext.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

2、applicationContext中代码如下

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	<!--使用通配符加载所有的properties配置文件-->
	<context:property-placeholder location="classpath:properties/*.properties"/>
	<!--加载所有的xml配置文件,大家可以发现我们为了统一xml配置文件都是applicationContext-xxx.xml这样的命名格式,就是为了能在这里用通配符一次匹配到所有的配置文件-->
	<import resource="applicationContext-*.xml"/>
</beans>

再次强调下<import resource="applicationContext-*.xml"/>加载所有的xml配置文件,大家可以发现我们为了统一xml配置文件都是applicationContext-xxx.xml这样的命名格式,就是为了能在这里用通配符一次匹配到所有的配置文件。

properties文件夹下面的配置文件和spring文件夹下的配置文件有什么差别

以properties下面的dao.properties文件为例:

dataSource.url=jdbc:mysql://127.0.0.1:3306/comment?useUnicode=true&characterEncoding=utf8
dataSource.username=root
dataSource.password=123456

很明显,dao.properties里面配置的是一些变量的值,applicationContext加载这些properties为后缀的配置文件是为了在applicationContext-dao.xml这些xml文件使用,比如applicationContext-dao.xml中有设置数据库相关信息的代码如下:

<property name="jdbcUrl" value="${dataSource.url}"/>
<property name="user" value="${dataSource.username}"/>
<property name="password" value="${dataSource.password}"/>

我们可以利用${dataSource.url}这样的语法引用被加载的dao.properties中的变量的值。
关于读取properties中的值我参考的这篇文章:
https://blog.csdn.net/HaHa_Sir/article/details/79105951

配置的源代码

spring开发环境搭建环境搭建

spring下的几个配置文件的源代码

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	<!---->
	<context:property-placeholder location="classpath:properties/*.properties"/>
	
	<import resource="applicationContext-*.xml"/>
</beans>

applicationContext-dao.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans  
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	<!-- 0、加载配置文件 -->
	<context:property-placeholder location="classpath:properties/dao.properties"/>
	<!-- 1、配置数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
		<property name="driverClass" value="com.mysql.jdbc.Driver"/>
		<property name="jdbcUrl" value="${dataSource.url}"/>
		<property name="user" value="${dataSource.username}"/>
		<property name="password" value="${dataSource.password}"/>
        <!-- 每60秒检查所有连接池中的空闲连接。Default: 0 -->
        <property name="idleConnectionTestPeriod" value="60" />
        <!-- 初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> 
		<property name="initialPoolSize" value="5" />
        <!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
        <property name="maxIdleTime" value="60" />
		<!-- 连接池中保留的最大连接数。Default: 15 -->
		<property name="maxPoolSize" value="10" />
		<!-- 连接池中保留的最小连接数。 -->
        <property name="minPoolSize" value="5" />
        <!-- JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 
  		属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。 
  		如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
  		<property name="maxStatements" value="100" />
		<!-- maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0  -->
		<property name="maxStatementsPerConnection" value="3" />
        <!-- 定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个显著提高测试速度。注意: 
  		测试的表必须在初始数据源的时候就存在。Default: null -->
  		<property name="preferredTestQuery" value="select 1" />
        <!-- 定义在从数据库获取新连接失败后重复尝试的次数。Default: 30-->
		<property name="acquireRetryAttempts" value="3" />
        <!-- 两次连接中间隔时间,单位毫秒。Default: 1000 -->
        <property name="acquireRetryDelay" value="1000" />
        <!-- 当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出 
  		SQLException,如设为0则无限期等待。单位毫秒。Default: 0 -->
  		<property name="checkoutTimeout" value="30000" />
    </bean>
    
    <!-- 2、配置sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<!-- 注入数据源 -->
    	<property name="dataSource" ref="dataSource"/>
    	<!-- 扫描mybatis核心配置文件 -->
    	<property name="configLocation" value="classpath:spring/mybatis.xml"/>
    	<!-- 扫描java bean,自动使用别名 -->
    	<property name="typeAliasesPackage" value="org.imooc.bean"/>
    	<!-- 扫描mybatis的SQL配置文件 -->
    	<property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>
    
    <!-- 3、扫描Dao接口包 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    	<property name="basePackage" value="org.imooc.dao"/>
    </bean>
</beans>

applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans  
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
	<!-- 扫描service包 -->
	<context:component-scan base-package="org.imooc.service" />
	<!-- 配置事务管理器 -->
	<bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
		<property name="dataSource" ref="dataSource"/>
	</bean>
	<!-- 事务采用全注解方式 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

applicationContext-task.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
	
	<!-- 扫描task包 -->
	<context:component-scan base-package="org.imooc.task"/>
	
	<!-- 启用定时任务 -->
	<task:scheduled-tasks>
		<task:scheduled ref="BusinessTask" method="synNumber" cron="10 */5 * * * ?"/>
		<task:scheduled ref="BusinessTask" method="synStar" cron="0 */5 * * * ?"/>
	</task:scheduled-tasks>
</beans>

applicationContext-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans  
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
	
	<!-- 开启注解映射的支持 -->
	<mvc:annotation-driven/>
	<!-- 允许对静态资源文件的访问 --> 
	<mvc:default-servlet-handler/>
	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/**"/>
			<mvc:exclude-mapping path="/login/**"/>
			<mvc:exclude-mapping path="/css/**"/>
			<mvc:exclude-mapping path="/js/**"/>
			<mvc:exclude-mapping path="/images/**"/>
			<mvc:exclude-mapping path="/api/**"/>
			<bean class="org.imooc.controller.interceptor.SessionInterceptor"/>
		</mvc:interceptor>
		
		
		<mvc:interceptor>
			<mvc:mapping path="/**"/>
			<mvc:exclude-mapping path="/index"/>
			<mvc:exclude-mapping path="/session"/>
			<mvc:exclude-mapping path="/session/menus"/>
			<mvc:exclude-mapping path="/login/**"/>
			<mvc:exclude-mapping path="/css/**"/>
			<mvc:exclude-mapping path="/js/**"/>
			<mvc:exclude-mapping path="/images/**"/>
			<mvc:exclude-mapping path="/api/**"/>
			<bean class="org.imooc.controller.interceptor.AuthInterceptor"/>
		</mvc:interceptor>
		
	</mvc:interceptors>
	<!-- 配置视图解析器 -->
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
		<property name="prefix" value="/WEB-INF/jsp"/>
		<property name="suffix" value=".jsp"/>
	</bean>
	
	<!-- 自动扫描的包名 -->
	<context:component-scan base-package="org.imooc.controller"/>
</beans>

mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<settings>
		<setting name="useGeneratedKeys" value="true"/>
		<setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>
	
	<!--<plugins>-->
		<!--<plugin interceptor="org.imooc.dao.interceptor.PageInterceptor"/>-->
	<!--</plugins>-->
</configuration>

root-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans  
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">


	<!-- 配置文件上传解析器 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
         <!-- 指定所上传文件的总大小不能超过20M。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 --> 
         <property name="maxUploadSize" value="20000000"/>
         <property name="defaultEncoding" value="utf-8"></property>
    </bean>
</beans>

properties文件夹下的配置文件的源代码

dao.properties

dataSource.url=jdbc:mysql://127.0.0.1:3306/comment?useUnicode=true&characterEncoding=utf8
dataSource.username=root
dataSource.password=123456

logback.properties

log.base=/Users/tuszer/logs/
log.level=DEBUG
log.appender.ref=stdout

system.properties

# 广告图片保存路径
adImage.savePath=G:/apache-tomcat-7.0.62/webapps/upload/ad/
# 广告图片访问URL
adImage.url=http://127.0.0.1:8081/upload/ad/
# 首页广告列表接口每页条数
ad.number=6
# 商户图片保存路径
businessImage.savePath=G:/apache-tomcat-7.0.62/webapps/upload/business/
# 商户图片访问URL
businessImage.url=http://127.0.0.1:8081/upload/business/
# 首页商户推荐列表每页条数
businessHome.number=5
# 商户搜索列表每页条数
businessSearch.number=7

resource下的logback.xml和system.properties的源代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
	<property resource="properties/logback.properties" />
	<!--控制台输出 -->
	<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method\(\):%L -%msg%n</pattern>
		</encoder>
	</appender>
	<!--文件输出 -->
	<appender name="logfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <Encoding>UTF-8</Encoding>
        <File>${log.base}comment.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${log.base}comment.%d{yyyy-MM-dd}.log.zip</FileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%date|%msg%n</pattern>
        </encoder>
    </appender>

    <root>
        <level value="${log.level}" />
        <appender-ref ref="${log.appender.ref}" />
    </root>
</configuration>

system.properties源代码

# 广告图片保存路径
adImage.savePath=D:\\apache-tomcat-7.0.62\\webapps\\upload\\ad\\
# 广告图片访问URL
adImage.url=http://127.0.0.1:8081/upload/ad/
# 首页广告列表接口每页条数
ad.number=6
# 商户图片保存路径
businessImage.savePath=D:\\apache-tomcat-7.0.62\\webapps\\upload\\business\\
# 商户图片访问URL
businessImage.url=http://127.0.0.1:8081/upload/business/
# 首页商户推荐列表每页条数
businessHome.number=5
# 商户搜索列表每页条数
businessSearch.number