Spring+Struts2项目框架梳理

若基于Spring+Struts2的方式进行开发,前后端的交互逻辑会与boot系以及MCV的组织结构有所不同

这里是对于学习过程的一些记录

前置通用知识

Struts2框架资料

Struts2基础篇之基本概念

Java之struts2框架学习

一般情况的Spring前后端调试流程

要理解基于Spring开发的系统中前后端数据流,可以按照以下步骤进行:

1. 前端操作与浏览器调试

  • 打开浏览器调试工具:在浏览器中打开你要调试的网页(例如账户查询页面)。按下 F12(或右键点击页面,选择“检查”)打开浏览器的开发者工具。
  • 切换到网络(Network)标签:在开发者工具中,切换到“网络”(Network)选项卡。这一部分会显示所有的网络请求,包括AJAX请求、资源加载等。
  • 执行查询操作:在前端页面上执行“账户查询”的操作。例如,输入查询条件,然后点击“查询”按钮。
  • 观察请求:在“网络”标签中,你会看到一个新的网络请求被发出。这个请求通常是一个HTTP请求,类型可能是GET或POST。

2. 分析网络请求

  • 请求URL:点击请求,可以查看详细信息,包括请求的URL、请求方法(GET或POST)、请求头、请求体(如果是POST请求)。
  • 请求参数:如果是GET请求,请求参数通常会出现在URL中;如果是POST请求,参数会在请求体中。你可以看到前端是如何将用户输入的数据发送给后端的。
  • 查看响应:同样在这个请求的详细信息中,可以看到服务器返回的响应数据。通常会是JSON、XML等格式的数据。这个数据就是后端处理请求后的结果,前端将其拿到后再渲染到页面上。

3. 后端调试

  • 找到对应的后端控制器:根据请求的URL,你可以在Spring项目中找到对应的控制器(通常是带有@Controller@RestController注解的类)。例如,如果请求的URL是/api/accounts,你可以在项目中搜索这个路径,找到对应的方法。
  • 跟踪后端处理流程:在控制器的方法中,可以看到如何接收请求参数、调用服务层(Service层)处理业务逻辑,最终返回数据。
  • 日志输出:你可以通过在后端代码中添加日志来调试,记录请求的接收、处理过程,以及最终返回的数据。

4. 结合前后端数据流

  • 前端发送请求:通过观察浏览器中的网络请求,了解前端是如何将用户输入的数据发送到后端的。
  • 后端处理请求并返回响应:通过分析后端代码,理解请求是如何在后端处理的,以及如何将处理结果返回给前端。
  • 前端接收并处理响应:最后,回到浏览器,看看前端如何接收并处理从后端返回的数据,将其显示在用户界面上。

actionmap.xml文件

在Spring与Struts2结合使用的项目中,actionmap.xml文件通常用于配置Struts框架中的Action映射。

actionmap.xml的作用

  • Action映射配置actionmap.xml文件中定义了Struts的Action映射,将特定的URL路径映射到某个Action类的某个方法上。Action类是Struts框架中的核心组件,它负责处理用户请求、调用业务逻辑并返回相应的视图。
  • 路径到Action的映射:当前端发起请求时,Struts根据URL路径在actionmap.xml中查找对应的Action映射,然后调用配置的Action类中的相应方法。

查找前端调用后端的具体路径或流程

  • 浏览器查看请求URL:首先,通过浏览器的调试工具(如Network标签)查看前端页面发出的请求URL。这个URL通常会与actionmap.xml中配置的路径匹配。
  • 定位Action映射:根据浏览器中的请求URL,打开actionmap.xml文件,找到与该URL匹配的Action映射条目。这个条目会告诉你对应的Action类和方法。
  • 查找Action类:在项目中找到这个Action类。Action类通常会继承自ActionSupport或者实现Action接口。在类中查找对应的方法,这个方法会处理请求并返回结果。
  • 跟踪业务逻辑:在Action类的方法中,通常会调用Service层或业务逻辑类来处理请求。你可以跟踪这些调用,理解业务处理的细节。
  • 返回视图或数据:Action类处理完业务逻辑后,通常会返回一个视图名称或者直接返回数据(例如JSON格式),这部分可以通过Action的返回值或配置的Result类型来确认。

前后端调用流程的总结

  1. 前端发起请求:用户在前端界面上进行操作(如点击按钮),前端代码发送HTTP请求。
  2. 请求映射到Action:Struts框架根据actionmap.xml中的配置,将请求路径映射到对应的Action类和方法。
  3. Action类处理请求:Action类中的方法处理前端的请求,通常会调用业务逻辑或Service层。
  4. 返回结果:处理完请求后,Action类返回结果,可能是一个视图名称,也可能是直接的数据响应(如JSON),前端接收到结果并展示给用户。

什么是Action?

Action是一个核心概念,用于处理用户请求、执行相应的业务逻辑,并返回处理结果。具体来说:

Action的角色和作用

  • 请求处理Action类负责处理来自用户的请求。每次用户在前端进行操作(例如提交表单、点击按钮)时,产生的请求会通过Struts框架路由到相应的Action类。
  • 业务逻辑执行Action类会调用业务层或服务层来执行具体的业务逻辑。这可能包括数据验证、数据库操作、调用外部API等。
  • 结果返回:处理完请求后,Action类会返回一个结果,这个结果通常是一个视图名称(例如JSP页面)或数据(如JSON格式的响应),Struts框架根据这个结果决定接下来要显示的页面或要返回的数据。

Action的工作流程

  1. 请求到达Struts框架:用户在浏览器中发起一个请求(如提交表单)。
  2. 映射到Action:Struts根据配置文件(如actionmap.xml)中的URL映射,将请求路由到相应的Action类。
  3. 执行Action逻辑:Struts调用Action类的execute()方法或其他指定方法,执行业务逻辑。
  4. 返回处理结果Action方法返回一个字符串,指示框架接下来应该导航到的视图页面或响应数据。

配置Action

在Struts中,Action类的映射通常在配置文件中进行。你可以在actionmap.xmlstruts-config.xml中看到类似如下的配置:

<action path="/login"
type="com.example.LoginAction"
name="loginForm"
scope="request"
validate="true"
input="/login.jsp">
<forward name="success" path="/home.jsp"/>
<forward name="failure" path="/login.jsp"/>
</action>
  • path:URL路径,当请求这个路径时,调用LoginAction类。
  • type:具体的Action类。
  • forward:处理完请求后,决定跳转到哪个视图。

Action与路由

Struts中的Action在某种程度上类似于Spring Boot中的路由,但两者在实现方式和应用场景上有所不同。

  • Struts中的Action 负责处理请求,并通过配置文件与URL路径进行映射。
  • Spring Boot中的路由 则更像是通过注解驱动的请求处理方式,简化了开发过程,并且更灵活。

什么是Filter?

在Struts 2中,Filter是一个用于拦截和处理HTTP请求的组件。Struts 2通过Filter来处理进入应用程序的所有请求,并将这些请求分发给相应的ActionFilter在Struts 2中起到了一个重要的桥梁作用,它将请求的预处理和后处理与业务逻辑的实现分离开来。

Struts 2中的Filter概述

  • 核心FilterStrutsPrepareAndExecuteFilter

    • 在Struts 2中,StrutsPrepareAndExecuteFilter是最常用的过滤器。它是一个Servlet过滤器,负责拦截所有的HTTP请求,并将这些请求交由Struts 2框架进行处理。
    • StrutsPrepareAndExecuteFilter的主要功能包括:预处理请求、执行对应的Action、处理返回的结果、以及在整个请求处理流程结束后进行清理工作。

Filter工作流程

  1. 请求拦截

    • 当一个HTTP请求到达服务器时,StrutsPrepareAndExecuteFilter会首先拦截这个请求。它拦截所有与应用程序相关的请求,通常是通过URL模式进行配置的(如/*)。
  2. 请求准备
    • StrutsPrepareAndExecuteFilter会对请求进行预处理,例如设置请求的字符编码、处理文件上传等。此外,它还会确定哪个Action类应该处理这个请求,并将请求参数映射到相应的Action类的属性中。
  3. 执行Action
    • 预处理完成后,StrutsPrepareAndExecuteFilter会将请求交给框架的核心组件,找到对应的Action类并执行其中的业务逻辑。
  4. 结果处理
    • Action类处理完业务逻辑后,会返回一个结果(通常是视图名称)。StrutsPrepareAndExecuteFilter会根据返回的结果,决定接下来要显示的页面或数据。
  5. 请求后处理
    • 在整个请求处理流程结束后,StrutsPrepareAndExecuteFilter还负责执行一些清理操作,如释放资源、清理线程本地变量等。

如何配置Filter

在Struts 2中,Filter通常在web.xml中进行配置。配置StrutsPrepareAndExecuteFilter时,可以指定哪些请求需要由Struts 2框架处理。

web.xml中的配置示例

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter> <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern> <!-- 拦截所有请求 -->
</filter-mapping>

自定义Filter

除了StrutsPrepareAndExecuteFilter,开发者还可以自定义Filter,来实现特定的请求拦截和处理需求。自定义Filter可以用于实现如认证、日志记录、数据压缩等功能。

自定义Filter示例

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; public class CustomFilter implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化过滤器
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response; // 执行过滤逻辑,例如检查请求头
System.out.println("Request URI: " + httpRequest.getRequestURI()); // 继续处理请求
chain.doFilter(request, response);
} @Override
public void destroy() {
// 清理资源
}
}

web.xml中配置自定义Filter

<filter>
<filter-name>customFilter</filter-name>
<filter-class>com.example.CustomFilter</filter-class>
</filter> <filter-mapping>
<filter-name>customFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- 拦截所有请求 -->
</filter-mapping>

新增一个action?

想法

新增一个action,让现有的查询在特定情况下出发该action

在哪个位置新增?前端去调用后端的action是通过URL实现的,那么现在有两种方式去“新增”一个action

1、在拦截器拦截到/web/Xx1Action时,直接修改为/web/Xx2Action,然后后续去走Xx2Action的逻辑

2、在前端调用Xx1Action后,在后端判断由前端传入的特定参数,然后跳转执行Xx2Action的逻辑

在不新增对应前端按钮的情况下,第一种方式的灵活性似乎更大,因为无需破坏现有的Xx1Action逻辑,当前端添加好按钮之后也可以比较方便的迁移过去

计划

玩家查询 为测试入口(/web/PlayerInfoLogAction)进行两种尝试:

1、若当前的actionName为"PlayerInfoLogAction",那么将其替换为"TestInfoLogAction"

从ActionFilter改起,当actionName=PlayerInfoLogAction时,将其赋值为"TestInfoLogAction"

此时会去actionPool里面找这玩意

我的理解是:在player_web_actionMap.xml中添加自定义action事件,并在对应位置新建该action的实现代码以及facade方法即可

2、当前端输入的账号为“xixi”是,检测到该参数后"PlayerInfoLogAction"要做对应的处理

尝试1:新增TestInfoLogAction并跳转执行

步骤一:配置actionmap文件以及注册bean

新增action或者接口时,首先要想的是对其进行约定(或者说“声明”)【即:约定大于配置】

约定新的action

因为我们新增了一个action,那么需要有一个文件对其进行“路由”

前面也提到了,这个文件就是player_web_actionMap.xml

domains\player_web_actionMap.xml中声明一个新的action:TestInfoLogAction

<Action actionName="TestInfoLogAction" className="com.xxb.xxxl.web.action.TestInfoLog.TestInfoLogAction" facadeName="TestInfoQueryFacade" concurrencyInitNum="2" concurrencyMaxNum="13"/>

这里主要规定了下面几件事:

1、新增action的名字(actionName)

2、action具体的实现代码位置(className)

3、action对应的facade方法(facadeName)

约定新的对应接口

新增的action一定有对应的facade方法,这些方法会去进一步调用后端的接口与实现代码

因此实际上我们还会新增对应的接口,这些接口需要以bean的形式被spring管理

因此这里也需要进行约定,在evs_service\src\main\resources\player_service_appContext.xml

这里要将facade方法(及其实例化的对象)和后端接口服务(及其实例化的对象)进行约定

【参考其他接口的约定写法即可】

步骤二:创建对应文件

首先要初始化过滤器,并装载action

-->修改tomcat目录下的actionmap配置文件

过滤器首先会去调用具体action的实现代码中的doSometings()

-->创建TestInfoLogAction.java

该文件中的doSometings()又会调用facade方法

-->创建TestInfoQueryFacade.java

Facade方法需要继承BaseFacade,其中的某些方法需要调用TestInfoQuery的具体实现

-->配置player_service_appContext.xml,将Facade方法加入bean容器中统一管理

-->创建TestInfoQueryService接口类,及其对应的实现类TestInfoQueryServiceImpl.java

步骤三:拦截器跳转

首先加入判断,当前端请求的action为PlayerInfoLogAction时,将actionName替换为TestInfoLogAction

步骤四:填充业务逻辑代码

再次明确一下想要干的事情:TestInfoLogAction也是去查询账户数据,但是查询的玩家名称为 xixi 时,返回数据均替换为XxxX

调用关系:doSometings()-->this.query()【facade方法】-->TestInfoLogActionService【后端接口】

【防忘笔记】Spring+Struts2古董框架学习的更多相关文章

  1. spring+struts2+ibatis 框架整合以及解析

    一. spring+struts2+ibatis 框架 搭建教程 参考:http://biancheng.dnbcw.net/linux/394565.html 二.分层 1.dao: 数据访问层(增 ...

  2. spring struts2 ibatis 框架结构图

    spring struts2 ibatis 框架结构图

  3. Struts2 校验框架学习笔记

    Struts2 校验框架 Struts2 和Struts1同样也提供了校验框架,但在Struts2 已经不再把校验框架做为一个插件,而是已经内置到了Struts2中,而且配置起来更为简单方便,功能也更 ...

  4. 简单Spring+Struts2+Hibernate框架搭建

    使用Maven+Spring+Struts2+Hibernate整合 pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0&q ...

  5. spring+struts2+hibernate框架搭建(Maven工程)

    搭建Spring 1.porm.xml中添加jar包 <!-- spring3 --> <dependency> <groupId>org.springframew ...

  6. spring batch批处理框架学习

    内如主要来自以下链接: http://www.importnew.com/26177.html http://www.infoq.com/cn/articles/analysis-of-large-d ...

  7. [Spring+SpringMVC+Mybatis]框架学习笔记(六):事务

    第7讲 事务 7.1 事务的概念 事务是一系列作为一个逻辑单元来执行的操作集合. 它是数据库维护数据一致性的单位,它讲数据库从一个一致状态,转变为新的另外一个一致状态.说的简单一点就是:如果一组处理步 ...

  8. Spring+Struts2+Mybatis框架搭建时的常见典型问题

    搭建SSM框架时,总是遇到这样那样的问题,有的一眼就能看出来,有的需要经验的积累.现将自己搭建SSM框架时遇到的典型问题总结如下: 一.Struts2框架下的action中无法使用@Autowired ...

  9. Spring+Struts2+Hibernate框架整合流程

    一:基本步骤 新建Maven项目,导入相关依赖(推荐) 在WEB-INF的web.xml中进行配置 ————–Hibernate配置 —————- 创建entity包,创建数据库相关实体类 根据实体类 ...

  10. Spring+Struts2+Hibernate框架搭建

    SSH框架版本:Struts-2.3.30  +  Spring-4.2.2  +  Hibernate5.2.2 下图是所需要的Jar包: 下面是项目的结构图: 1.web.xml <?xml ...

随机推荐

  1. xpath-猪八戒网服务商名称爬取

    import requests from lxml import etree url = 'https://changsha.zbj.com/xcxkfzbjzbj/f.html?fr=zbj.sy. ...

  2. bs4解析-优美图库

    import requests from bs4 import BeautifulSoup url = 'http://www.umeituku.com/bizhitupian/meinvbizhi/ ...

  3. NXP i.MX 6ULL工业开发板硬件说明书( ARM Cortex-A7,主频792MHz)

    前  言 本文档主要介绍TLIMX6U-EVM评估板硬件接口资源以及设计注意事项等内容. 创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理 ...

  4. P7687 题解

    考场上数组开大了直接 MLE 了,气. 考虑把 A,B 两种服务分开算,一个边双连通分量内的点如过有一个有服务,那么整个联通分量就都有服务. 然后按边双联通分量缩点后原图变成树,一条边是关键路线当且仅 ...

  5. dubbo面试题及答案

    Dubbo是什么? Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目. 面试官问你如果这个都不清楚,那下面的就没必要问了. 官网:ht ...

  6. h5使用js拉起微信支付

    近期,业务需求对接了微信支付,做个总结.web网页想要拉起微信支付,有两种方法: H5下单支付 , JSAPI支付 .首先纯前端做不了微信支付,必须配合后端才能通过微信的下单请求.接下来说说这两种方法 ...

  7. Jingle Bio:产品出海的最重要一课是「重营销轻技术」?

    名字: Jingle Bio 开发者 / 团队: Luo Baishun 平台: Web 请简要介绍下这款产品 Jingle Bio 是一款不需要任何编程基础就可以轻松驾驭的个人网站制作工具,你可以使 ...

  8. oeasy教您玩转vim - 70 - # 折叠细节

    ​ 折叠细节 回忆上次 上次我们讲的是折叠 折叠有很多options foldlevel - 显示折叠层次 foldcolumn - 折叠树宽度 foldmethod - 折叠方式 manual - ...

  9. SQL Server AdventureWorks示例数据库

    SQL Server AdventureWorks2008R2 数据字典 AdventureWorks2008R2示例数据库下载 AdventureWorks2008R2数据字典(官网) Addres ...

  10. JavaScript一天一个算法题~持续更新中。。。。。

    1,数组去重 i.暴力去重 思路:建一个空数组,通过判断原数组的元素是否在空数组内,如果在,不放入,不在,放入空数组. function clearCommnetArray(array){ let a ...