本文以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—工作原理图的更多相关文章

  1. struts2学习笔记2 -struts2的开发步骤和工作原理

    struts2的开发步骤: 1.先定义一个能发送请求的页面,可以是链接,也可以是表单(form) 2.开发action类,struts2对action并没有过多的要求,只要求: a 推荐实现actio ...

  2. Struts2学习笔记一:工作流程与核心文件

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6807539.html  1:客户端发出请求到web服务器 2:请求经过一系列filter,最终到达Struts ...

  3. 【学习笔记】Struts2 类型转换

    为什么需要类型转换 在基于HTTP协议的Web应用中 客户端请求的所有内容(表单中提交的内容等)都以文本编码的方式传输到服务器端但服务器端的编程语言(如Java)有着丰富的数据类型 如 int boo ...

  4. 学习笔记之Struts2—浅析接收参数

    最近自己通过视频与相关书籍的学习,对action里面接收参数做一些总结与自己的理解. 0.0.接收参数的(主要)方法   使用Action的属性接收参数 使用DomainModel接收参数 使用Mod ...

  5. MFC学习笔记1---准备工作

    什么是MFC MFC,全称Microsoft Foundation Classes,微软基础类库,顾名思义,是微软的攻城狮们将一些常用的基础的Windows API 函数用C++的形式封装成类,简化程 ...

  6. 【学习笔记】Struts2之配置处理结果

        Action只是Struts2控制器的一部分,所以它不能直接生成对浏览者的响应.Action只负责生成响应的视图组件,通常是JSP页面,而Action会为JSP页面提供显示数据.     Ac ...

  7. 【学习笔记】Struts2之一个Action包含多个控制处理逻辑

    一.使用Action的动态方法调用     如果一个页面包含多个按钮,系统分别提交给Action的不同方法处理.此时可以采用DMI(Dynamic Method Invocation,动态方法调用)来 ...

  8. 【学习笔记】Struts2之配置文件struts.xml

    在默认情况下,Struts2只自动加载类加载路径下的struts.xml.default-struts.xml和struts-plugin.xml三类文件.但是随着应用规模的增大,系统中Action数 ...

  9. 【学习笔记】Struts2 应用开发步骤

    1.在web.xml文件中定义核心Filter来拦截用户请求. <!-- 定义Struts 2的核心Filter --> <filter> <filter-name> ...

随机推荐

  1. sshd 指定端口,指定秘钥文件

     scp -i ~/test -P22219 SRC/ root@10.2.227.76:/data/ #sshd的端口指定的是22219,  -i 指定秘钥文件   指定秘钥文件需要注意的是,需要提 ...

  2. Android签名机制:生成keystore、签名、查看签名信息

    转自:http://www.ourunix.org/post/146.html

  3. apache配置weblogic部署集群,多节点的项目和单节点项目并存 负载均衡

    开启模块如下: LoadModule weblogic_module modules/mod_wl_22.so LoadModule lbmethod_byrequests_module module ...

  4. ★★★.NET 在meta标签中使用表达式设置页面的关键字

    在aspx文件中 给meta标签的属性复制是不能直接使用 表达式的 错误的写法: <meta name="keywords" content="<%=news ...

  5. hibernate hbm2ddl auto 不能创建表的问题

    http://fuckgis.blog.sohu.com/148751122.html ________________________________________________________ ...

  6. (转)Linux下查看文件和文件夹大小 删除日志

    场景:在sts中执行自动部署时候maven提示No space left on device错误,后来经检查发现是磁盘空间满了,用下面的方法分析发现tomcat下面的logs目录占用了很大的空间,删除 ...

  7. 定时跳转的两种方式(html + javaweb)

    html方式 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...

  8. git ssh 22 端口不可用时通过https 443 端口配置git ssh

    Using SSH over the HTTPS port Sometimes, firewalls refuse to allow SSH connections entirely. If usin ...

  9. Spring 学习笔记(十)渲染 Web 视图 (Apache Tilesa 和 Thymeleaf)

    使用Apache Tiles视图定义布局 为了在Spring中使用Tiles,需要配置几个bean.我们需要一个TilesConfigurer bean,它会负责定位和加载Tile定义并协调生成Til ...

  10. 《团队-爬取豆瓣电影TOP250-设计文档》

    搭建环境: 1.安装python3.4 2.安装pycharm集成开发环境 3.安装Git for Windows 4.安装python第三方包 bs4开发阶段: 1.团队成员申请并配置github账 ...