在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—拦截器的更多相关文章

  1. Struts2 拦截器配置以及实现

    @(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...

  2. struts2 拦截器

    拦截器:对Action的访问.可以拦截到Action中某个方法.与过滤器不同,过滤器过滤的是请求.过滤JSP.html.但是拦截器不能拦截jsp.html的访问. Struts2 拦截器在访问某个 A ...

  3. Struts2拦截器的使用 (详解)

    Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...

  4. struts2拦截器

    一.自定义拦截器 struts2拦截器类似于servlet过滤器 首先定义一个拦截器这个拦截器实现了Interceptor接口: package cn.orlion.interceptor; impo ...

  5. Struts2拦截器模拟

    前言: 接触Struts2已经有一段时间,Student核心内容就是通过拦截器对接Action,实现View层的控制跳转.本文根据自身理解对Struts2进行一个Java实例的模拟,方便大家理解! 示 ...

  6. Struts2拦截器初涉

    Struts2拦截器初涉 正在练习struts,本例是从一个pdf上摘抄的例子,那本pdf都不知道叫什么名字,不过感觉很适合初学者. 在这里要实现一个简单的拦截器"GreetingInter ...

  7. 浅谈Struts2拦截器的原理与实现

    拦截器与过滤器           拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...

  8. 基于SSH2框架Struts2拦截器的登录验证实现(转)

        大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了.那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证.     修改数 ...

  9. struts2拦截器interceptor的三种配置方法

    1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...

  10. Struts2拦截器原理以及实例

    一.Struts2拦截器定义 1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. ...

随机推荐

  1. margin,border,padding简介

    站在图中心 Content 的角度理解: margin为外边框,border为边框,padding为内边框. 在xml中设置: 如果上下左右的距离都是相同可以通过 android:layout_mar ...

  2. Android 内核初识(1)下载源码需求与教程

    官方文档: http://source.android.com/source/requirements.html  Requirements The Android build is routinel ...

  3. Angularjs中input的指令和属性

    建议添加 novalidate属性(可无值)到form标签上,这样可以保证在表单不合法的情况下阻止浏览器继续提交数据. 可以给表单元素 input 添加 required 属性(可无值),让该表单成为 ...

  4. poj 1459 Power Network(增广路)

    题目:http://poj.org/problem?id=1459 题意:有一些发电站,消耗用户和中间线路,求最大流.. 加一个源点,再加一个汇点.. 其实,过程还是不大理解.. #include & ...

  5. 根据block取出页号buf_block_get_page_no

    /*********************************************************************//** Gets the page number of a ...

  6. 【MySql存储过程】DATE_ADD用法

    定义和用法 DATE_ADD() 函数向日期添加指定的时间间隔. 语法 DATE_ADD(date,INTERVAL expr type) date 参数是合法的日期表达式.expr 参数是您希望添加 ...

  7. -_-#【Dom Ready / Dom Load】

    Dom Ready和Dom Load DOM Ready 详解 javascript的domReady 域名解析 - 加载html - 加载js和css - Dom Ready - 加载图片等其他信息 ...

  8. java.sql.DataTruncation: Data truncation

    问题一: 用jdbc插入数据时,当数据库表中某列设置的长度小于要插入的字符的实际长度时就会抛出此异常. 如:数据表中某列char [4],长度为4,插入:"Hello"时,字符&q ...

  9. 在 ASP.NET MVC4 中使用 NInject

    Ninject是一个快如闪电.超轻量级的基于.Net平台的依赖注入框架.它能够帮助你把应用程序分离成一个个松耦合.高内聚的模块,然后用一种灵活的方式组装起来.通过使用Ninject配套你的软件架构,那 ...

  10. (六)学习MVC之标签a提交页面

    标签<a>如何做到与<input type="submit"/>一样有提交页面信息的效果? @using (Html.BeginForm("Log ...