.Net转Java自学之路—Struts2框架篇四(拦截器)

拦截器概述:

  1、在struts2框架中封装的很多功能都是在拦截器中。
  2、在struts2中有很多拦截器,不是每次这些拦截器都回执行,每次执行的都是默认拦截器。
  3、默认拦截器的位置在struts2-core.jar包中的struts-default.xml文件中可以找到。
  4、拦截器执行:在action对象创建之后与action的方法执行之前执行。

原理:

  拦截器底层主要使用俩个原理:AOP思想,责任链模式。

  AOP思想:
    AOP就是面向切面编程;如在基本功能的基础上扩展功能,不通过修改源代码的方式进行扩展。就是AOP思想。

  责任链模式:
    设计模式的一种,责任链模式和过滤链很相似。要一次性执行多个操作,而每个操作执行后都要执行类似于放行操作后,才能执行下一个操作。
    过滤链:一个请求可以有多个过滤器进行过滤,每个过滤器只有做放行才能到下一个过滤器。

  类似于放行操作的方法:invocation.invoke();

  拦截器在action对象创建以后,在action的方法执行之前执行。

  在action方法执行之前执行默认拦截器,执行过程使用aop思想,在action没有直接调用拦截器的方法,使用配置文件方式进行操作。在执行拦截器时,执行很多的拦截器,这个过程使用责任链模式。

过滤器和拦截器的区别:

  过滤器:服务器启动时创建。过滤器理论上可以过滤任意内容。
  拦截器:拦截器只可以拦截action。

自定义拦截器:

  在Struts2中有很多的拦截器,这些拦截器是Struts2封装的功能,但在实际开发中,Struts2中的拦截器中可以没有要使用的功能,这时需要自定义拦截器来实现功能。

  结构:

    继承AbstractInterceptor类,该类实现了Interceptor接口。该接口中的三个方法:
      init();初始化
      destroy();销毁
      String intercept(ActionInvocation invocation);拦截逻辑的方法

  实现自定义拦截器的方式:

    第一种方式:自定义拦截器时需要继承AbstractInterceptor或实现Interceptor即可。
    第二种方式:自定义拦截器继承MethodFilterInterceptor来实现,让action中某个方法不进行拦截。重写拦截器逻辑方法doIntercept。并配置action和拦截器的关系(注册拦截器)。

  如何让拦截器与action有关系:

    不是在action中调用拦截器的方法,而是通过配置文件方式让它们建立关系。
    配置步骤:
      1、在要拦截的action标签所在的package标签中声明拦截器。

<interceptors>
    <interceptor name="selfname" class="自定义拦截器类的全路径">
    </interceptor>
</interceptors>

      2、在具体的action标签中使用声明的拦截器。

<interceptor-ref name="声明拦截器的name">
</interceptor-ref>

      3、Struts2中执行很多的默认拦截器,但如果在action中配置自定义拦截器,那么默认的拦截器就不会执行。需要把默认拦截器手动配置。在struts2配置文件的action标签下手动配置。手动配置默认拦截器:俩种方式
        》将interceptor-stack中的默认拦截器重新写一遍。
        》直接使用interceptor-stack的name属性defaultStack值。

<interceptor-ref name="defaultStack">
</interceptor-ref>

        配置的拦截器会对action中所有的方法都进行拦截。因为在action中有部分方法不需要拦截,那么需要配置不拦截的方法。在使用拦截器配置interceptor-ref标签中配置不拦截的方法。

<interceptor-ref name="声明拦截器的name">
    <param name="excludeMethods(忽略某些方法。该name值时固定的)">方法1,方法2(action不拦截的方法名称)</param>
</interceptor-ref>

Struts2标签:

  struts2的标签只能使用在JSP页面中。导入标签库:

<%@ taglib uri="/struts-tags" prefix="s"%>

  s:property:与ognl表达式在jsp页面中获取值栈数据。

  s:iterator:获取值栈list集合数据,表示list集合。

  s:debug:查看值栈结构和数据。

  表单标签:

    在html中表单标签:
      1、form(action、method、enctype)
      2、输入项:大部分在input中封装 type="值"
        text:普通输入项
        password:密码输入项
        radio:单选输入项
        checkbox:复选输入项
        select:下拉输入项
        textarea:文本域
        file:文件上传项
        hidden:隐藏项
        button:普通按钮
        submit:提交按钮
        image:图片提交
        reset:重置

    在Struts2中对应html表单标签大部分都有,标签中多有label属性。
      form >> s:form(action、method、enctype)
      输入项:
        text >> s:textfield:普通输入项
        password >> s:password:密码输入项
        radio >> s:radio:单选输入项

<s:radio list="{'男','女'}" name="sex" label="性别"></s:radio><!-- 该情况显示值和value值相同 -->
<s:radio list="#{'0':'男','1':'女'}" name="sex" label="性别"></s:radio><!-- 该情况显示值和value值不同 -->

        checkbox s:checkboxlist>> :复选输入项
        select >> s:select:下拉输入项
        textarea >> s:textarea:文本域
        file >> s:file:文件上传项
        hidden >> s:hidden:隐藏项
        submit >> s:submit:提交按钮
        reset >> s:reset:重置

<s:submit value="提交"></s:submit>
<s:reset value="重置"></s:reset>
原文地址:https://www.cnblogs.com/zltao/p/10481829.html