集成Spring和Spring MVC

创建了一个基本的 maven web项目,这一节要为这个项目集成Spring。

为了方便控制层的开发还会集成最流行的Spring MVC。集成Spring和Spring MVC的步骤如下。

集成spring和spirng mvc_spring

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

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

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

添加Spring依赖

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

添加Spring MVC依赖

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

<?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.shimpking</groupId>
    <artifactId>mybatis-03</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 清单管理   -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-framework-bom</artifactId>
                <version>4.3.10.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!--  spring上下文,核心      -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <!--  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>
        <!-- aop依赖       -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.5</version>
        </dependency>
        <!-- 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>
        <!--        -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>
        <!-- mybatis       -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.0.1</version>
        </dependency>
        <!-- mysql驱动       -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
    </dependencies>
</project>

添加Spring XML配置文件

在src/main/resources中新增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:component-scan base-package="com.shrimpking.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/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="mysql"/>
    </bean>
    <import resource="mybatis-servlet.xml"/>
</beans>

代码中的第一个component-scan用于配置Spring自动扫描类,通过base-package属性来设置要扫描的包名。包名支持Ant通配符,包名中的*匹配0或者任意数量的字符,这里的配置可以匹配如com.shirmpking.web.service.impl和com.shrimpking.simple.service.impl这样的包。

第二个bean配置了一个数据库连接池,使用了最基本的4项属性进行配置。

添加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:mvc="http://www.springframework.org/schema/mvc"
       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/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">

    <!--启用controller注解支持-->
    <mvc:annotation-driven/>
    <!-- 映射静态资源   -->
    <mvc:resources mapping="/static/**" location="static/"/>
    <!-- 包扫描   -->
    <context:component-scan base-package="com.shrimpking.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/view/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

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

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

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

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

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

配置web.xml

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

这个配置用于在Web容器启动时根据contextConfigLocation配置的路径读取Spring的配置文件,然后启动Spring。针对Spring MVC,需要增加如下配置。

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

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--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>

    <servlet>
        <servlet-name>mybtis</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>mybtis</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <filter>
        <filter-name>springEncoding</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>springEncoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

增加一个简单的Controller示例

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

package com.shrimpking.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.Date;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Shrimpking
 * @create 2023/6/11 21:43
 */
@Controller
public class IndexController
{
    @RequestMapping("/index")
    public ModelAndView dicts()
    {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("now",new Date());
        modelAndView.setViewName("index");
        return modelAndView;
    }
}

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

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%--
  Created by IntelliJ IDEA.
  User: user1
  Date: 2023/6/11
  Time: 21:33
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <p>
    Hello spring mvc!
  </p>
  <p>
    服务器时间:<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/>
  </p>
  </body>
</html>

经过以上这么多步的操作后,基本的Spring和Spring MVC就集成完了。

重启Tomcat然后访问地址http://localhost:8089/index,浏览器就会显示如下内容。

Hello Spring MVC!

集成spring和spirng mvc_spring_02