这节主要记Spring和MVC框架的整合,其实把Spring整合struts2(这节记得是,也可以自行整合springmvc等),加上上节的Spring整合事务、上上节的Spring整合mybatis,就会发现不知不觉已经把SSM搞定了,重上了一遍大三???,如下图:

16.PNG

一、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 )

贴百科:
17.PNG

18.PNG

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中。

19.PNG

在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)做代码整合就行了:

20.PNG

二、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中配置)

执行成功日志:

21.PNG

四、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。这节的三中记录的简单项目整合就是对前面知识比较好的一个实践。


标题:Spring(8)
作者:jyl
地址:http://www.jinyunlong.xyz/articles/2021/12/21/1640056935482.html