/********************************
关于配置:
1.package继承struts-default(struts2中已经配置的)2.当package中abstract属性为true时,下面不能陪action3.跳转类型(常用的):redirect(默认的),dispatcher,chain,redirect-action
这里要注意的是:一般action传值到页面(例如传userList到显示页面)跳转类型为redirect(也可以为chain.),但当一个action需要验证,传一个error时,跳转必须为dispatcher, 因为验证出错后 会跳转到input视图中,在input视图中要显示错误信息,错误信息又是在request空间中存储的,如果为redirect数据就无法传递
关于拦截器:
1.所有的action里的方法都是在拦截器栈中才能得以实现
2.可以在自己的某个action中,加入一个拦截器,例如timer,这时候必须要注意的是,当你在action中自己加拦截器后,默认的拦截器栈就不会起作用了,需要手动引入<package name="mypackage" extends="struts-default"> <action name="*user" class="com.tmaic.web.UserAction" method="{1}"> <result name="success">main.jsp</result> <result name="input">index.jsp</result> <interceptor-ref name="timer"></interceptor-ref> <interceptor-ref name="defaultStactk"></interceptor-ref> </action> </package>
3.也可以配置自己的拦截器栈,让所有的action都应用,这时引入的就不再是struts-delault而是自己配置的:<interceptor-stack name="myInterceptorStack"> <interceptor-ref name="myMethodInterceptor"></interceptor-ref> <interceptor-ref name="myTime"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myInterceptorStack"/>
4.如果要写自己的拦截器的话,继承AbstractInterceptor:package com.kaishengit.util; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyTimerInterceptor extends AbstractInterceptor{ private static final long serialVersionUID = 1L; private String name; @Override public String intercept(ActionInvocation invocation) throws Exception { long startTime = System.currentTimeMillis(); String result = invocation.invoke(); long execute = System.currentTimeMillis() - startTime; String actionName = invocation.getProxy().getActionName(); String method = invocation.getProxy().getMethod(); System.out.println("Name:" + name); System.out.println("执行"+actionName+"!"+method+"耗时:" + execute + "ms."); return result; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
5.这里运用到了代理模式,其中invocation.getProxy()得到的是Action的名字6.拦截器只能拦截struts2中的action,而过滤器全都过滤(但过滤器耦合http里的程序)