一、系统架构 

   Struts2的官方文档附带了Struts2的架构图。

  从这张图能够非常好的去理解Struts2


关于图中的Key:

  • Servlet Filters:过滤器链,client的全部请求都要经过Filter链的处理。

  • Struts Core:Struts2的核心部分,可是Struts2已经帮我们做好了,我们不须要去做这个

  • Interceptors。Struts2的拦截器。Struts2提供了非常多默认的拦截器。能够完毕日常开发的绝大部分工作;而我们自己定义的拦截器,用来实现实际的客户业务须要的功能。

  • User Created,由开发者创建的。包含struts.xml、Action、Template。这些是每一个使用Struts2来进行开发的人员都必须会的。

  • 1.FilterDispatcher是整个Struts2的调度中心。也就是MVC中的C(控制中心),依据ActionMapper的结果来决定是否处理请求,假设ActionMapper指出该URL应该被Struts2处理。那么它将会运行Action处理,并停止过滤器链上还没有运行的过滤器。
  • 2.ActionMapper 会推断这个请求是否应该被Struts2处理,假设须要Struts2处理。ActionMapper会返回一个对象来描写叙述请求相应的ActionInvocation的信息。
  • 3.ActionProxy。它会创建一个ActionInvocation实例,位于Action和xwork之间,使得我们在将来有机会引入很多其它的实现方式。比方通过WebService来实现等。
  • 4.ConfigurationManager是xwork配置的管理中心,能够把它看做struts.xml这个配置文件在内存中的相应。
  • 5.struts.xml,是开发人员必须光顾的地方。是Stuts2的应用配置文件,负责诸如URL与Action之间映射关系的配置、以及运行后页面跳转的Result配置等。
  • 6.ActionInvocation:真正调用并运行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。ActionInvocation会依照指定的顺序去运行这些拦截器、Action以及相应的Result。
  • Interceptor(拦截器):是Struts2的基石。类似于JavaWeb的Filter,拦截器是一些无状态的类。拦截器能够自己主动拦截Action,它们给开发人员提供了在Action运行之前或Result运行之后来运行一些功能代码的机会。
  • 7.Action:用来处理请求,封装数据。
  • 二、执行流程

1.当用户的发出请求。比方http:localhost:8080/Struts2/helloworld/helloworldAction.action,请求会被Tomcat接收到,Tomcatserver来选择处理这个请求的Web应用,那就是由helloworld这个webproject来处理这个请求。
2.Web容器会去读取helloworld这个project的web.xml。在web.xml中进行匹配,但发现,由struts2这个过滤器来进行处理(也就是StrutsPrepareAndExecuteFilter)。依据Filter的配置,找到FilterDispatcher(Struts2的调度中心)
3.然后会获取FilterDispatcher实例,然后回调doFilter方法,进行真正的处理
PS:FilterDispatcher是不论什么一个Struts2应用都须要配置的,通常情况下。web.xml文件里还有其它过滤器时,FilterDispatcher是放在滤器链的最后;假设在FilterDispatcher前出现了如SiteMesh这样的特殊的过滤器,还必须在SiteMesh前引用Struts2的ActionContextCleanUp过滤器

相应Struts2的架构图例如以下



4.这时FilterDispatcher会将请求转发给ActionMapper。ActionMapper负责识别当前的请求是否须要Struts2做出处理。ActionMapper就类似于公司的保安。来识别是不是当前客户是不是我公司的人

相应Struts2的架构图例如以下



5.假设须要Struts2处理。ActionMapper会通知FilterDispatcher。须要处理这个请求。FilterDispatcher会停止过滤器链以后的部分,(这也就是为什么,FilterDispatcher应该出如今过滤器链的最后的原因)。然后建立一个ActionProxy实例。这个对象作为Action与xwork之间的中间层。会代理Action的执行过程。

相应Struts2的架构图例如以下



6.ActionProxy对象在被创建出来的时候,并不知道要执行哪个Action,它手里仅仅有从FilterDispatcher中拿到的请求的URL。
而真正知道要执行哪个Action的是ConfigurationManager。由于仅仅有它才干读取我们的strtus.xml

(在server启动的时候,ConfigurationManager就会把struts.xml中的全部信息读到内存里,并缓存。当ActionProxy带着URL向他询问要执行哪个Action的时候,就能够直接匹配、查找并回答了)

相应Struts2的架构图例如以下

  -> 

7.ActionProxy知道自己该干什么事之后(执行哪个Action、相关的拦截器以及全部可能使用的result信息),然后立即建立ActionInvocation对象了,ActionInvocation对象描写叙述了Action执行的整个过程。

注意:Action完整的调用过程都是由ActionInvocation对象负责


相应Struts2的架构图例如以下




8.在execute方法之前,好像URL请求中的參数已经赋值到了Action的属性上。这就是我们的"雷锋"—拦截器。

拦截器的执行被分成两部分,一部分在Action之前执行,一部分在Result之后执行,并且顺序是刚好反过来的。也就是在Action执行前的顺序,比方是拦截器1、拦截器2、拦截器3,那么执行Result之后,再次执行拦截器的时候,顺序就变成拦截器3、拦截器2、拦截器1了。

这就好比,你要去奶奶家。需要通过 水泊梁山->盘丝洞 -> 索马里,到了奶奶家。看奶奶回来的时候,就必需要通过 索马里 -> 盘丝洞 -> 水泊梁山。

所以ActionInvocation对象运行的时候须要通过非常多复杂的过程,依照指定拦截器的顺序依次运行。


相应Struts2的架构图例如以下





9.到了奶奶家,然后运行Action的execute方法





10.然后依据execute方法返回的结果(Result),去struts.xml中匹配选择下一个页面




11.依据结果(Result)找到页面后,在页面上(有非常多Struts2提供的模板),能够通过Struts2自带的标签库来訪问须要的数据,并生成终于页面

注意:这时还没有给client应答,仅仅是生成了页面




12.最后,ActionInvocation对象倒序运行拦截器,从奶奶家回来




13.ActionInvocation对象运行完成后,已经得到响应对象(HttpServletResponse)了,最后按与过滤器(Filter)配置定义相反的顺序依次经过过滤器,向client展示出响应的结果


得到完整Struts2架构图



转载自:https://www.cnblogs.com/mfmdaoyou/p/7189578.html

struts2学习笔记(二)—— struts2的架构【转】的更多相关文章

  1. Struts2学习笔记二 配置详解

    Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的name ...

  2. struts2学习笔记二

    一.分文件编写框架配置文件 1.不分文件开发可能产生的问题 就类似于我们在写java类时,所有代码都写在一个类里,甚至写在一个方法里. 当3个人都checkout了struts.xml文件时,第一个人 ...

  3. Struts2学习笔记(二)——配置详解

    1.Struts2配置文件加载顺序: default.properties(默认常量配置) struts-default.xml(默认配置文件,主要配置bean和拦截器) struts-plugin. ...

  4. Struts2学习笔记(二):第一个Struts2应用

    一.创建Action类. 创建工程Struts2Demo struts 2中的Action类并不需要继承struts 2中的某个父类,普遍的java类就可以. 在org.sunny.user.acti ...

  5. Struts2学习笔记二:开发流程

    一:创建项目,添加依赖包 二:在web.xml配置核心控制器 <filter> <filter-name>struts2</filter-name> <fil ...

  6. struts2学习笔记之六:struts2的Action访问ServletAPI的几种方式

    方法一:通过ActionContext访问SerlvetAPI,这种方式没有侵入性 Action类部分代码 import com.opensymphony.xwork2.ActionContext; ...

  7. Struts2学习笔记(一):Struts2开发环境的配置

    一.Struts2应用所需的jar文件. 开发struts2应用需要依赖的jar文件在解压目录下的lib文件夹里面.开发struts2程序最少需要的jar文件为:struts2-core-2.xx.j ...

  8. struts2学习笔记--使用struts2插件实现ajax处理(返回json数据)

    贴一个简单的例子,通过jquery的post调用action,定义一个对象User,有name和age属性,实例化几个对象,以json的格式返回到jsp,在前台页面显示出来,模拟用户列表. 导入相关j ...

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

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

  10. (Struts2学习系列二)Struts2动态方法调用:指定method属性

    紧接着上一篇,在HelloWorldAction.java中添加add和update方法: public class HelloWorldAction extends ActionSupport{ p ...

随机推荐

  1. 【Android】Android 4.0 无法接收开机广播的问题

    [Android]Android 4.0 无法接收开机广播的问题   前面的文章 Android 开机广播的使用 中 已经提到Android的开机启动,但是在Android 4.0 有时可以接收到开机 ...

  2. Logos

    [Logos] Logos is a component of the Theos development suite that allows method hooking code to be wr ...

  3. jQuery+css模拟下拉框模糊搜索的实现

    html: @*输入框*@ <div> <input type="text" style="width: 85%; height: 34px;" ...

  4. git获取网上的项目

    这里是从coding.net上下载项目至本地phpstorm并配置好相关环境. 这里url地址正是项目路径.获取的地方是: 下面那个url直接复制粘贴. 自己选择一个目录,然后clone. 下面便是前 ...

  5. mfs教程(四)

    mfs文件系统(四) MooseFS  维护 一.启动MooseFS集群 最安全的启动MooseFS集群(避免任何读或写的错误数据或类似的问题)的方式是按照以下命令步骤: 1.启动mfsmaster进 ...

  6. Lambda02 函数式接口

    1 java8默认提供的函数式接口 1.1 Predicate /* * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rig ...

  7. MAC通过SSH使用PEM文件登录

    1.命令如下 ssh -i key.pem ssh -i key.pem root@IP 如果出现报错说明这个问题是文件的权限太大了,需要给小点 sudo chmod 600 key.pem 然后再执 ...

  8. Open Message Queue 集群问题

    nohup ./imqbrokerd -tty -name myBroker -port 7677 -javahome /opt/omae/jdk1.7.0_45 -cluster 192.168.2 ...

  9. The user specified as a definer (”@sa’%') does not exist 解决方法

    mysql数据库报错The user specified as a definer (”@sa’%') does not exist.尝试过两种方式,第一种重启之后好用,但是一会就又不好用了.第二种算 ...

  10. Stomp与Jackson

    读取Stomp消息的类在StompDecoder中,org.springframework.messaging.simp.stomp.StompDecoder. Jackson把json转对象是在如下 ...