Struts2框架最全详解(非常详细)

Struts2框架最全详解(非常详细)-mikechen

Struts2定义

Struts2是一个基于MVC设计模式的Web应用框架,用于创建企业级Java web应用程序,本质是一个大大的Servlet

 

Struts2作用

  1. 实现了 MVC模式 ,使程序员只需关注业务逻辑的实现;
  2. 丰富的 标签库 ,大大提高了开发的效率;
  3. Struts2提供丰富的 拦截器 实现;
  4. 通过 配置文件就可以掌握整个系统各个部分之间的关系;
  5. 面向切面编程 的思想在Strut2中也有了很好的体现,最重要的体现就是 拦截器的使用;

 

Struts2工作原理

谈到Struts工作原理就不得不提到MVC设计模式,MVC即Model-View-Controller的缩写,它是Web应用当中的常用的设计模式。

具体如下图所示:

Struts2框架最全详解(非常详细)-mikechen

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工作流程如下图所示:

Struts2框架最全详解(非常详细)-mikechen

 

第一步:客户端请求一个HttpServletRequest的请求。

比如:在浏览器中输入http://localhost: 8080/getUsername.action就是提交一个HttpServletRequest请求。

请求会被Tomcat接收到,TomcatServer来选择处理这个请求的Web应用。

 

第二步:这个请求经过一系列的过滤器Filter。

Struts2框架最全详解(非常详细)-mikechen

这个请求会经过图中的几个过滤器,最后会到达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的使用,表单验证 等,比如:数据校验、国际化等。

Struts2框架最全详解(非常详细)-mikechen

这个图清晰的描述出了拦截器的运行地位,红色我标准的就是用来负责在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面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法