集成Spring和Spring MVC
经过上一节的学习,我们已经创建了一个基本的 Web 项目,这一节要为这个项目集成 Spring。为了方便控制层的开发还会集成最流行的 Spring MVC。集成 Spring 和 Spring MVC 的步骤如下。
-
添加 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 的版本。
-
添加 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 时的常用依赖,各个依赖的作用可以参考注释内容。
-
添加 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 时需要使用的依赖。
-
添加 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 项属性进行配置。
-
添加 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 文件。
-
-
配置 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>
-
增加一个简单的 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