Struts2_03_控制器(过滤器/拦截器/Action)

一、过滤器

过滤器是Struts2控制器的最前端控制器,请求对象首先被过滤器过滤。Struts2的过滤器有三层次,参考工作原理图中与过滤器有关的部分,不再赘述。

二、拦截器

  1.简单了解什么是拦截器?

  • 拦截器是Struts2中第二个层次的控制器,他会在Action执行前后运行一些Action类需要的通用功能;
  • 拦截器是使用AOP思想设计;
  • API中提供了大量的拦截器类;当然,我们也可以自定义拦截功能,也就是自定义拦截器。

 

  2.如何使用拦截器?

  ①定义拦截器

使用拦截器前,必须先在struts.xml文件中定义拦截器,使用标记<interceptor>定义。

  ②使用拦截器

定义拦截器之后就可以再Action中引用,通过标记<interceptor_ref>指定要使用的拦截器。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <constant name="struts.objectFactory" value="spring" />
  <package name="default" extends="struts-default">
  <!-- 定义拦截器 -->
  <interceptors>     <interceptor name="MyInterceptor01" class="interceptor.MyInterceptor01" />
    <
interceptor name="MyInterceptor02" class="interceptor.MyInterceptor02" />      
  </interceptors>   
  <action name="loginAction" class="loginAction">
    <!-- 引用拦截器-->
    <interceptor-ref name="MyInterceptor01"></interceptor-ref>
    <
interceptor-ref name="MyInterceptor02"></interceptor-ref>
    <result name="fail">/index.jsp </result>     <result name="success">/success.jsp</result>    </action>   </package> </struts>

  3.拦截器栈的定义与使用

往往我们需要对多个拦截器一起使用,那么就可以定义一个拦截器栈,将需要使用的拦截器捆绑在一起,方便使用,也就是说拦截器栈是多个拦截器的集合。

先看下面的代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <constant name="struts.objectFactory" value="spring" />
  <package name="default" extends="struts-default">
    <interceptors>
      <!--定义拦截器 -->
      <interceptor name="MyInterceptor01" class="interceptor.MyInterceptor01" />
      <
interceptor name="MyInterceptor02" class="interceptor.MyInterceptor02" />
      <
interceptor name="MyInterceptor03" class="interceptor.MyInterceptor03" />
      <
interceptor name="MyInterceptor04" class="interceptor.MyInterceptor04" />
      <!--定义拦截器栈 -->      
      <interceptor-stack name="myInterceptorStack">         
        <interceptor-ref name="MyInterceptor01"/>         
        <interceptor-ref name="defaultStack02"/>       
      </interceptor-stack>     
    </interceptors>     
    <action name="loginAction" class="loginAction">
      <!-- 使用拦截器栈 -->
      <
interceptor-ref name="myInterceptorStack" />       <result name="fail">/index.jsp </result>       <result name="success">/success.jsp</result>       </action>   </package> </struts>

上述定义了4个拦截器,还定义了一个拦截器栈,拦截器栈中引用了两个拦截器,如果下次需要同时访问这两个拦截器,就可以直接访问拦截器栈即可以了。

  4.默认拦截器或拦截器栈的定义与使用

在一个项目的某个包中,我们可以定义默认的拦截器或拦截器栈,那么,该包下的Action在<interceptor-ref>没有指定情况下,都会被默认拦截器或拦截器栈拦截。但是,如果包中的某个Action指定了<interceptor-ref>,则默认的拦截器或拦截器栈失效,必须再次指定方可使用。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <constant name="struts.objectFactory" value="spring" />
  <!--定义默认拦截器栈 -->
  <default-
interceptor-ref name="myInterceptorStack" />   <package name="default" extends="struts-default">        <action name="loginAction" class="loginAction">       <result name="fail">/index.jsp </result>       <result name="success">/success.jsp</result>       </action>   </package> </struts>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <constant name="struts.objectFactory" value="spring" />
  <!--定义默认拦截器栈 -->
  <default-
interceptor-ref name="myInterceptorStack" />   <package name="default" extends="struts-default">        <action name="loginAction" class="loginAction">
    <!--指定拦截器引用,此时默认拦截器失效-->
    <interceptor-ref name="MyInterceptor01" />
    <!-- 再次指定默认拦截器,使其生效 -->
    <
interceptor-ref name="myInterceptorStack" />

      <result name="fail">/index.jsp </result>
      <result name="success">/success.jsp</result>
    </action>
  </package>
</struts>

 

  5.struts-default.xml中定义的拦截器栈

struts.xml中的Action都继承了struts-default.xml中的struts-default包,因此都默认继承struts-default包的默认拦截器栈。

 

三、Action

  • Action是Struts2的第三层的控制器,需要自行开发;
  • Action是Struts2应用中使用数量最多的控制器;
  • Action实现的功能与Servlet非常类似,然而,Action不是Servlet,仅仅是一个普通的java类;
  • Action的主要作用就是:封装请求参数调用业务逻辑,执行业务操作,根据执行结果返回结果视图实现页面导航,被称为"业务控制器"
原文地址:https://www.cnblogs.com/slliang/p/2655900.html