#在这个教程中你将会看到不同的方法创建自己的拦截器栈,使用action类关联它。
#Struts形成于一系列的提前定义好的拦截器和拦截器栈。struts-default.xml文件包含了struts-default 包,这个包定义了所有的拦截器和拦截器栈。你可以使用栈来满足你的需要。
当你从struts-default包扩展你自己的包时,通过默认的defaultStack将适用于你包下的所有的action。通过以下的方法在struts-default.xml文件中配置。
<default-interceptor-ref name="defaultStack"/>#现在让我们创建自己的拦截栈, interceptor-stack元素用于创建一个拦截器栈。一个栈包含了一组拦截器。栈中的每一个拦截器被定义使用元素 interceptor-ref。在这个例子中,我们将会创建一个栈相似于defaultStack,通过我们的需要自定义有效的烂机器。
#在SampleAction类中有三个方法,populate(),execute()和validate()。因为我们从ActionSupport继承,ActionSupport实现了Validateable接口,action类的方法validate()通过工作流程的拦截器将会被创建。通过默认的validate()方法在执行的过程中会调用populate()和方法execute(),但是只有当execute()方法被被调用时我们才需要validate()方法。
#我通过在 有效拦截器的excludeMethodes元素确定计算好的方法。
#struts.xml文件包含以下的代码:
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <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" method="{1}" class="vaannila.SampleAction"> <interceptor-ref name="exampleStack" /> <result name="populate">/first.jsp</result> <result name="success">/success.jsp</result> </action> </package> </struts>
如果你看我们的exampleStack我们需要做的唯一改变就是,我们已经改变了有效拦截器的excludeMethods,剩下的都和defaultStack相似。这仅仅是为了展示怎样创建自己的拦截器栈,你也可以以更简单的方法达到相同的效果。
#你可以从defaultStack扩展你的额栈,按以下方式重新有效拦截器的excludeMethodes参数来完成相同的结果。
<struts> <package name="default" extends="struts-default"> <action name="*Sample" method="{1}" class="vaannila.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> </struts>#类SampleAction如下:
#当你使用defaultStack没有任何改变运行代码时。控制台将会输出以下消息:package vaannila; import com.opensymphony.xwork2.ActionSupport; public class SampleAction extends ActionSupport{ private static final long serialVersionUID = 1L; 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; } }
validate() method called populate() method called validate() method called execute() method called
#当你使用创建的exampleStack运行代码时,控制台输出以下信息:
#你可以看validate()方法在populate中没有被调用。通过这种方式你可以根据你的需求自定义栈。populate() method called validate() method called execute() method called