struts2—拦截器
在Struts2中,如果用户没有指定执行哪些拦截器,struts2有一个默认执行的栈,defaultStack;
一旦如果用户有指定执行哪些拦截器,默认的拦截器栈就不会被执行
拦截器配置举例(struts-default.xml文件中,定义了struts提供的所有拦截器!)
//1. 定义拦截器以及拦截器栈
<interceptors>
1.1 拦截器定义
<interceptor name="" class="" />
1.2 拦截器栈的定义
<interceptor-stack name="defaultStack">
引用了上面拦截器(1.1)
</interceptor-stack>
</interceptors>
2. 默认执行的拦截器(栈)
<default-interceptor-ref name="defaultStack"/>
API
|-- Interceptor 拦截器接口
|-- AbstractInterceptor 拦截器默认实现的抽象类; 一般用户只需要继承此类即可继续拦截器开发
|-- ActionInvocation 拦截器的执行状态,调用下一个拦截器或Action
自定义一个拦截器案例
自定义拦截器必须实现com.opensymphony.xwork2.interceptor.Interceptor接口或继承AbstractInterceptor类,一般继承AbstractInterceptor类
首先创建一个HelloAction
package com.interceptor;
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction extends ActionSupport{
public HelloAction() {
System.out.println("正在执行:HelloAction.HelloAction()");
}
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
System.out.println("正在执行HelloAction.execute()");
if (name.equals("gqx") && password.equals("123")) {
return SUCCESS;
}else {
return INPUT;
}
}
}
继续创建一个拦截器HelloInterceptor类
package com.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class HelloInterceptor extends AbstractInterceptor{
// 启动时候执行
@Override
public void init() {
System.out.println("创建了拦截器对象HelloInterceptor.init()");
}
// 拦截器业务处理方法
@Override
public String intercept(ActionInvocation arg0) throws Exception {
// TODO Auto-generated method stub
System.out.println("开始执行:HelloInterceptor.intercept()");
// 调用下一个拦截器或执行Action (相当于chain.doFilter(..)
// 获取的是: execute方法的返回值
String resultString=arg0.invoke();//在这里是去执行HelloAction了,所以返回的结果为success
System.out.println("HelloInterceptor.intercept()结束了"+resultString);
return resultString;
}
@Override
public void destroy() {
System.out.println("销毁....");
}
}
在同一个包下创建一个配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- START SNIPPET: xworkSample -->
<struts>
<!-- 【拦截器配置】 -->
<package name="configinterceptor" namespace="/" extends="struts-default">
<interceptors>
<!-- 配置用户自定义的拦截器 -->
<interceptor name="helloInterceptor" class="com.interceptor.HelloInterceptor"></interceptor>
<!-- 自定义一个栈: 要引用默认栈、自定义的拦截器 -->
<interceptor-stack name="helloStack">
<!-- 引用默认栈 (一定要放到第一行)-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 引用自定义拦截器 -->
<interceptor-ref name="helloInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 【执行拦截器】 -->
<default-interceptor-ref name="helloStack"></default-interceptor-ref>
<action name="test" class="com.interceptor.HelloAction">
<result name="success">/f/success.jsp</result>
<result name="input">/f/error.jsp</result>
</action>
</package>
</struts>
<!-- END SNIPPET: xworkSample -->
以上的拦截器是全局的,如果需要设置成一个只针对单个的action的话可以写成一下方式:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- START SNIPPET: xworkSample -->
<struts>
<package name="configinterceptor" namespace="/" extends="struts-default">
<interceptors>
<!-- 配置用户自定义的拦截器 -->
<interceptor name="helloInterceptor" class="com.interceptor.HelloInterceptor"></interceptor>
</interceptors>
<action name="test" class="com.interceptor.HelloAction">
<result name="success">/f/success.jsp</result>
<result name="input">/f/error.jsp</result>
<!-- 先执行默认栈中的拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="helloInterceptor"></interceptor-ref>
</action>
</package>
</struts>
<!-- END SNIPPET: xworkSample -->
然后在struts.xml中去引用他即可。
最后一个就是他的register.jsp页面
<form action="${pageContext.request.contextPath }/test">
姓名<input type="text" name="name" />
密码<input type="text" name="password" />
<input type="submit"/>
</form>
启动服务器可以看见以下信息

继续在register.jsp页面去访问提交信息后可以看到控制台的信息

根据这个结果可以判断拦截器执行流程如下:

服务器启动:
创建所有拦截器、执行init()
访问:
先创建Action实例;
在执行拦截器,
最后拦截器放行,执行execute;返回success字符串。
拦截器案例:
只允许登入后的用户尅访问action,否则直接使用action会调回到登入页面。
代码太多了
js小练习:商品计算功能
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>商品计算</title>
<link rel="stylesheet" href="">
</head>
<script type="text/javascript">
window.onload = function() {
//获取元素
var oList = document.getElementById('list');
var aLi = oList.getElementsByTagName('li');
var oDiv = document.getElementById('div1');
var aInput = oDiv.getElementsByTagName('input');
//时间操作
for (var i = aLi.length - 1; i >= 0; i--) {
calculate(aLi[i]);
}
//封装函数
function calculate(li) {
var oInput = li.getElementsByTagName('input');
var oSpan = li.getElementsByTagName('span')[0];
var oEm = li.getElementsByTagName('em')[0];
oInput[0].onclick = function() {
if (parseInt(oSpan) > 0) {
oSpan.innerHTML = parseInt(oSpan.innerHTML) - 1 + '件';
oInput[2].value = parseInt(oSpan.innerHTML) * parseInt(oEm.innerHTML) + "元";
}
conAll();
allMoney();
}
oInput[1].onclick = function() {
oSpan.innerHTML = parseInt(oSpan.innerHTML) + 1 + '件';
oInput[2].value = parseInt(oSpan.innerHTML) * parseInt(oEm.innerHTML) + "元";
conAll();
allMoney();
}
}
//计算件数
function conAll() {
var result = 0;
for (var i = aLi.length - 1; i >= 0; i--) {
//获取一件商品的数量
var span = aLi[i].getElementsByTagName('span')[0];
result += parseInt(span.innerHTML);
}
//显示结果
aInput[1].value = result + '件';
}
//金额总计
function allMoney() {
var result = 0;
for (var i = aLi.length - 1; i >= 0; i--) {
var input = aLi[i].getElementsByTagName('input')[2];
if (input.value) {
result += parseInt(input.value);
}
}
aInput[3].value = result + '元';
}
}
</script>
<body>
<ul id="list">
<li>
<input type="button" value="-" />
<span>0件</span>
<input type="button" value="+" />
<em>4.00元</em> 结果:
<input type="text" />
</li>
<li>
<input type="button" value="-" />
<span>0件</span>
<input type="button" value="+" />
<em>1.00元</em> 结果:
<input type="text" />
</li>
<li>
<input type="button" value="-" />
<span>0件</span>
<input type="button" value="+" />
<em>1.00元</em> 结果:
<input type="text" />
</li>
<li>
<input type="button" value="-" />
<span>0件</span>
<input type="button" value="+" />
<em>1.00元</em> 结果:
<input type="text" />
</li>
<li>
<input type="button" value="-" />
<span>0件</span>
<input type="button" value="+" />
<em>1.00元</em> 结果:
<input type="text" />
</li>
<li>
<input type="button" value="-" />
<span>0件</span>
<input type="button" value="+" />
<em>1.00元</em> 结果:
<input type="text" />
</li>
<li>
<input type="button" value="-" />
<span>0件</span>
<input type="button" value="+" />
<em>1.00元</em> 结果:
<input type="text" />
</li>
</ul>
<div id="div1">
<input type="button" value="商品总计" id="btn1" />
<input type="text" id="number" />
<input type="button" value="价格总计:" id="btn2" />
<input type="text" id="price" />
</div>
</body>
</html>
struts2—拦截器的更多相关文章
- Struts2 拦截器配置以及实现
@(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...
- struts2 拦截器
拦截器:对Action的访问.可以拦截到Action中某个方法.与过滤器不同,过滤器过滤的是请求.过滤JSP.html.但是拦截器不能拦截jsp.html的访问. Struts2 拦截器在访问某个 A ...
- Struts2拦截器的使用 (详解)
Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...
- struts2拦截器
一.自定义拦截器 struts2拦截器类似于servlet过滤器 首先定义一个拦截器这个拦截器实现了Interceptor接口: package cn.orlion.interceptor; impo ...
- Struts2拦截器模拟
前言: 接触Struts2已经有一段时间,Student核心内容就是通过拦截器对接Action,实现View层的控制跳转.本文根据自身理解对Struts2进行一个Java实例的模拟,方便大家理解! 示 ...
- Struts2拦截器初涉
Struts2拦截器初涉 正在练习struts,本例是从一个pdf上摘抄的例子,那本pdf都不知道叫什么名字,不过感觉很适合初学者. 在这里要实现一个简单的拦截器"GreetingInter ...
- 浅谈Struts2拦截器的原理与实现
拦截器与过滤器 拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...
- 基于SSH2框架Struts2拦截器的登录验证实现(转)
大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了.那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证. 修改数 ...
- struts2拦截器interceptor的三种配置方法
1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...
- Struts2拦截器原理以及实例
一.Struts2拦截器定义 1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. ...
随机推荐
- 远程唤醒 N54L
远程唤醒 N54L 我的N54L装了一块买时带的WD500G黑盘,又装了一个WD2T绿盘,存些电影歌曲什么的,当NAS用,装的WIN7系统,长时间不使用就自动关机了,每次都得按一下电源开关键,于是就研 ...
- C3p0/元数据/内省-Bean/自定义查询封装类/查询/分页
c3p0连接池(C3p0连接池,只有当用户获取连接时,才会包装Connection.) 第一步:导入c3p0 第二步:在classpath目录下,创建一个c3p0-config.xml 第三步:创建工 ...
- Mysql DBA 20天速成教程,DBA大纲
Mysql DBA 20天速成教程 基本知识1.mysql的编译安装2.mysql 第3方存储引擎安装配置方法3.mysql 主流存储引擎(MyISAM/innodb/MEMORY)的特点4.字符串编 ...
- bzoj1025: [SCOI2009] 游戏 6
DP. 每种排法的长度对应所有循环节长度的最小公倍数. 所以排法总数为和为n的几个数的最小公倍数的总数. #include<cstdio> #include<algorithm> ...
- vfp 操作excel
VFP全面控制EXCEL 收藏 VFP和Excel都可以用来进行处理数据库表格,如果巧妙地将二者的优点结合起来,将会大大方便我们的工作.比如我们可以利用VFP进行处理数据,而利用Excel的预览打印功 ...
- 使用RMAN迁移文件系统数据库到ASM
--================================== -- 使用RMAN迁移文件系统数据库到ASM --================================== 在实际 ...
- SharePoint 2010 master page 控件介绍(5):其他
转:http://blog.csdn.net/lgm97/article/details/6409227 <!-- 处理搜索按下"enter"键和点击后退按钮 --> ...
- Gradle使用手册(二):项目结构
原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Using-sourceCompatibility-1. ...
- Hbase学习笔记(安装和基础知识及操作)
1.Hbase简介 1.面向列的分布式数据库 2. 以HDFS作为文件系统 3. 利用MapReduce处理Hbase中海量数据 4. ZookKeeper作为协调工具 5. sqoop提供Hbase ...
- Selenium webdriver 之select 控件封装,解决onchange问题
使用webdriver的时候,select 控件经常会绑定onchange 事件,在selenium2.09 之前click 方法对onchange 事件有bug,2.09 以后修复了,但是根据经验也 ...