Struts2定义
Struts2是一个基于MVC设计模式的Web应用框架,用于创建企业级Java web应用程序,本质是一个大大的Servlet。
Struts2作用
- 实现了 MVC模式 ,使程序员只需关注业务逻辑的实现;
- 丰富的 标签库 ,大大提高了开发的效率;
- Struts2提供丰富的 拦截器 实现;
- 通过 配置文件就可以掌握整个系统各个部分之间的关系;
- 面向切面编程 的思想在Strut2中也有了很好的体现,最重要的体现就是 拦截器的使用;
Struts2工作原理
谈到Struts工作原理就不得不提到MVC设计模式,MVC即Model-View-Controller的缩写,它是Web应用当中的常用的设计模式。
具体如下图所示:
MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化,Struts是MVC的一种实现。
1)控制(Controller)
在Struts中ActionServlet起着一个控制器(Controller)的作用,这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点,它截取和分发这些请求到相应的动作类,这些动作类都是Action类的子类。
另外控制组件也负责用相应的请求参数填充 Action Form,通常称之为FromBean,并传给动作类:通常称之为ActionBean。
动作类实现核心商业逻辑,所有这些控制逻辑利用Struts-config.xml文件来配置。
2)视图(JSP)
主要是由Jsp来控制页面输出的。它接收到Action Form中的数据,利用html,taglib,bean,logic等显示数据。
3)模型(JavaBean)
在Struts中,主要存在三种bean,分别是:Action,ActionForm,EJB或者Java Bean。ActionForm用来封装客户请求信息,Action取得ActionForm中的数据,再由EJB或者Java Bean进行处理。
Struts2工作流程
Struts2工作流程如下图所示:
第一步:客户端请求一个HttpServletRequest的请求。
比如:在浏览器中输入http://localhost: 8080/getUsername.action就是提交一个HttpServletRequest请求。
请求会被Tomcat接收到,TomcatServer来选择处理这个请求的Web应用。
第二步:这个请求经过一系列的过滤器Filter。
这个请求会经过图中的几个过滤器,最后会到达FilterDispatcher过滤器,比如:ActionContextCleanUp、其他过滤器SiteMesh等、 FilterDispatcher等。
注意:这里是有顺序的,先ActionContext CleanUp,再其他过滤器:Othter Filters、SiteMesh等,最后到FilterDispatcher(Struts2实现中控制层Controller的核心)。
第三步:接着FilterDispatcher被调用
FilterDispatcher是struts2框架的心脏,FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个HttpServlet Request请求。
如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy。
第四步:ActionProxy通过struts.xml询问框架的配置文件
找到需要调用的Action类,例如:用户注册示例将找到UserReg类。
第五步:ActionProxy创建一个ActionInvocation实例
同时ActionInvocation通过代理模式调用Action,但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor拦截器。
第六步:根据struts.xml中的配置找到对应的返回结果
一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。
第七步:返回结果
最后通过HTTPServletResponse返回客户端一个响应。
Struts2拦截器
Struts2拦截器是针对Struts2的,拦截器是用于在某个方法被访问之前,进行拦截然后在之前或之后加入某些操作。
举一个例子就更清楚了,比如:Spring AOP是针对Spring的拦截器,Struts2拦截器是针对Struts2框架的拦截器,拦截器就是AOP的一种实现策略。
Struts2使用拦截器主要是用来处理用户的请求,OGNL的使用,表单验证 等,比如:数据校验、国际化等。
这个图清晰的描述出了拦截器的运行地位,红色我标准的就是用来负责在Action执行之前和Result执行之后处理一些功能的类。
也就是说上图示意了有3个拦截器的类,分别是Interceptor1、Interceptor2和Interceptor3,它们分别执行不同的功能处理,而运行的时机就是在Action执行之前和Result执行之后。
1.创建拦截器类
Struts2提供了Interceptor接口,以及对该接口实现的一个对应抽象拦截器类AbstracInterceptor,在interceptor方法中加入相关的处理代码。
如下所示:
public class MyIntercepter extends AbstractInterceptor { @Override public String intercept(ActionInvocation actionInvocation) throws Exception { return actionInvocation.invoke(); } }
2.在Struts.xml中注册拦截器并引用拦截器
如下所示:
<struts> <package name="intercepter" extends="struts-default" > <!--注册拦截器----> <interceptors> <interceptor name="replace" class="com.mikechen.MyIntercepter"></interceptor> </interceptors> <action name="public" class="com.mikechen.PublicAction" method="execute"> <result name="success">/拦截器/success.jsp</result> <!--引用拦截器---> <interceptor-ref name="replace"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package> </struts>
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》