Struts2的Interceptor

通过下面的例子,你会看到用不同的方式来创建自己的拦截器和相关联的Action类。

Struts2配备了一套预定义的拦截器和拦截器栈,你可以使用它通过在struts.xml文件中包含struts-default包,它定义所有拦截器和拦截器栈。你可以使用堆栈满足你的需要,也就是说当你的包继承struts-default包时,你包中所有的Action都可以使用defaultStack。struts-default.xml文件通过下面这种方式配置拦截器。

<default-interceptor-refname="defaultStack"/>
现在我们定义自己的拦截器栈,拦截器栈元素用于创建一个拦截器。一个拦截器栈包含一组拦截器。在堆栈中的每个拦截器使用interceptor-ref元素定义。在这个例子中,我们将会创建一个类似于defaultStack的堆栈并根据我们的需要定义验证拦截器。

在SampleAction中有三个方法,populate() , execute() 和validate() 。因为我们的类继承了ActionSupport类,而ActionSupport实现了Validateable接口,所以Action中的validate()方法将会被调用通过workflow拦截器。默认情况下在执行populate和execute方法执行是将调用validate方法,但是我们需要的仅仅是execute方法是才调用。我们实现它通过validation的参数中的excludeMethods 里指定populate方法。

<struts>
	<constant name="struts.i18n.encoding" value="GBK" />
	<constant name="struts.devMode" value="true" /> 
	
	<package name="dispatcher" extends="struts-default">
		<action name="*User" class="com.zcl.struts.dispatcheraction.UserAction" method="{1}">
			<result name="success">/success.jsp</result>
		</action>
	</package>
	<package name="default" extends="struts-default">
		 <interceptors>
			<interceptor-stack name="exampleStack">
				<interceptor-ref name="exception" />
				<interceptor-ref name="alias" />
				<interceptor-ref name="servletConfig" />
				<interceptor-ref name="prepare" />
				<interceptor-ref name="i18n" />
				<interceptor-ref name="chain" />
				<interceptor-ref name="debugging" />
				<interceptor-ref name="profiling" />
				<interceptor-ref name="scopedModelDriven" />
				<interceptor-ref name="modelDriven" />
				<interceptor-ref name="fileUpload" />
				<interceptor-ref name="checkbox" />
				<interceptor-ref name="staticParams" />
				<interceptor-ref name="actionMappingParams" />
				<interceptor-ref name="params">
					<param name="excludeParams">dojo\..*,^struts\..*</param>
				</interceptor-ref>
				<interceptor-ref name="conversionError" />
				<interceptor-ref name="validation">
					<param name="excludeMethods">populate</param>
				</interceptor-ref>
				<interceptor-ref name="workflow">
					<param name="excludeMethods">input,back,cancel,browse</param>
				</interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<action name="*Sample" class="com.zcl.struts.interceptor.SampleAction" method="{1}">
			<interceptor-ref name="exampleStack" />
			<result name="populate">/first.jsp</result>
			<result name="success">/success.jsp</result>
		</action>
	</package>
</struts>   

现在我们来实现SampleAction,其中包含三个方法:

package com.zcl.struts.interceptor;

import com.opensymphony.xwork2.ActionSupport;

public class SampleAction extends ActionSupport{
	public void validate(){
		System.out.println("validate() method called") ;
	}
	public String populate(){
		System.out.println("populate() method called") ;
		return "populate" ;
	}
	public String execute(){
		System.out.println("execute() method called") ;
		return SUCCESS ;
	}
}
在index.jsp页面中我们定义一个跳转。

<META HTTP-EQUIV="Refresh" CONTENT="0;URL=populateSample.action">
然后在first.jsp中定义提交按钮。

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Dispatcher</title>
  </head>
  <body>
  <s:form action="Sample">
  	<s:submit></s:submit>
  </s:form>
  </body>
</html>

在success.jsp中随便显示一个信息:

<h2>success<h2>
我们通过index.jsp跳转到first.jsp,此时调用populate方法,然后提交表单,调用validate方法和execute方法。结果如下:

populate() method called
validate() method called
execute() method called

当然我们也能使用defaultStack并覆写excludeMethods达到相同的目地。

<package name="default" extends="struts-default">
		<action name="*Sample" method="{1}" class="com.zcl.struts.interceptor.SampleAction">
			<interceptor-ref name="defaultStack">
				<param name="validation.excludeMethods">populate</param>
			</interceptor-ref>
			<result name="populate">/first.jsp</result>
			<result name="success">/success.jsp</result>
		</action>
	</package>



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值