集成Spring和Spring MVC

经过上一节的学习,我们已经创建了一个基本的 Web 项目,这一节要为这个项目集成 Spring。为了方便控制层的开发还会集成最流行的 Spring MVC。集成 Spring 和 Spring MVC 的步骤如下。

  1. 添加 Spring 项目清单用于管理 Spring 依赖

    在 pom.xml 文件中的 dependencies 后面添加如下配置。

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-framework-bom</artifactId>
                <version>4.3.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    spring-framework-bom 是 Spring 的一个项目清单文件,由于集成 Spring 时需要添加很多 Spring 组件的依赖,为了避免使用不同版本的组件导致意外情况发生,可以使用 spring-framework-bom。添加 spring-framework-bom 后,在使用 Spring 依赖时就不需要再配置每个依赖的版本号了,Spring 组件的版本由 spring-framework-bom 统一管理。这不仅可以避免版本混乱引起的问题,还可以很方便地升级 Spring 的版本。

  2. 添加 Spring 依赖

    在 pom.xml 文件的 dependencies 中添加如下依赖。

    <!--Spring 上下文,核心依赖-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <!--Spring JDBC-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
    </dependency>
    <!--Spring 事务-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
    </dependency>
    <!--Spring 面向切面编程-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
    </dependency>
    <!--spring-aop 依赖-->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.2</version>
    </dependency>

    上面这些依赖是集成 Spring 时的常用依赖,各个依赖的作用可以参考注释内容。

  3. 添加 Spring MVC 依赖

    在 pom.xml 文件的 dependencies 中添加如下依赖。

    <!--Spring Web 核心-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
    </dependency>
    <!--Spring MVC-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
    </dependency>
    <!--spring mvc-json依赖-->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.4</version>
    </dependency>

    前两个依赖为 Spring MVC 必备的依赖,后面的 jackson-databind 是 Spring MVC 转换为 JSON 时需要使用的依赖。

  4. 添加 Spring XML 配置文件

    在 src/main/resources 中新增 applicationContext.xml 文件,内容如下。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           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/aop
           http://www.springframework.org/schema/aop/spring-aop.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd">
    
        <context:component-scan base-package="tk.mybatis.*.service.impl"/>
    
        <bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
            <property name="username" value="root"/>
            <property name="password" value=""/>
        </bean>
    </beans>

    代码中的第一个 component-scan 用于配置 Spring 自动扫描类,通过 base-package 属性来设置要扫描的包名。包名支持 Ant 通配符,包名中的 * 匹配 0 或者任意数量的字符,这里的配置可以匹配如 tk.mybatis.web.service.impl 和 tk.mybatis.simple.service.impl 这样的包。第二个 bean 配置了一个数据库连接池,使用了最基本的 4 项属性进行配置。

  5. 添加 Spring MVC 的配置文件

    在 src/main/resources 中新增 mybatis-servlet.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/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
    
        <mvc:annotation-driven/>
    
        <mvc:resources mapping="/static/**" location="static/"/>
    
        <context:component-scan base-package="tk.mybatis.*.controller"/>
    
        <bean 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>
    
    </beans>

    这是一个最简单的配置,各项配置简单说明如下。

    • mvc:annotation-driven 启用 Controller 注解支持。

    • mvc:resources 配置了一个简单的静态资源映射规则。

    • context:component-scan 扫描 controller 包下的类。

    • InternalResourceViewResolver 将视图名映射为 URL 文件。

  6. 配置 web.xml

    集成 Spring 和 Spring MVC 后,需要在 web.xml 中进行相应的配置。对于 Spring 来说,需要增加如下配置。

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    这个配置用于在 Web 容器启动时根据 contextConfigLocation 配置的路径读取 Spring 的配置文件,然后启动 Spring。

    针对 Spring MVC,需要增加如下配置。

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

    为了避免编码不一致,通常还需要增加如下的编码过滤器配置。

    <filter>
        <filter-name>SpringEncodingFilter</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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>SpringEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  7. 增加一个简单的 Controller 示例

将 index.jsp 移动到 src/main/webapp/WEB-INF/jsp 目录中。增加 tk.mybatis.web.controller 包,然后新建 IndexController 类,该类代码如下。

@Controller
public class IndexController {
    @RequestMapping(value = {"", "/index"})
    public ModelAndView dicts() {
        ModelAndView mv = new ModelAndView("index");
        mv.addObject("now", new Date());
        return mv;
    }
}

再对 index.jsp 页面中的 body 部分做如下修改。

<p>
    Hello Spring MVC!
</p>
<p>
    服务器时间:<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/>
</p>

经过以上这么多步的操作后,基本的 Spring 和 Spring MVC 就集成完了。重启 Tomcat 然后访问地址 http://localhost:8080/mybatis-spring ,浏览器就会显示如下内容。

Hello Spring MVC!
服务器时间:2017-02-07 22:44:58