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. ...
随机推荐
- 当当开源sharding-jdbc,轻量级数据库分库分表中间件
近期,当当开源了数据库分库分表中间件sharding-jdbc. Sharding-JDBC是当当应用框架ddframe中,从关系型数据库模块dd-rdb中分离出来的数据库水平分片框架,实现透明化数据 ...
- 关于hadoop的环境变量
export PATH export JAVA_HOME=/opt/jdk1.7 export PATH=$PATH:$JAVA_HOME/bin 为什么/etc/profile 添加了环境变量had ...
- node.js模块之http模块
如果你想向远程服务器发起HTTP 连接,Node 也是很好的选择.Node 在许多情景下都很适合使用,如使用Web service,连接到文档数据库,或是抓取网页.你可以使用同样的http 模块来发起 ...
- python学习笔记六--用户自定义类
一.类: 1. 面向对象. 2. 定义了新的对象类型. 定义了两个属性:name,pay 定义了两个方法:lastName,giveRaise
- Linux内核与根文件系统的关系1
Linux内核与根文件系统的关系开篇题外话:对于Linux初学者来说,这是一个很纠结的问题,但这也是一个很关键的问题!一语破天机: “尽管内核是 Linux 的核心,但文件却是用户与操作系统交互所采用 ...
- 【ZOJ】3609 Modular Inverse
1. 题目描述求乘法逆元. 2. 基本思路利用扩展gcd求逆元,模板题目. 3. 代码 /* 3609 */ #include <iostream> #include <sstrea ...
- python中的commands模块
commands模块用于调用shell命令 有3中方法: commands.getstatus() 返回执行状态 commands.getoutput() 返回执行结果 commands.ge ...
- 告诉你一个真实的OpenStack:都谁在用,用来干什么?
告诉你一个真实的OpenStack:都谁在用,用来干什么? OpenStack基金会近日发布的双年调查报告显示,开源云计算软件OpenStack正在进入主流企业市场,但该项目依然面临较难部署和管理的老 ...
- Hibernate中的query.setFirstResult(),query.setMaxResults();
一.query.scroll()和query.setFirstResult(),query.setMaxResults();这两种方法都可以取到一定范围内的数据,用来数据分页显示.那么两者区别,以及两 ...
- JXL获取excel批注
/** * Jxl.jar(2.6.12) * @author lmiky * @date 2011-11-26 */ public class JxlTest { /** * 测试获取批注 * @a ...