学习笔记之Struts2—工作原理图
本文以Struts2的官方工作原理图作为主线讲解(参考部分书籍与视频)

1.初始概念
struts2是web.xml进行配置的一个过滤器,当web项目启动的时候,这个过滤器就会生效。
2.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>zzh</display-name> <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> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
在这个web.xml里面配置了一个名为Struts2的过滤器,过滤的路径(<url-pattern>)为*,它代表所有的东西。当用户请求时,都会经过这个过滤器,但是他只过滤与自己相关的请求,比如后缀为.action之类的,但是如果是一个.html或者.jsp,便不会处理,直接放行.
3.控制器的名称
在这个web.xml中名称为StrutsPrepareAndExecuteFilter。而在Struts工作原理图中是FilterDispatcher。这主要是版本2.1.2之前与之后的不同所致。
4.(1)解析Struts工作原理图
首先用户是通过HttpServletRequest用户请求发送过来,接着经历一系列的核心过滤器,比如ActionContextCleanUp过滤器,他不是必选的,主要用于与其他的框架(SiteMesh)进行集成。然后到FilterDispatcher,它是Struts2的一个调度中心,不过到了版本2.1.3开始,就被StrutsPrepareAndExecuteFilter取代。其主要原因是,好比我们想写一个过滤器,便会把它放在Struts过滤器的顶端。但是。当我们需要在Struts拦截之后再去写过滤器,也就是说在执行action(ActinoInvocation)之前去写过滤器,通过FilterDispatcher是做不到的。而在最新的版本StrutsPrepareAndExecuteFilter就可以做到执行Action之前添加我们自己的过滤器,它分为两种,一种是Prepare的Filter,一种是Execute的Filter。可以在准备和执行之间把自己的Filter添加进去。
当用户请求经过一系列的过滤器后,控制器调用ActionMapper,只有后缀是.action的才会到达这里。查找当前请求有没有一个指定的action,如果有则返回一个收集了Action详细信息的ActionMapping对象。StrutsPrepareAndExecuteFilter控制器接收到之后将控制权委派给ActionProxy,ActionProxy代理负责调用管理器(ConfigurationManager)去读struts.xml的配置信息来找到具体的Action类,然后再通过ActionProxy创建ActionInvocation对象。
4.(2)解析Struts工作原理图
ActionInvocation被创建之后,他在调用Action之前会依次调用所有配置的拦截器,当ActionInvocation的invoke()方法被调用时,开始执行Action配置的第一个拦截器,ActionInvocation负责跟踪执行过程的状态,并把控制权通过Intercept()方法交给合适的的拦截器。拦截器的执行过程就是递归调用invoke()实现的,在调用完所有拦截器后执行Action。接着ActionInvocation负责查找Action执行返回的结果字符串(如success,input)对应的Result。然后执行这个Result。通常情况下Result都会调用一些Template(模板)如(jsp)来呈现页面。最后,拦截器会再次被执行,顺序与Action执行之前相反,然后通过HttpServletResponse返回给web.xml中的那些过滤器。
5.小结
实际上,ActionInvocation的处理过程就是Struts2处理请求的过程.如果你觉得对你有帮助的话,请麻烦点赞或关注我,谢谢观看!
学习笔记之Struts2—工作原理图的更多相关文章
- struts2学习笔记2 -struts2的开发步骤和工作原理
struts2的开发步骤: 1.先定义一个能发送请求的页面,可以是链接,也可以是表单(form) 2.开发action类,struts2对action并没有过多的要求,只要求: a 推荐实现actio ...
- Struts2学习笔记一:工作流程与核心文件
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6807539.html 1:客户端发出请求到web服务器 2:请求经过一系列filter,最终到达Struts ...
- 【学习笔记】Struts2 类型转换
为什么需要类型转换 在基于HTTP协议的Web应用中 客户端请求的所有内容(表单中提交的内容等)都以文本编码的方式传输到服务器端但服务器端的编程语言(如Java)有着丰富的数据类型 如 int boo ...
- 学习笔记之Struts2—浅析接收参数
最近自己通过视频与相关书籍的学习,对action里面接收参数做一些总结与自己的理解. 0.0.接收参数的(主要)方法 使用Action的属性接收参数 使用DomainModel接收参数 使用Mod ...
- MFC学习笔记1---准备工作
什么是MFC MFC,全称Microsoft Foundation Classes,微软基础类库,顾名思义,是微软的攻城狮们将一些常用的基础的Windows API 函数用C++的形式封装成类,简化程 ...
- 【学习笔记】Struts2之配置处理结果
Action只是Struts2控制器的一部分,所以它不能直接生成对浏览者的响应.Action只负责生成响应的视图组件,通常是JSP页面,而Action会为JSP页面提供显示数据. Ac ...
- 【学习笔记】Struts2之一个Action包含多个控制处理逻辑
一.使用Action的动态方法调用 如果一个页面包含多个按钮,系统分别提交给Action的不同方法处理.此时可以采用DMI(Dynamic Method Invocation,动态方法调用)来 ...
- 【学习笔记】Struts2之配置文件struts.xml
在默认情况下,Struts2只自动加载类加载路径下的struts.xml.default-struts.xml和struts-plugin.xml三类文件.但是随着应用规模的增大,系统中Action数 ...
- 【学习笔记】Struts2 应用开发步骤
1.在web.xml文件中定义核心Filter来拦截用户请求. <!-- 定义Struts 2的核心Filter --> <filter> <filter-name> ...
随机推荐
- 第八篇 实例化Flask的参数 及 对app的配置
Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...
- 关于 warning CS0659:“***”重写Object.Equals(object o)但不重写Object.GetHashCode()
对象相等性和同一性 System.Object 类型提供了以下方法, namespace System { // // 摘要: // 支持 .NET Framework 类层次结构中的所有类,并为派生 ...
- python开发最受欢迎的十款工具
python开发最受欢迎的十款工具 dreamyla3个月前 今天小编给正在学习python开发的朋友介绍十款最受欢迎的开发工具,因为在学习python开发过程中少不了IDE或者代码编辑器,想要提高开 ...
- UNIX网络编程——客户/服务器心搏函数 (转)
下面是关于回送客户和服务器程序开发一些简单的心搏函数.这些函数可以发现对端主机或到对端的通信路径的过早失效. 在给出这些函数之前我们必须提出一些警告.首先,有人会想到使用TCP的保持存 ...
- Java多线程-线程的生命周期
线程可以分为4个状态:New(新生),Runnable(可运行):为了方便分析,还可将其分为:Runnable与Running.blocked(被阻塞),Dead(死亡). 与人有生老病死一样,线程也 ...
- MySQL内置功能之事务、函数和流程控制
主要内容: 一.事务 二.函数 三.流程控制 1️⃣ 事务 一.何谓事务? 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. # ...
- java 项目的jar 反编译后 压缩回去 命令
jar -cvfm0 123.jar META-INF\MANIFEST.MF(配置文件第一个位置) BOOT-INF org
- 微信小程序相关三、css写小黄人
小程序上课第三天,因为今天院里有活动,所以没去上课,第四天上午又因为要召开入党转正大会,又耽误了一上午,下午去上课,要了资料.这两天讲了一些零零碎碎的东西,做的实例有上面这个小黄人 都是用的css,基 ...
- Python_09-面向对象编程
目录: 1 面向对象编程1.1 简单例子1.2 调用1.3 python命名规范(约定)1.4 类的设计1.4.1 Exception 异常捕获结构1.4.2 自定 ...
- [hdu4347]The Closest M Points(线段树形式kd-tree)
解题关键:kdtree模板题,距离某点最近的m个点. #include<cstdio> #include<cstring> #include<algorithm> ...