struts2.0的工作原理「建议收藏」

struts2.0的工作原理「建议收藏」客户端发出一个请求,服务器端StrutsPreparedAndExceuteFilter接收请求,如果该请求是一个以.action结尾请求,则Struts2将请求转发至相应的Action,进行数

大家好,又见面了,我是你们的朋友全栈君。

struts2并不是一个陌生的web框架,它是以Webwork的设计思想为核心,吸收struts1的优点,可以说

struts2是struts1和Webwork结合的产物。 

struts2 的工作原理图:

 

一个请求在Struts2框架中的处理分为以下几个步骤:

 

1.客户端发出一个指向servlet容器的请求(tomcat);

 

2.这个请求会经过图中的几个过滤器,最后会到达FilterDispatcher过滤器。

 

3.过滤器FilterDispatcher是struts2框架的心脏,在处理用户请求时,它和请求一起相互配合访问struts2的底层框架结构。在web容器启动时,struts2框架会自动加载配置文件里相关参数,并转换成相应的类。

  如:ConfigurationManager、ActionMapper和ObjectFactory。ConfigurationManager 存有配置文件的一些基本信息,ActionMapper存有action的配置信息。在请求过程中所有的对象(Action,Results, Interceptors,等)都是通过ObjectFactory来创建的。过滤器会通过询问ActionMapper类来查找请求中 需要用到的Action。

 

4.如果找到需要调用的Action,过滤器会把请求的处理交给ActionProxy。ActionProxy为Action的代理对象。ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类。

 

5.ActionProxy创建一个ActionInvocation的实例。ActionInvocation在ActionProxy层之下,它表示了Action的执行状态,或者说它控制的Action的执行步骤。它持有Action实例和所有的Interceptor。 

 

6.ActionInvocation实例使用命名模式来调用,1. ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。在 调用Action的过程前后,涉及到相关拦截器(intercepetor)的调用。

 

7. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。

 

struts2.0的工作原理「建议收藏」

上图来源于Struts2官方站点,是Struts 2 的整体结构。

 

Struts2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。在这3个部分里,Struts 2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。 
(1)核心控制器:FilterDispatcher 
      FilterDispatcher是Struts2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,它负责拦截所有的用户请求,当用户请求到达时,该Filter会过滤用户请求。如果用户请求以action结尾,该请求将被转入Struts2框架处理。 
     Struts2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用哪个业务逻辑组件,例如,对于login.action请求,Struts2调用名为login的Action来处理该请求。 
    Struts2应用中的Action都被定义在struts.xml文件中,在该文件中定义Action时,定义了该Action的name属性和class属性,其中name属性决定了该Action处理哪个用户请求,而class属性决定了该Action的实现类。 
    Struts2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理——因为用户实现的业务控制器并没有与Servlet API耦合,显然无法处理用户请求。而Struts2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action 的execute方法来处理用户请求。 

(2)一个请求在Struts2框架中的处理大概分为以下几个步骤 
1 .客户端初始化一个指向Servlet容器(例如Tomcat)的请求 ,即HttpServletRequest请求。
2 .这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 
3. 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 
4 .如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 
5 .ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 
6 .ActionProxy创建一个ActionInvocation的实例。 
7 .ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 
8 .一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper 

在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。

 

 

应用流程注解

 

当
Web容器收到 请求(HttpServletRequest)它将请求传递给一个标准的的过滤链包括(ActionContextCleanUp)过滤器,然后经过Other filters(SiteMesh ,etc),

 

接下来需要调用FilterDispatcher核心控制器,然后它调用ActionMapper确定请求那个Action,ActionMapper返回一个收集Action详细信息的ActionMaping对象。

 

接下来FilterDispatcher将控制权委派给ActionProxy,ActionProxy调用配置管理器(ConfigurationManager) 从配置文件中读取配置信息(struts.xml),然后创建ActionInvocation对象,ActionInvocation在调用Action之前会依次的调用所用配置拦截器(Interceptor N) 一旦执行结果返回结果字符串ActionInvocation负责查找结果字符串对应的(Result)然后执行这个Result Result会调用一些模版(JSP)

 

来呈现页面,之后拦截器(Interceptor N)会在被执行(顺序和Action执行之前相反)最后响应(HttpServletResponse)被返回在web.xml中配置的那些过滤器和(核心控制器)(FilterDispatcher)。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155074.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • lefse分析本地实现方法带全部安装文件和所有细节,保证成功。

    lefse分析本地实现方法带全部安装文件和所有细节,保证成功。本人在win7-64和win10-64均完整安装使用,其他系统本人能力所限没安装成功。lefse本地分析包。()安装python2.7。()R语言3.6.1(这个应该是最新版就可以了应该无版本要求的,但我的是3.6.1就不提供下载地址了)这个是我总结的安装需求R语言:splines,stats4,survival,mvtnorm,modeltools,coin,MASS…

    2022年6月9日
  • 7.PyCharm基本使用与常规设置

    7.PyCharm基本使用与常规设置文章目录0.新建Python项目0.1步骤0.2演示1.主题设置1.1步骤1.2演示2.字体大小调整2.1步骤2.2演示3.添加多个解释器3.1步骤3.2演示3.3版本切换0.新建Python项目0.1步骤第一次安装,需要创建一个项目。如果能进入到开发界面请略过。1.NewProject2.选择路径3.选择本地环境–>选择电脑安装的解释器4.取消生成main.py脚本5.create6.进入到开发界面–>close关闭推荐提示0.2演示1.主题设置1

    2022年8月28日
  • wptx64能卸载吗_Win10自带应用卸载教程(本人亲测)

    wptx64能卸载吗_Win10自带应用卸载教程(本人亲测)使用win10有一段时间了,其中也用过诸如腾讯电脑管家、软媒魔方等工具对开机启动项进行过优化,多数时候都没出现问题,但最近几次优化使系统出现了各种问题。现在来总结一下,win10的那些服务项目不能动,不能禁止开机启动,不能关闭后台驻留。CoreMessaging:重要进程,关键系统进程,禁用后无法进入系统,ctrl+alt+del键都无效;TaskScheduler:windows系统任务调度程序…

    2022年5月2日
  • 论文阅读报告_小论文

    论文阅读报告_小论文FactorizingYAGOScalableMachineLearningforLinkedData关联数据的可扩展机器学习分解发表于WWW2012–Session:CreatingandUsingLinksbetweenDataObjects摘要:语义Web的链接开放数据(LOD)云中已经发布了大量的结构化信息,而且它们的规模仍在快速增长。然而,由于LOD的大小、部分数据不一致和固有的噪声,很难通过推理和查询访问这些信息。本文提出了一种高效的LOD数据关系学习方

    2022年10月22日
  • verilog经典教程(ps入门教程自学图解)

    Verilog入门1关键字1.1modulemodule()…endmodule代表一个模块,我们的代码写在这个两个关键字中间1.2inputoutputinput关键词,模块的输入信号,比如inputClk,Clk是外面关键输入的时钟信号;output关键词,模块的输出信号,比如output[3:0]Led;这个地方正好是一组输出信号。其中[3:0]表示0~3共4路信号。inout模块输入输出双向信号。数据总线的通信中,这种信号被广泛应用;wire关键词,线信号。例如:w

    2022年4月18日
  • 配置rsyslog到logstash_配置rsyslog「建议收藏」

    配置rsyslog到logstash_配置rsyslog「建议收藏」什么是日志文件系统?记录系统在什么时候由哪个进程做了什么行为时,发生了何种的事件等。centos提供rsyslogd这个服务来统一管理日志文件。rsyslog的配置文件/etc/rsyslog.conf,此文件规定了什么服务的什么等级信息以及需要被记录在哪里。1.服务名称authpriv与认证有关的机制cron列行性工作调度daemon与各个daemon有关kern与内核…

    2022年9月24日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号