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接口
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.开发流程
导入struts的环境jar,导入注解额外的jar
struts2-convention-plugin-x.x.x.jar在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 (四) — 拦截器的更多相关文章
- 框架学习之Struts2(四)---拦截器和标签
一.拦截器概述 1.1 在struts2框架中封装了很多功能,struts2里面封装的功能都是在拦截器里面,struts2里面又很多拦截器,但不是每次这些拦截器都执行,每次执行型默认的拦截器. 默认拦 ...
- Struts2知识点小结(四)--拦截器与注解开发
一.Struts2的拦截器(interceptor) 作用:当请求进入struts2框架后(进入之前可以用filter进行拦截),想对请求进行拦截操作(功能增强.权限控制),需要拦截器组件 1.str ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- struts2总结六: Struts2的拦截器
一.Struts2的系统结构图
- Struts2使用拦截器完成权限控制示例
http://aumy2008.iteye.com/blog/146952 Struts2使用拦截器完成权限控制示例 示例需求: 要求用户登录,且必须为指定用户名才可以查看系统中某个视图资源:否 ...
- (六)Struts2的拦截器
一.简介 拦截器体系是struts2重要的组成部分.正是大量的内建拦截器完成了该框架的大部分操作. 比如params拦截器将请求参数解析出来,设置Action的属性.servletConfig拦截器负 ...
- Struts2自定义拦截器Interceptor以及拦截器登录实例
1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor ...
- struts2之拦截器
1. 为什么需要拦截器 早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足.可扩展性降低, Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于 ...
- Struts2【拦截器】就是这么简单
什么是拦截器 拦截器Interceptor.....拦截器是Struts的概念,它与过滤器是类似的...可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Str ...
随机推荐
- bash脚本编程学习笔记(一)
bash脚本语言,不同于C/C++是一种解释性语言.即在执行前不需要事先转变为可执行的二进制代码,而是每次执行时经解释器解释后执行.bash脚本语言是命令的堆砌,即按照实际需要,结合命令流程机制实现的 ...
- [iOS笔试600题]二、常识篇(共有72题)
[B]1.NSObject是一个根类,几乎所有的类都是从它派生而来.但是根类并不拥有真它类都有的alloc和init方法?[判断题] A. 正确 B. 错误 [A]2. UIResponder可以让继 ...
- 【性能测试】jmeter的坑(1)——如何在多网卡情况下正确连接
问题现象: 性能测试时,使用的服务器配置了双网卡,windows客户机配置了四网卡,坑爹的配置,内外网的隔离,导致在使用jmeter进行分布式测试的时候总是连接失败. 原因分析: Jmeter采用了r ...
- 总结day25 ---- udp 初识, 和tcp 进阶
前情提要 一: tcp 和udp 的区别 # tcp # # 面向连接的 可靠的 全双工的 流式传输 # # 面向连接 :同一时刻只能和一个客户端通信 # # 三次握手.四次挥手 # # 可靠的 :数 ...
- P4382 [八省联考2018]劈配
题目链接 题意分析 受到了\(olinr\ \ julao\)的影响 写了匈牙利算法 首先 我们对于每一个人 从高到低枚举志愿 如果当前志愿的老师有剩余的话 那么我们就选 否则的话 我们看看谁的那个志 ...
- JavaScript DOM编程艺术 笔记(三)函数
函数function 是在你的代码里随时调用的语句 每个函数是个短小的脚本,arguments,传递的参数 function name(arguments){ statements; } functi ...
- 新手入门贴之基于 python 语言的接口自动化 demo 小实战
大家好,我是正在学习接口测试的菜鸟.近期通过自己的学习,完成了一个关于测试接口的接口自动化demo.下面想跟大家分享一下,主要的思路是根据接口文档确定测试用例,并将测试用例写在excel中.因为只是小 ...
- ZJOI2019 day2 游记
应该是打的最没有信仰的一次比赛了 然后这个垃圾水平居然还拿了170,真是有毒 我的语文并不好所以还是写流水账吧 day-2 到了余姚,发现附近并没有什么好吃的,于是直接去kfc了 另外潮湿的空气对呼吸 ...
- 那些H5用到的技术(6)——数字滚动特效
前言原理源码使用方式补充CountUp.js 前言 会有这么一种情况,H5页面需要进行数字统计展示,以此来强调产品or工作的成果.如果只是静态显示一个数字,总是感觉生硬.对比如下: 是不是瞬间高大上了 ...
- [Xamarin.iOS] 如何引用Objective-c寫的Class Library (转帖)
這個範例是如何在Xamarin.ios中去使用一個我們自行在Xcode中開發的Objective-c Class Library. 主要會執行的步驟如下 1. 在Xcode 裡面去建立一個Class ...
