一、拦截器

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接口

     public class Interceptor01 implements Interceptor {
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
    System.out.println("Interceptor01 执行了...");
    //放行
    invocation.invoke();
    return null;
    }
    @Override
    public void destroy() {
    }
    @Override
    public void init() {
    }
    }
  • 在struts.xml里面声明拦截器

    <package name="test" extends="struts-default" namespace="/">
    <!-- 声明拦截器 -->
    <interceptors>
    <interceptor name="interceptor01" class="com.pri.web.interceptor.Interceptor01"> </interceptor>
    </interceptors>
    </package>
  • 在action里面使用拦截器

     <action name="demo_*" class="com.pri.web.action.ActionDemo"  method="{1}">
    <interceptor-ref name="interceptor01"></interceptor-ref>
    </action>
2.2方式二:继承AbstractInterceptor

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

  • 创建一个类继承AbstractInterceptor

    
    
     public class Interceptor02 extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
    System.out.println("Interceptor01 执行了...");
    //放行
    invocation.invoke();
    return null;
    }
    }
  • 在struts.xml里面声明拦截器

     <package name="test" extends="struts-default" namespace="/">
    <!-- 声明拦截器 -->
    <interceptors>
    <interceptor name="interceptor02" class="com.pri.web.interceptor.Interceptor02"> </interceptor>
    </interceptors>
    </package>
  • 在action里面使用拦截器

     <action name="demo_*" class="com.pri.web.action.ActionDemo"  method="{1}">
    <interceptor-ref name="interceptor02"></interceptor-ref>
    </action>
2.3方式三:继承MethodFilterInterceptor【重点】

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

  • 创建一个类继承MethodFilterInterceptor

     public class Interceptor03 extends MethodFilterInterceptor {
    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
    System.out.println("Interceptor03 执行了...");
    //放行
    invocation.invoke();
    return null;
    } }
  • 在struts.xml里面声明拦截器

     <package name="test" extends="struts-default" namespace="/">
    <!-- 声明拦截器 -->
    <interceptors>
    <interceptor name="interceptor03" class="com.pri.web.interceptor.Interceptor03"> </interceptor>
    </interceptors>
    </package>
  • 在action里面使用拦截器

     <action name="demo_*" class="com.pri.web.action.ActionDemo"  method="{1}">
    <interceptor-ref name="interceptor03">
    <!--不拦截fun02()方法 -->
    <param name="excludeMethods">fun02</param>
    </interceptor-ref>
    </action>

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

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

3.1 拦截器不放行

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

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

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

  • 放行, 调用invoke()方法即可

  • 拦截,跳转其它页面, 不调用invoke()方法

3.2自定义拦截器的问题【重视】

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

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

       <interceptor-stack name="defaultStack">
    <interceptor-ref name="exception"/>
    <interceptor-ref name="alias"/>
    <interceptor-ref name="servletConfig"/>
    <interceptor-ref name="i18n"/>
    <interceptor-ref name="prepare"/>
    <interceptor-ref name="chain"/>
    <interceptor-ref name="scopedModelDriven"/>
    <interceptor-ref name="modelDriven"/>
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="checkbox"/>
    <interceptor-ref name="datetime"/>
    <interceptor-ref name="multiselect"/>
    <interceptor-ref name="staticParams"/>
    <interceptor-ref name="actionMappingParams"/>
    <interceptor-ref name="params"/>
    <interceptor-ref name="conversionError"/>
    <interceptor-ref name="validation">
    <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    <interceptor-ref name="workflow">
    <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    <interceptor-ref name="debugging"/>
    <interceptor-ref name="deprecation"/>
    </interceptor-stack>
    ....
    <default-interceptor-ref name="defaultStack"/>
  • 如果我们给自己的action使用了自己定义的拦截器,那么上面默认的这些拦截器都不会生效了,失去了这些功能,如果还想使用默认的这些拦截器。那么可以在action里面再引用它即可。

     <action name="actionDemo_*" class="com.itheima.action.ActionDemo" method="{1}">
    <!-- 执行这个action,就必然要走名字叫做myInterceptor02的拦截器 -->
    <!-- 使用默认的拦截器 -->
    <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 使用自定义的拦截器 -->
    <interceptor-ref name="myInterceptor"></interceptor-ref>
    <result name="login">/index.jsp</result>
    </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标签

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

  1. 框架学习之Struts2(四)---拦截器和标签

    一.拦截器概述 1.1 在struts2框架中封装了很多功能,struts2里面封装的功能都是在拦截器里面,struts2里面又很多拦截器,但不是每次这些拦截器都执行,每次执行型默认的拦截器. 默认拦 ...

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

    一.Struts2的拦截器(interceptor) 作用:当请求进入struts2框架后(进入之前可以用filter进行拦截),想对请求进行拦截操作(功能增强.权限控制),需要拦截器组件 1.str ...

  3. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  4. struts2总结六: Struts2的拦截器

    一.Struts2的系统结构图

  5. Struts2使用拦截器完成权限控制示例

    http://aumy2008.iteye.com/blog/146952 Struts2使用拦截器完成权限控制示例 示例需求:    要求用户登录,且必须为指定用户名才可以查看系统中某个视图资源:否 ...

  6. (六)Struts2的拦截器

    一.简介 拦截器体系是struts2重要的组成部分.正是大量的内建拦截器完成了该框架的大部分操作. 比如params拦截器将请求参数解析出来,设置Action的属性.servletConfig拦截器负 ...

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

    1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor ...

  8. struts2之拦截器

    1. 为什么需要拦截器 早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足.可扩展性降低, Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于 ...

  9. Struts2【拦截器】就是这么简单

    什么是拦截器 拦截器Interceptor.....拦截器是Struts的概念,它与过滤器是类似的...可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Str ...

随机推荐

  1. 爬虫6:pyquery库

      强大又灵活的网页解析库,如果觉得正则写起来太麻烦,BeautifulSoup语法太难记,而你又熟悉jQuery的语法,那么用PyQuery就是最佳选择     一. 初始化 1. 字符串初始化 h ...

  2. TPS和QPS定义以及影响TPS的因素

    一.TPS:Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数.TPS包括一条消息入和一条消息出,加上一次用户数据库访问.(业务TPS = CAPS × ...

  3. 各大浏览器相继发布声明将停止支持 TLS 1.0 和 TLS 1.1 !

    简评:TLS 1.0 发布至今已将近 20 周年即将寿终正寝,期间为我们保障了千亿次甚至万亿次的数据请求安全. TLS 工作组几个月前发布声明文件弃用 TLS 1.0 和 TLS 1.1. 昨天,包括 ...

  4. spring-boot-maven-plugin多模块install问题解决办法

    一.问题描述: 项目分多个模块,open-eureka注册中心.open-provider服务提供者.open-common公共部分,provider依赖common.父pom使用spring-boo ...

  5. C#-WebForm-Javascript、Jquery获取浏览器和屏幕各种高度宽度

    Javascript: IE中:document.body.clientWidth ==> BODY对象宽度document.body.clientHeight ==> BODY对象高度d ...

  6. Spark构成

    RDD Spark基本的数据结构叫弹性分布式数据集(Resilient Distributed Datasets,简称RDD). 概念: 一个分布于集群节点的只读数据集合,并以容错的.并行的方式进行维 ...

  7. Go语言指针

    指针简介 (Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值.由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元.因此,将 ...

  8. Flask-mail 发邮件慢(即使异步)

    Flask-mail 发邮件慢(即使异步) 一开始,按照狗书上的代码异步发邮件,但是发现原本响应只需要150ms的页面加了邮件发送就变成了5s响应(这怕不是假异步) 狗书的异步发邮件代码: def s ...

  9. 【性能测试】:关于测试F5负载均衡的问题

    在压测过程中,前置分发机的请求分发策略有多种,轮询,随机,DNS均衡,最小连接数等 问题出现的前提:因测试的一个系统对用户安全性校验较强,例如做交易之前,需要验证用户安全信息等 问题出现的现象:当lo ...

  10. (转) Linux 内核运行参数修改——sysctl命令

    原文:https://blog.csdn.net/u012707739/article/details/78254241 sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目 ...