Struts2 (四) — 拦截器

一、拦截器

1.概述

1.1什么是拦截器

? 在struts2中,拦截器(Interceptor)是用来动态拦截Action执行的对象。

? 拦截器有点类似以前Servlet阶段的Filter(过滤器) , 能够在请求到达Action之前进行拦截操作, 可以在里面进行判断校验。 典型的例子: 登录拦截.

注:过滤器可以过滤servlet,jsp,html , 但拦截器只能拦截Action

1.2 struts2执行流程

? 客户端请求Action,执行前端控制器,在前端控制器内部创建了Action的代理类,调用代理类的execute方法,在execute方法内部执行ActionInvocation的invoke方法。在invoke方法内部递归调用拦截器的拦截的方法。如果没有下一个拦截器执行目标Action,Action执行结束后根据Result进行页面跳转,执行拦截器的后面相应的代码,最后由response对象生成响应。

  • 流程图

  • 时序图

    ?

2.自定义拦截器

2.1方式一:实现Interceptor接口

? 最原始的方式,也是最基本的方式. 要实现三个方法,其中init 和 destroy ,平常我们都不太用。

  • 创建一个类实现Interceptor接口

     1 public class Interceptor01 implements Interceptor {
     2     @Override
     3     public String intercept(ActionInvocation invocation) throws Exception {
     4         System.out.println("Interceptor01 执行了...");
     5         //放行
     6         invocation.invoke();
     7         return null;
     8     }
     9     @Override
    10     public void destroy() {
    11     }
    12     @Override
    13     public void init() {
    14     }
    15 }
  • 在struts.xml里面声明拦截器
    <package name="test" extends="struts-default" namespace="/">
        <!-- 声明拦截器 -->
        <interceptors>
            <interceptor name="interceptor01" class="com.pri.web.interceptor.Interceptor01">                </interceptor>
        </interceptors>
    </package>
  • 在action里面使用拦截器
    1 <action name="demo_*" class="com.pri.web.action.ActionDemo"  method="{1}">
    2         <interceptor-ref name="interceptor01"></interceptor-ref>
    3 </action>
2.2方式二:继承AbstractInterceptor

? 是Interceptor的一个子类, 只需要重写intercept()方法.

  • 创建一个类继承AbstractInterceptor

    
    
    
    1 public class Interceptor02 extends AbstractInterceptor {
    2     @Override
    3     public String intercept(ActionInvocation invocation) throws Exception {
    4         System.out.println("Interceptor01 执行了...");
    5         //放行
    6         invocation.invoke();
    7         return null;
    8     }
    9 }
  • 在struts.xml里面声明拦截器
    1 <package name="test" extends="struts-default" namespace="/">
    2     <!-- 声明拦截器 -->
    3     <interceptors>
    4         <interceptor name="interceptor02" class="com.pri.web.interceptor.Interceptor02">                </interceptor>
    5     </interceptors>
    6 </package>
  • 在action里面使用拦截器
    1 <action name="demo_*" class="com.pri.web.action.ActionDemo"  method="{1}">
    2     <interceptor-ref name="interceptor02"></interceptor-ref>
    3 </action>
2.3方式三:继承MethodFilterInterceptor【重点】

? 是AbstractInterceptor的一个子类.可以精确的控制拦截或者不拦截哪一个方法

  • 创建一个类继承MethodFilterInterceptor

     1 public class Interceptor03 extends MethodFilterInterceptor {
     2     @Override
     3     protected String doIntercept(ActionInvocation invocation) throws Exception {
     4         System.out.println("Interceptor03 执行了...");
     5         //放行
     6         invocation.invoke();
     7         return null;
     8     }
     9
    10 }
  • 在struts.xml里面声明拦截器
    1 <package name="test" extends="struts-default" namespace="/">
    2     <!-- 声明拦截器 -->
    3     <interceptors>
    4         <interceptor name="interceptor03" class="com.pri.web.interceptor.Interceptor03">                </interceptor>
    5     </interceptors>
    6 </package>
  • 在action里面使用拦截器
    1 <action name="demo_*" class="com.pri.web.action.ActionDemo"  method="{1}">
    2         <interceptor-ref name="interceptor03">
    3             <!--不拦截fun02()方法 -->
    4             <param name="excludeMethods">fun02</param>
    5         </interceptor-ref>
    6 </action>

  注: 拦截器的执行顺序,取决于action标签中interceptor-ref的顺序.

3.自定义拦截器相关的操作

3.1 拦截器不放行

? 拦截器的处理结果,莫过于两种:

? 放行: 如果后面还有拦截器就执行下一个拦截器,如果后面没有了拦截器,就执行action

? 拦截: 但是注意,拦截后也需要返回到一个具体的页面。 所以需要配置result标签

  • 放行, 调用invoke()方法即可
  • 拦截,跳转其它页面, 不调用invoke()方法
3.2自定义拦截器的问题【重视】

? 一旦自定义了自己的拦截器,那么struts默认的哪一套 拦截器就不会走。 有点像有参构造和无参构造的关系。

  • struts默认的拦截器都有哪些呢?在struts-default.xml里面有一个package 名字也叫作 struts-default 在这个包中定义了一个拦截器栈,名字叫做 defaultStack.

     1   <interceptor-stack name="defaultStack">
     2             <interceptor-ref name="exception"/>
     3             <interceptor-ref name="alias"/>
     4             <interceptor-ref name="servletConfig"/>
     5             <interceptor-ref name="i18n"/>
     6             <interceptor-ref name="prepare"/>
     7             <interceptor-ref name="chain"/>
     8             <interceptor-ref name="scopedModelDriven"/>
     9             <interceptor-ref name="modelDriven"/>
    10             <interceptor-ref name="fileUpload"/>
    11             <interceptor-ref name="checkbox"/>
    12             <interceptor-ref name="datetime"/>
    13             <interceptor-ref name="multiselect"/>
    14             <interceptor-ref name="staticParams"/>
    15             <interceptor-ref name="actionMappingParams"/>
    16             <interceptor-ref name="params"/>
    17             <interceptor-ref name="conversionError"/>
    18             <interceptor-ref name="validation">
    19                 <param name="excludeMethods">input,back,cancel,browse</param>
    20             </interceptor-ref>
    21             <interceptor-ref name="workflow">
    22                 <param name="excludeMethods">input,back,cancel,browse</param>
    23             </interceptor-ref>
    24             <interceptor-ref name="debugging"/>
    25             <interceptor-ref name="deprecation"/>
    26     </interceptor-stack>
    27         ....
    28     <default-interceptor-ref name="defaultStack"/>
  • 如果我们给自己的action使用了自己定义的拦截器,那么上面默认的这些拦截器都不会生效了,失去了这些功能,如果还想使用默认的这些拦截器。那么可以在action里面再引用它即可。
    1 <action name="actionDemo_*" class="com.itheima.action.ActionDemo" method="{1}">
    2        <!-- 执行这个action,就必然要走名字叫做myInterceptor02的拦截器 -->
    3        <!-- 使用默认的拦截器 -->
    4        <interceptor-ref name="defaultStack"></interceptor-ref>
    5
    6        <!-- 使用自定义的拦截器 -->
    7        <interceptor-ref name="myInterceptor"></interceptor-ref>
    8        <result name="login">/index.jsp</result>
    9 </action>

二、标签库

1.概述

1.1 Struts2标签库介绍

  Struts2标签库是一个比较完善,且功能强大的标签库,它将所有标签都统一到一个标签库中,从而简化了标签的使用,它还提供主题和模板的支持,极大地简化了视图页面代码的编写。

1.2 Struts2标签库分类

  这些标签都在 docs/docs/tag-reference.html 里面可以找到

1.3使用步骤
  • 如果使用Struts2的标签库,必须导入库到页面

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

  • 根据语法书写标签库...

2.流程控制标签库

  • if标签elseif标签...类似JSP里面的c:if

    取值:
    <s:property value="#request.a"/><br/>
    ?
    <s:if test="#request.a > 10">
        a 大于10
    </s:if>
    <s:else>
        a 小于或者等于10
    </s:else>
  • iterator标签类似JSP里面的c:foreach

    <s:iterator value="list" var="u">
        <s:property value="username"/>
        <s:property value="password"/>
    </s:iterator>

3.UI标签

3.1 表单标签
  • 和HTML标签对比

    <h1>一,HTML的表单标签</h1>
    <form action="${pageContext.request.contextPath }/demo03_fun03" method="post">
        用户名:<input type="text" name="username"/><br/>
        密码: <input type="password" name="password"/><br/>
        性别:<input type="radio" name="sex" value="1"/>男<input type="radio" name="sex" value="0"/>女<br/>
        爱好:
        <input type="checkbox" name="hobby" value="lq"/>篮球
        <input type="checkbox" name="hobby" value="zq"/>足球
        <input type="checkbox" name="hobby" value="ppq"/>乒乓球
        <input type="checkbox" name="hobby" value="qdm"/>敲代码<br/>
        籍贯:<select name="address">
                <option value="-1">-请选择-</option>
                <option value="0">北京</option>
                <option value="1">上海</option>
                <option value="2">深圳</option>
            </select><br/>
        自我介绍:<textarea rows="2" cols="8" name="introduce">哈哈哈</textarea><br/>
        <input type="submit" />
    </form>
    ?
    <h1>二,Struts2的表单标签</h1>
    <!--默认请求方式就是post,action不用写项目路径  -->
    <s:form action="/demo03_fun03">
        <s:textfield name="username" label="用户名" />
        <s:password name="password" label="密码"/>
        <%-- <s:radio list="{‘男‘,‘女‘}" name="sex" label="性别"/> --%>
        <s:radio list="#{‘1‘:‘男‘,‘0‘:‘女‘ }" name="sex" label="性别" value="1"></s:radio>
        <s:checkboxlist list="{‘篮球‘,‘足球‘,‘乒乓球‘,‘敲代码‘}" label="爱好" name="hobby"/>
        <s:select list="#{‘0‘:‘北京‘,‘1‘:‘上海‘,‘2‘:‘深圳‘ }" label="籍贯" name="address" headerKey="-1" headerValue="请选择" value="1"></s:select>
        <s:textarea cols="8" rows="2" name="introduce" label="籍贯" value="哈哈"></s:textarea>
        <s:submit value="注册" align="left"/>
    </s:form>

Struct2标签特点:

? 自动加了样式, 标签都套了一层表格.对齐了

? 有自动回显数据的功能.

3.2Struts2模版和主题

?  主题就是一种风格化标签,能够让所有UI标签能够产生同样的视觉效果而归集到一起的一组模板,即风格相近的模板被打包为一个主题. struts2提供了四种主题simple、xhtml、css_xhtml、ajax。

?   simple:把UI标签翻译成最简单的HTML对应元素,而且会忽视行标属性

?   xhtml:默认的主题。这个主题的模板通过使用一个布局表格提供了一种自动化的排版机制(默认)

?   css_xhtml:这个主题里的模板与xhtml主题里的模板很相似,但他们将使用css来进行布局和排版

?   ajax:这个主题里的模板以xhtml主题里的模板为基础,但增加了一些ajax功能。

  • 通过配置struts.xml文件中的常量属性struts.ui.theme修改主题风格. 全局的

    <constant name="struts.ui.theme" value="simple"></constant>
  • 也可以通过UI标签的theme属性进行修改
    <s:form action="..." theme="simple">

二、struts2注解开发

1.开发流程

  1. 导入struts的环境jar,导入注解额外的jarstruts2-convention-plugin-x.x.x.jar
  2. 在action类中配置注解标签

2.注解

  • struts2.xml

    <package name="test" extends="struts-default" namespace="/">
         <action name="demo_fun01" class="com.pri.web.action.ActionDemo01" method="fun01">
            <result name="success">/demo01.jsp</result>
         </action>
    </package>

  • Namespace 注解

    ? 用来模拟package标签的namespace属性的。

    ? 需要在Action的类上配置。

  • ParentPackage 注解

    ? 用来模拟package标签的extends属性的。

    ? 需要在Action的类上配置。

  • Action注解

    ? 用来模拟action标签的。需要在action类中的action方法上配置。

    ? value属性用来模拟 action标签中的name属性

    ? results属性用来模拟 action标签内的result标签

  • Result注解

    ? 用来模拟result标签的。可以在action类上配置或者在action方法上配置。? action类上配置就是全局的。action方法上的配置是局部的。

    ? name属性用来模拟result标签name属性

    ? type属性用来模拟result标签type属性

    ? locaction属性用来模拟result标签的标签内容

    ? params属性用来模拟result标签的内部param标签

原文地址:https://www.cnblogs.com/gdwkong/p/8451486.html

时间: 2024-10-29 19:08:37

Struts2 (四) — 拦截器的相关文章

Struts2(四) 拦截器

一.struts2国际化 定义:同一款软件 可以为不同用户,提供不同语言界面 第一种 全局国际化信息文件 (所有Action都可以使用 ) ------- 最常用 1.properties文件可以在任何包中2. 需要在struts.xml 中配置全局信息文件位置 <!-- messages.properties 在src根目录 --> <constant name="struts.custom.i18n.resources" value="messages&

Struts2知识点小结(四)--拦截器与注解开发

一.Struts2的拦截器(interceptor) 作用:当请求进入struts2框架后(进入之前可以用filter进行拦截),想对请求进行拦截操作(功能增强.权限控制),需要拦截器组件        1.struts2内置拦截器            1.1 struts-default.xml中配置好的拦截器            struts2框架已经定义好并使用的拦截器            发送请求 -----> interceptor1---->interceptor2 ----

调查管理系统 -(6)自定义Struts2的拦截器&amp;自定义UserAware接口&amp;Action中模型赋值问题&amp;Hibernate懒加载问题

1.对于一些功能,如我的调查或新建调查等,只有用户登录后才能进行操作,因此必须对用户是否登录进行判断.当用户登录后才能使用相应的功能,如果没有登录则需为用户导航到登录页面让其进行登录.这个功能可以通过自定义Struts2的拦截器来完成. 2.当用户登录之后,由于是将用户的信息保存在session中的.这样当一些Action中需要用到当前登录的用户的信息时需要手动的从session中获取,不太方便,因此我们声明了一个UserAware接口(即用户关注,类似于Struts2中的SessionAwar

struts2 在拦截器进行注入(根据Action是否实现自定义接口)

例如:常常在Action中都需要获取当前登录的User,就需要获取Session,然后从Session获取当前登录的User,因为这些步骤都是重复操作,可以想办法在拦截器中进行实现,可以自定义一个接口,只要你的Action实现了这个接口,就在自定义拦截器中进行注入.即从拦截器中获取Session,然后设置进行注入. 简单的例子: 一个自定义接口,只要Action实现这个接口,就在拦截器中进行注入 package com.atguigu.surveypark.struts2; import com

【struts2】拦截器基础

1)拦截器是什么? 拦截器(Interceptor)是Struts2最强大的特性之一,它是一种可以让你在Action执行之前和Result执行之后进行一些功能处理的机制.来回顾一下官方给出的Struts2系统架构图中关于拦截器的部分,如下图所示: 这个图清晰的描述出了拦截器的运行地位,就是用来负责在Action执行之前和Result执行之后处理一些功能的类.也就是说,上图示意了有3个拦截器的类,分别是Interceptor1.Interceptor2和Interceptor3,它们分别执行不同的

Struts2自定义拦截器Interceptor以及拦截器登录实例

1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor{ private static final long serialVersionUID = 1L; public void destroy() { } public void init() {} public String intercept(ActionInvocation arg0) throws

Struts2 自定义拦截器时Action无法接收到参数

问题:自定义拦截器,没有添加defaultStack导致Action无法接受到参数 解决办法: 方法一,添加defaultStack,然后在Action中引用 自定义的stack,其实defaultStack中也有细分如basicStack等 <interceptors> <interceptor name="checkUser" class="com.common.interceptor.UserInfoInterceptor"></

Spring的AOP,Struts2的拦截器(Interceptor),以及springMVC的(interceptor)

参考外链:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilter/ 1.首先,spring的AOP作用范围很广,可以使用Aspectj的execution表达式自定以切面的位置. 比如下面的配置service方法执行日志: 1 <!-- 系统日志 --> 2 <bean id="logUtils" class="com.tabchanj.crm.utils.SystemLogUtils&q

【struts2】拦截器的工作模拟实现

Main.java /** * 书本:[struts2] * 功能:模拟拦截器的工作,实际就是递归的思想 * 文件:Main.java * 时间:2014年11月9日20:04:55 * 作者:cutter_point */ public class Main { public static void main(String [] args) { new ActionInvocation().invoke(); } } ActionInvocation.java /** * 书本:[struts