学习笔记之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> ...
随机推荐
- mysql和php的内存问题
最近给一个客户把他以前的数据转换到PHPSMC里去,因为他的数据太大出现一些问题,首先出现的是php内存问题,刚导时空白,我就在该也面的头部加上 error_reporting(E_ALL);打印所有 ...
- Android 4 学习(21):对话框
对话框 创建Dialog的两种方式: 1. 使用Dialog类或其子类,包括DialogFragment 2. 在Activity中使用Dialog主题(theme) 下面是使用Dialog类的一个例 ...
- activity与service进程内通信
package com.example.binbin.testbinder; import android.app.Service; import android.content.Intent; im ...
- 修改android Studio SDK 路径产生的问题(模拟器不能启动了)
原因:将 c:\user\admin\appdata\android\sdk 修改为 F:\AndroidProgram\Sdk 原来的虚拟机不能用了,要新建虚拟机才可以.
- margin+absolute布局:右栏固定主内容自适应 demo
margin+absolute布局:右栏固定主内容自适应 demo 头部 Aside侧边栏区域 Main主内容区域 底部 #demo{width:80%;margin:auto;height:300p ...
- 配置python的豆瓣source
sunny@sunny-ThinkPad-T450:~$ mkdir ~/.pip sunny@sunny-ThinkPad-T450:~$ gedit ~/.pip/pip.conf [global ...
- 插入后获取到id
第一种方法: insert INTO student(name) VALUES("南亚");SELECT @@identity 第二种方法: insert INTO student ...
- css实现文本过长时自动添加省略号
1. 效果 2. Html <div id="main_app_content" class="container"> <div class= ...
- css的优先级和权重问题 以及!important优先级
一,前言: 刚加的css怎么没有渲染出来?浏览器中查看,发现是被其他的css给覆盖了,相信我们都曾遇到过这样的问题.那么浏览器是如何选择css标签的渲染顺序的呢?换句话说,css选择器的优先级是怎么规 ...
- Hibernate中Session与本地线程绑定
------------------siwuxie095 Hibernate 中 Session 与本地线程绑定 1.Session 类似于 JDBC 的连接 Connection 2.Session ...