Struts工作原理

Struts工作原理

Apache Struts is a free, open-source, MVC framework for creating elegant, modern Java web applications. It favors convention over configuration, is extensible using a plugin architecture, and ships with plugins to support REST, AJAX and JSON.

Apache Struts 2最初被称为WebWork 2,它是一个简洁的、可扩展的框架,可用于创建企业级Java web应用程序。设计这个框架是为了从构建、部署、到应用程序维护方面来简化整个开发周期。

The Apache Struts web framework

Apache Struts Web框架是一个免费的开源解决方案,用于创建Java Web应用程序。

Web应用程序与传统网站的不同之处在于Web应用程序可以创建动态响应。许多网站只提供静态页面。Web应用程序可以与数据库和业务逻辑引擎交互以自定义响应。

基于JavaServer Pages的Web应用程序有时会混合数据库代码,页面设计代码和控制流程代码。在实践中,我们发现除非这些问题是分开的,否则更大的应用程序将难以维护。

在软件应用程序中分离关注点的一种方法是使用模型 - 视图 - 控制器(MVC)架构。Model表示业务或数据库代码,View表示页面设计代码,Controller表示导航代码。Struts框架旨在帮助开发人员创建利用MVC架构的Web应用程序。

该框架提供了三个关键组件:

应用程序开发人员提供的“请求”处理程序,映射到标准URI。“响应”处理程序,用于将控制权转移到另一个完成响应的资源。标记库,可帮助开发人员使用服务器页面创建基于表单的交互式应用程序 框架的架构和标签符合流行语。Struts适用于传统的REST应用程序以及SOAP和AJAX等技术。

The Apache Struts Project

Apache Struts项目是开源社区,用于创建和维护Apache Struts框架。该项目由多元化的志愿者组成,他们在协作的,基于社区的开源开发方面拥有共同的价值观。

该项目被称为“Struts”,因为该框架旨在提供支持专业应用程序开发的“隐形基础”。Struts提供了将标准Java平台的各种元素连接成一个连贯整体的粘合剂。我们的目标是通过生成我们创建企业级应用程序所需的缺失部分来利用现有标准,这些应用程序易于维护。

Struts2 framework’s architecture

在这里插入图片描述
在图中,初始请求发送到Servlet容器(例如Jetty或Resin),该容器通过标准过滤器链传递。该链包括(可选)ActionContextCleanUp过滤器,在集成SiteMesh插件等技术时非常有用。接下来,调用所需的FilterDispatcher,然后查询ActionMapper以确定请求是否应该调用操作。

如果ActionMapper确定应该调用Action,则FilterDispatcher将控制委托给ActionProxy。ActionProxy参考框架配置文件管理器(从struts.xml文件初始化)。接下来,ActionProxy创建一个ActionInvocation,它负责命令模式的实现。这包括 在调用Action本身之前调用任何Interceptor(before子句)。

Action返回后,ActionInvocation负责查找与映射的Action结果代码关联的正确结果。struts.xml

然后执行结果,这通常(但不总是如Action Clining的情况)涉及用JSP或FreeMarker编写的模板来呈现。在渲染时,模板可以使用框架提供的Struts标签。其中一些组件将与ActionMapper一起使用,以便为其他请求呈现正确的URL。

此体系结构中的所有对象(操作,结果,拦截器等)都是由ObjectFactory创建的。这个ObjectFactory是可插入的。我们可以出于任何需要知道何时创建框架中的对象的原因来提供我们自己的ObjectFactory。一个流行的ObjectFactory实现使用Spring插件提供的Spring。

再次执行拦截器(以相反的顺序执行,调用after子句)。最后,响应通过web.xml中配置的过滤器返回。

图中的Key:

  • Servlet Filters:过滤器链,客户端的所有请求都要经过Filter链的处理。
  • Struts Core:Struts2的核心部分,但是Struts2已经做好了,开发者不需要去做这个
  • Interceptors:Struts2的拦截器。Struts2提供了很多默认的拦截器,可以完成日常开发的绝大部分工作;而我们自定义的拦截器,用来实现实际的客户业务需要的功能。
  • User Created:由开发人员创建的,包括struts.xml、Action、Template,这些是每个使用Struts2来进行开发的人员都必须会的。

框架各个部分:

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

运行流程

1.当用户发出请求,比如http:localhost:8080/HelloWorld/Action.action,请求会被Tomcat接收到,Tomcat服务器来选择处理这个请求的Web应用,那就是由HelloWorld这个web工程来处理这个请求。

2.Web容器会去读取HelloWorld这个工程的web.xml,在web.xml中进行匹配,但发现,由struts2这个过滤器来进行处理(也就是
StrutsPrepareAndExecuteFilter),根据Filter的配置,找到FilterDispatcher(Struts2的调度中心)

3.然后会获取FilterDispatcher实例,然后回调doFilter方法,进行真正的处理
PS:FilterDispatcher是任何一个Struts2应用都需要配置的,通常情况下,web.xml文件中还有其他过滤器时,FilterDispatcher是放在滤器链的最后;如果在FilterDispatcher前出现了如SiteMesh这种特殊的过滤器,还必须在SiteMesh前引用Struts2的ActionContextCleanUp过滤器
在这里插入图片描述
4.这时FilterDispatcher会将请求转发给ActionMapper。ActionMapper负责识别当前的请求是否需要Struts2做出处理。ActionMapper就类似于公司的保安,来识别是不是当前客户是不是本公司的人。
在这里插入图片描述
5.如果需要Struts2处理,ActionMapper会通知FilterDispatcher,需要处理这个请求,FilterDispatcher会停止过滤器链以后的部分,(这也就是为什么,FilterDispatcher应该出现在过滤器链的最后的原因)。然后建立一个ActionProxy实例,这个对象作为Action与xwork之间的中间层,会代理Action的运行过程。
在这里插入图片描述

6.ActionProxy对象在被创建出来的时候,并不知道要运行哪个Action,它手里只有从FilterDispatcher中拿到的请求的URL。
而真正知道要运行哪个Action的是ConfigurationManager,因为只有它才能读取我们的strtus.xml。
(在服务器启动的时候,ConfigurationManager就会把struts.xml中的所有信息读到内存里,并缓存,当ActionProxy带着URL向他询问要运行哪个Action的时候,就可以直接匹配、查找并回答了)
在这里插入图片描述在这里插入图片描述
7.ActionProxy知道自己该干什么事之后(运行哪个Action、相关的拦截器以及所有可能使用的result信息),然后马上建立ActionInvocation对象了,ActionInvocation对象描述了Action运行的整个过程。
注意:Action完整的调用过程都是由ActionInvocation对象负责
在这里插入图片描述
8.在execute方法之前,好像URL请求中的参数已经赋值到了Action的属性上,这就是我们的"雷锋"—拦截器。
拦截器的运行被分成两部分,一部分在Action之前运行,一部分在Result之后运行,而且顺序是刚好反过来的。也就是在Action执行前的顺序,比如是拦截器1、拦截器2、拦截器3,那么运行Result之后,再次运行拦截器的时候,顺序就变成拦截器3、拦截器2、拦截器1了。
所以ActionInvocation对象执行的时候需要通过很多复杂的过程,按照指定拦截器的顺序依次执行。
在这里插入图片描述
9.执行Action的execute方法
在这里插入图片描述
10.然后根据execute方法返回的结果(Result),去struts.xml中匹配选择下一个页面
在这里插入图片描述
11.根据结果(Result)找到页面后,在页面上(有很多Struts2提供的模板),可以通过Struts2自带的标签库来访问需要的数据,并生成最终页面
注意:这时还没有给客户端应答,只是生成了页面
在这里插入图片描述
12.最后,ActionInvocation对象倒序执行拦截器
在这里插入图片描述
13.ActionInvocation对象执行完毕后,已经得到响应对象(HttpServletResponse)了,最后按与过滤器(Filter)配置定义相反的顺序依次经过过滤器,向客户端展示出响应的结果。
在这里插入图片描述

Apache Struts 2 Architecture in a Nutshell

在这里插入图片描述

  • Web浏览器所请求的资源- /mypage.action,/reports/myreport.pdf等
  • Filter Dispatcher查看请求并确定相应的Action
  • 拦截器自动将常用功能应用于请求,如工作流,验证和文件上载处理
  • Action方法执行,通常存储和/或从数据库检索信息
  • 结果将输出呈现给浏览器,无论是HTML,图像,PDF还是其他内容

Struts Configuration in a Nutshell

Web应用程序使用部署描述符来初始化过滤器和侦听器等资源。Web部署描述符被格式化为XML文档并命名web.xml。Struts可以通过使用此web.xml文件中声明的Java包扫描您的类来初始化其资源,也可以通过命名的配置文件完全控制配置struts.xml。这些资源包括操作映射,将输入定向到服务器端Action类以及结果类型,以选择输出页面。

Struts MVC in a Nutshell

Struts是一个模型视图控制器框架。Struts提供Controller和View组件,并与其他技术集成以提供Model。框架的Controller充当应用程序模型和Web视图之间的桥梁。

为了更容易呈现动态数据,该框架包括一个标记标记库。标签与框架的验证和国际化功能相互作用,以确保输入正确并且输出已本地化。标记库可以与JSP,FreeMarker或Velocity一起使用。当然,也可以使用其他标记库,JSTL和AJAX,有或没有Struts标记。还支持JavaServer Faces组件。

收到请求后,Controller将调用Action类。Action类通过查阅Model(或者,最好是代表Model的接口)来检查或更新应用程序的状态。要在Model和View之间传输数据,可以将属性放在Action类上,也可以放在普通的旧JavaBean上。

通常,Model表示为JavaBean对象的图形。模型应该做“繁重的工作”,而行动将充当“交通警察”或适配器。该框架提供了复杂的自动类型转换,以简化在富域对象和纯文本HTTP请求之间传输数据的过程。

Struts是可扩展的。非常 可扩展。框架部署的每个类都基于一个接口。我们提供应用程序可能需要的所有基类,但如果我们错过了某些内容,则可以轻松添加自己的基类。我们提供通用的框架,但你仍然可以写你的 应用程序的方式。

参考文章:
https://struts.apache.org/index.html
https://blog.csdn.net/wjw0130/article/details/46371847

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值