博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2原理
阅读量:3914 次
发布时间:2019-05-23

本文共 2944 字,大约阅读时间需要 9 分钟。

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

 

Struts2核心组件介绍ActionMapper:通过method参数将请求转发到具体的actionActionProxy代理:是Action的一个代理类,也就是说Action的调用是通过ActionProxy实现的,其实就是调用了ActionProxy.execute()方法,而该方法又调用了ActionInvocation.invoke()方法。归根到底,最后调用的是DefaultActionInvocation.invokeAction()方法。ActionInvocation:就是Action的调用者。ActionInvocation在Action的执行过程中,负责Interceptor、Action和Result等一系列元素的调度。Interceptor拦截器:是Struts 2的一个强有力的工具,有许多功能(feature)都是构建于它之上,如国际化、校验等。
Struts2是一套非常优秀的Web应用框架,实现优雅、功能强大、使用简洁。可以说是Struts2是一款非常成熟的MVC架构。在我们学习Struts2时,最好是先学习它的运行流程、核心概念,从中得到启发,提升自己,而不仅仅是学习怎么怎么使用它。在网上看到这样一句话:你千万不要成为一个只会熟练使用框架的程序员,那样,你会疲于奔命,你也许永远只会使用 Hadoop ,而写不出一个 Hadoop ,你只是一个 Hadoop程序员,而不是一个分布式工程师。你也许永远只会使用 Struts,而忘记了自己写 filter,你只是一个 SSH 程序员,而不是一个 Web 工程师。话不多说,一起走进Struts2一、系统架构Struts2的官方文档附带了Struts2的架构图。从这张图可以很好的去理解Struts2

Servlet Filters:过滤器链,客户端的所有请求都要经过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接收到,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过滤器

 

你可能感兴趣的文章
骚年快答 | 技术中台与业务中台都是啥?
查看>>
骚年快答 | 微服务架构中的BFF到底是啥?
查看>>
设计模式之适配器模式
查看>>
如何利用Gitlab-CI持续部署到远程机器?
查看>>
.NET Core + K8S + Loki 玩转日志聚合
查看>>
ASP.NET Core中的分布式缓存
查看>>
在ASP.NET Core中创建自定义端点可视化图
查看>>
继续分享 5 个实用的 vs 调试技巧
查看>>
五年了,别再把务虚会开 “虚” 了
查看>>
一文看懂"async"和“await”关键词是如何简化了C#中多线程的开发过程
查看>>
每天都在支付,你真的了解信息流和资金流?
查看>>
.Net Core 自定义配置源从配置中心读取配置
查看>>
基于.NetCore3.1系列 —— 日志记录之日志配置揭秘
查看>>
设计模式之享元模式
查看>>
单例模式最佳实践
查看>>
.NET Core + Spring Cloud:服务注册与发现
查看>>
今天你内卷了吗?
查看>>
设计模式之代理模式
查看>>
在 MySQL 中使用码农很忙 IP 地址数据库
查看>>
结构型设计模式总结
查看>>