千家信息网

如何用源码分析Struts2请求处理及过程

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,这期内容当中小编将会给大家带来有关如何用源码分析Struts2请求处理及过程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.1 Struts2请求处理1. 一个请
千家信息网最后更新 2025年01月31日如何用源码分析Struts2请求处理及过程

这期内容当中小编将会给大家带来有关如何用源码分析Struts2请求处理及过程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

1.1 Struts2请求处理

1. 一个请求在Struts2框架中的处理步骤:

a) 客户端初始化一个指向Servlet容器的请求;

b) 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助(SiteMesh Plugin),主要清理当前线程的ActionContext和Dispatcher;

c) 请求经过插件过滤器,如:SiteMesh、etc等过滤器;

d) 请求经过核心过滤器FilterDispatcher,执行doFilter方法,在该方法中,询问ActionMapper来决定这个请求是否需要调用某个Action;

e) 如果ActionMapper决定需要调用某个Action,则ActionMapper会返回一个ActionMapping实例(存储Action的配置信息),并创建ActionProxy(Action代理)对象,将请求交给代理对象继续处理;

f) ActionProxy对象根据ActionMapping和Configuration Manager询问框架的配置文件,找到需要调用的Action类;

g) ActionProxy对象创建时,会同时创建一个ActionInvocation的实例;

h) ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用;

i) 一旦Action执行完毕,ActionInvocation实例负责根据struts.xml中的配置创建并返回Result。Result通常是一个需要被表示的JSP或者FreeMarker的模版,也可能是另外的一个Action链;

j) 如果要在返回Result之前做些什么,可以实现PreResultListener接口,PreResultListener可以在Interceptor中实现,也可以在Action中实现;

k) 根据Result对象信息,生成用户响应信息response,在生成响应过程中可以使用Struts2 框架中继承的标签,在此过程中仍会再次涉及到ActionMapper;

2. Struts2请求处理示意图:

1.2 Struts2请求处理源码分析

当用户向Struts2发送请求时,FilterDispatcher的doFilter()方法自动调用,doFilter()方法处理请求过程,如下:

1. 创建值栈对象stack;

2. 创建Action上下文对象;

3. 对请求进行重新封装,此次封装根据请求内容的类型不同,返回不同的对象:

如果为multipart/form-data类型,则返回MultiPartRequestWrapper类型的对象,该对象服务于文件上传,否则返回StrutsRequestWrapper类型的对象,MultiPartRequestWrapper是StrutsRequestWrapper的子类,而这两个类都是HttpServletRequest接口的实现。

4. 通过actionMapper.getMapping()获得ActionMapping对象,Action的配置信息存储在ActionMapping对象中(Action的配置信息:Action的name、namespace和要调用的方法method)。相关代码如下图所示:

以上代码,活动图如下:

5. 如果getMapping()方法返回ActionMapping对象为null,则FilterDispatcher认为用户请求不是Action,此时FilterDispatcher会首先分析:

如果请求以/struts开头,会自动查找在web.xml文件中配置的packages初始化参数,FilterDispatcher会将packages参数值包下的文件当作静态资源处理,即直接在页面上显示文件内容。

如果用户请求的资源不是以/struts开头—可能是.jsp文件,也可能是.html文件,则通过过滤器链继续往下传送,直到到达请求的资源为止。

6. 如果getMapping()方法返回有效的ActionMapping对象,则被认为正在请求某个Action,将调用Dispatcher.serviceAction(request, response, servletContext, mapping)方法。

以上六步,相关代码如下图所示:

以上代码,活动图如下:

7. 请求进入dispatcher.serviceAction(request,response,servletContext,mapping)方法中:

a) 将相关对象信息封装为Map(如:HttpServletRequest、Http parameters、HttpServletResponse、HttpSession、ServletContext、ActionMapping等对象信息),并存入到执行上下文Map中,返回执行上下文Map对象extraMap;

b) 获取mapping对象中存储的action命名空间、name属性、method属性等信息;

c) 加载并解析Struts2配置文件,如果没有人为配置,默认按顺序加载struts-default.xml、struts-plugin.xml、struts.xml,将action配置、result配置、interceptor配置,解析并存入至config对象中,返回文件配置对象config;

d) 根据执行上下文Map、action命名空间、name属性、method属性等创建用户Action的代理对象;

e) 执行Action代理对象proxy.execute()方法,并转向结果;

以上步骤相关代码,如图所示:

8. 执行Action代理对象proxy.execute()方法,该方法的执行,其实就是调用了invocation.invoke()方法,如下图所示:

9. 执行invocation.invoke()方法,实现了截拦器的递归调用和执行Action的execute()方法,DefaultActionInvocation.invoke()方法中代码,如下图所示:

在以上代码中,并未看出拦截器的递归调用,其实是否递归调用,是由程序员来控制的,递归调用实现很简单:

a) 首先看下Interceptor接口定义:

b) 所有的截拦器必须实现intercept方法,而该方法的参数恰恰又是ActionInvocation,所以如果在intercept方法中调用invocation.invoke(),则会继续从Action的Intercepor列表中找到下一个截拦器执行,依此递归调用Intercepor;

Struts2中的日志拦截器LoggingInterceptor,如下图所示:

c) 拦截器递归调用活动图,如下所示:

10. 在invocation.invoke()方法中,执行拦截器、action并获得resultCode完毕后,则会继续执行PreResultListener集合,并生成Result对象,实现PreResultListener接口,可在返回Result之前,做些自定义处理,如图所示

在返回Result之前,通过PreResultListener实现自定义处理,常用的有两种方式:一种在Interceptor中实现,一种在Action实现,如图所示:

以上两种方式,大家可以发现都是通过匿名内部类的方式实现,其实还有一种方式就是通过在拦截器中实现PreResultListener接口,并实现方法beforeResult方法,即可。如下图所示:

11. ***,通过生成Result完成用户响应;

以上1-11步,为Struts2处理请求的完整流程分析,其相关代码调用流程,如下图所示:

上述就是小编为大家分享的如何用源码分析Struts2请求处理及过程了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

对象 方法 配置 处理 文件 信息 分析 代码 过滤器 过程 用户 拦截器 递归 接口 代理 上下 上下文 内容 实例 属性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全的叙述正确的是 戴尔服务器可以带独立显卡吗 互联网金融科技委员会筹备 70怀旧服那个服务器火 重庆服务管理软件开发公司 金蝶软件开发课程 网络安全保卫大队先进事迹 日本自卫队网络安全发展 临沂千盈网络技术有限公司 硬盘接口用于高端服务器 php数据库图片 英籍华为网络安全主管 软件开发9001程序文件 微信小程序访问云数据库 服务器扩展硬盘需要重装系统吗 干软件开发能干到多少年龄 安徽运营软件开发哪个好 抖音服务器怎么储存视频的 固始城市生活网络技术服务 多商家数据库设计 防网络安全立体字 百货公司消费积分系统软件开发 服务器安全防护合同 学网络安全必关注的公众号 亿赛通数据库安全 湖北多功能软件开发定制价格 水务行业服务器安全加固系统厂家 区委网络安全和信息化委员会綦江 实施网络安全的什么工程 北京智能边缘计算服务器
0