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

1.初始概念

  struts2是web.xml进行配置的一个过滤器,当web项目启动的时候,这个过滤器就会生效。

2.web.xml

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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处理请求的过程.如果你觉得对你有帮助的话,请麻烦点赞或关注我,谢谢观看!