这节主要记Spring和MVC框架的整合,其实把Spring整合struts2(这节记得是,也可以自行整合springmvc等),加上上节的Spring整合事务、上上节的Spring整合mybatis,就会发现不知不觉已经把SSM搞定了,重上了一遍大三???,如下图:
一、MVC框架的整合思想
1、搭建web环境
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--
https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.js
p-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.18</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-
context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.8</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
哎呦我去,真的多。
2、为什么要整合MVC框架
为了做javaweb的开发,整合MVC的话,分层开发(Controller控制层面间的组织,View负责数据以视图方式展现。Model负责对数据源的处理)更清晰吧。
1. MVC框架提供了控制器(Controller)调用Service
DAO ---》 Service
2. 请求响应的处理
3. 接受请求参数 request.getParameter("")
4. 控制程序的运行流程
5. 视图解析 (JSP JSON Freemarker Thyemeleaf )
贴百科:
3、Spring可以整合的MVC框架
1. struts1
2. webwork
3. jsf
4. struts2
5. springMVC
4、Spring整合MVC的核心思路
首先,需要创建工厂。不同于之前单元测试时非web方式创建工厂,整合MVC需要web方式创建工厂。代码:
ApplicationContext ctx = new
ClassPathXmlApplicationContext("/applicationContext.xml");
WebXmlApplicationContext()
同样,在web开发中也要保证工厂创建的唯一性和可复用性,只需要将工厂对象放到ServletContext这个全局唯一的上下文对象即可,他是全局应用程序共享对象。
这块理解的不太好,只知道Spring之后又封装了,直接调用就行,有疑问再去看看课或者看看ServletContext介绍及用法。
Spring封装了一个ContextLoaderListener,可以直接创建工厂并且储存在ServletContext中。
在web.xml中的实现方式
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- <param-value>classpath:applicationContext-*.xml</param-value>-->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
工厂创建完了就好办了,直接用Controller(Action)做代码整合就行了:
二、Spring整合Struts2
基于Controller层的整合了,首先还是引个Struts2的依赖:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.8</version>
</dependency>
还需要在web.xml配置两个属性节点才可以加载struts2框架:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
加上上面(一,4)记得工厂配置,在web.xml中对Spring整合Struts2的初始化配置就完成了。
Struts2知识拓展: [Struts2] 配置文件struts.xml和web.xml详解
测试在下面的SSM中记录。
三、Spring+Struts2+Mybatis整合(SSM)
二中Spring整合Struts2基于Controller,加上上节的事务,上上节的Mybatis,SSM的整合就完成了,而且可见IOC+AOP在整合过程随处可见。比如IOC对Mybatis配置的优化;对Service、Dao对象的依赖注入、AOP对事务的增加等。 现在就来个综合工程,看看效果(整合图在该篇文章开头):
引依赖,把一和二的依赖放一块就好啦。
需要引入的配置文件:
applicationContext.xml
struts.xml
log4j.properties
xxxxMapper.xml
初始化配置均在web.xml配置,在二中有记:
Spring (ContextLoaderListener —> Web.xml)
Struts2(Filter —> Web.xml)
DAO (Spring+Mybatis) 和 Service (Spring添加事务) 的代码不贴了,前两节有记,Controller (Spring+Struts2)。贴一下这三部分的代码开发思路:
DAO
1. 配置文件的配置
1. DataSource
2. SqlSessionFactory ----> SqlSessionFactoryBean
1. dataSource
2. typeAliasesPackage
3. mapperLocations
3. MapperScannerConfigur ---> DAO接口实现类
2. 编码
1. entity
2. table
3. DAO接口
4. 实现Mapper文件
Service
1. 原始对象 ---》 注入DAO
2. 额外功能 ---》 DataSourceTransactionManager ---> dataSource
3. 切入点 + 事务属性
@Transactional(propagation,readOnly...)
4. 组装切面
<tx:annotation-driven...
Controller
1. 开发控制器 implements Action 注入Service
2. Spring的配置文件
1. 注入 Service
2. scope = prototype
3. struts.xml
<action class="spring配置文件中action对应的id值"/>
Controller层代码:
package com.jin.action;
import com.jin.entity.User;
import com.jin.service.UserService;
import com.opensymphony.xwork2.Action;
/**
* @author jinyunlong
* @date 2021/12/20 16:04
* @profession ICBC锅炉房保安
*/
public class RegAction implements Action {
private UserService userService;
//<input type="text" name="user.name" />
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
@Override
public String execute() throws Exception {
// userService.register();
userService.register(user);
return Action.SUCCESS;
}
}
struts.xml文件配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="ssm" extends="struts-default">
<!-- url:reg.action-->
<action name="reg" class="regAction">
<result name="success">/regOk.jsp</result>
</action>
</package>
</struts>
感觉对应不上,那个regAction是什么东西,是工厂管理创建的对应对象,struts.xml中配置的class即为spring配置文件中action对应的id值:
<bean id="regAction" scope="prototype" class="com.jin.action.RegAction">
<property name="userService" ref="userService" />
</bean>
测试jsp:
<%@page pageEncoding="UTF-8" contentType="text/html;charset=utf-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<form method="post" action="${pageContext.request.contextPath}/reg.action">
UserName<input type="text" name="user.name" /><br/>
Password<input type="password" name="user.password" /></br>
<input type="submit" value="reg">
</form>
</body>
</html>
这就都对应上了,简单描述一下业务流程逻辑:访问jsp页面,输入用户名密码提交后,跳转至reg.action,实体对象获得值后,被service对象方法作为参数调用,service去调用dao层方法,找到对应mapper.xml,执行sql,并且满足事务特性后提交。操作成功完成后reg.action跳转至成功页面(struts.xml中配置)。
执行成功日志:
四、Spring开发过程中多配置文件的处理
两种方式,web.xml通配符方式和在配置文件里写import标签方式,但是无论用哪种,虽然是把不同模块的配置文件分开了,但是最后还是要整合到一块的。
通配符方式:
把配置文件按模块分开后,将web.xml中的
<param-value>classpath:applicationContext-*.xml</param-value>
改成这样即可(web环境)
非web环境:ApplicationContext ctx = new
ClassPathXmlApplicationContext("/applicationContext-*.xml");
import标签方式:
配置文件中写法
<import resource="applicationContext-dao.xml" />
<import resource="applicationContext-service.xml" />
<import resource="applicationContext-action.xml" />
无论web环境还是非web环境,写法不变,无感,比如web环境还这样:<param-value>classpath:applicationContext.xml</param-value>
五、总结
现在记录到Spring(8)了,我把SSM学完了,很惊诧自己大三那一年到底学了个啥,学了个寂寞。
总之在SSM的整合中,IOC、AOP、Mybatis、事务、Struts2等都有组合应用。个人理解,用SSM举例子的话,Spring服务S、M,M服务S,S作为MVC框架的综合体,在各环节都集成了Spring,在V中的DAO中使用持久层选型为M。这节的三中记录的简单项目整合就是对前面知识比较好的一个实践。