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 ...
随机推荐
- 基于.NET的开源搜索引擎-DotLucene(2)
NLucene是将 Lucene 从 Java 移植到 .NET 的一个 SourceForge 项目,它从 Lucene 1.2 版本转化而来. Lucene.Net因为 NLucene 项目到20 ...
- Linux(Ubuntu)配置问题集
Cannot set LC_CTYPE to default locale: No such file or directory 安装Ubuntu Server版本(不带桌面环境)时,如果安装时的语言 ...
- 修改linux的文件时,如何快速找到要修改的内容
♦ 在linux系统下,找到需要修改的文件.使用cd+目录的命令进行文件所在的目录,使用ls命令查看是否有该文件. ♦ 使用vim+文件名,打开该文件 ♦ 快速在文件中找到需要修改的地方.如我们需要修 ...
- 前端知识总结--js原型链
js的原型链听着比较深奥,看着容易晕,梳理一下还是比较容易懂的 (先简单写下,后续有时间再整理) 简而言之 原型链:就是js的对象与对象之间,通过原型组成建立的层层关系,构成了整个链条,称之为原型链 ...
- Iviews视频搜索引擎
随着视频类型的增加和数据量的日益庞大,如何有效地组织和管理这些数据,使人们能够方便地从大量视频数据中找到自己感兴趣的相关视频片段已成为一种迫切的需求,而能够满足这一需求的技术便是目前人们普遍关注的基于 ...
- resetBuffer方法与reset方法的使用场景:解决生成HTML或者文件下载时的首部空白行的问题
getResponse的getWriter()方法 getResponse的getWriter()方法连续两次输出流到页面的时候,第二次的流会包括第一次的流,所以可以使用response.reset或 ...
- 一段关于Unix、Linux和Windows的暗黑史
"SCO在言语上变得越来越好斗,而且还拒绝展示有关诉讼的任何证据,一切都似乎在表明,SCO只不过是在那里拉虎皮做大旗地狂言乱语.但是,微软 决不会轻易放弃这么可以一个利用这些狂言乱语的好机会 ...
- 【HADR】常见的问题
[hadrpri@oc0644314035 ~]$ db2 start hadr on db org as primary SQL1768N Unable to start HADR. Reason ...
- springboot项目:项目部署
第一步:打开终端,进入项目根目录 输入命令: cd /Users/liuxiaoming/Documents/software/ideawork/sell/ 第二步:对项目进行打包编译跳过测试: m ...
- Linux下mysql基础命令(一)
1, 创建mysqld数据库的管理用户: 要把root用户设置为管理员,我们应该运行下面的命令: # mysqladmin -u root password 密码 一般情 ...