1 redirect、redirectaction和chain 的区别
当使用type=“redirectAction” 或type=“redirect”提交到一个action并且需要传递一个参数时:
使用type=“redirectAction”时,结果就只能写Action的配置名,不能带有后缀:“.action”。
Xml代码
<action name="Login" class="steven.actions.LoginAction">
<result name="success" type="redirectAction">User?u_id=${loginBean.u_id}</result>
</action>
使用type=“redirect”时,结果应是action配置名+后缀名
Xml代码
<action name="Login" class="steven.actions.LoginAction">
<result name="success" type="redirect">User.action?u_id=${loginBean.u_id}</result>
</action>
redirect:action处理完后重定向到一个视图资源(如:jsp页面),请求参数全部丢失,action处理结果也全部丢失。
redirect-action:action处理完后重定向到一个action,请求参数全部丢失,action处理结果也全部丢失。
chain:action处理完后转发到一个action,请求参数全部丢失,action处理结果不会丢失
2 Structs2 流程
3 Structs 拦截器
structs2 拦截器是需要继承AbstractInterceptor 类,在xwork-core.jar 里面。
代码如下:
@Override public String intercept(ActionInvocation ai) throws Exception { Map session = ai.getInvocationContext().getSession(); Object action = ai.getAction(); String methodName = ai.getProxy().getMethod(); if(action instanceof UserAction && "login".equals(methodName)) { return ai.invoke(); } User user = (User)session.get(Constants.LOGIN_USER_SESSION); if(user == null) { return com.opensymphony.xwork2.Action.LOGIN; } else { ai.invoke(); return com.opensymphony.xwork2.Action.SUCCESS; } }
这里的return login和success 会返回到配置文件定义的页面、
配置文件:
<interceptors> <!-- 定义权限检查拦截器 --> <interceptor name="loginInterceptor" class="com.scjx.sysmanage.interceptor.LoginInterceptor"/> <!-- 定义一个包含权限检查的拦截器栈 --> <interceptor-stack name="myDefaultStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="loginInterceptor"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
首先是定义了一个拦截器,然后定义了一个拦截器栈,最后再把拦截器栈注入到默认的拦截器。
拦截器栈的执行顺序是 执行的时候是正着来,action 执行之后回来的时候是反着来。
方法过滤拦截器MethodFilterInterceptor,是对某个方法进行拦截。
<interceptor-ref name="myInterceptor3"> <param name="includeMethods">execute</param> <param name="excludeMethods">execute</param> </interceptor-ref>
其中includeMethods ,excludeMethods是固定写法: includeMethods?包含拦截那些方法,多个方法需要用”,”隔开;?excludeMehtods是排除拦截的那些方法;
参考资料:http://www.open-open.com/lib/view/open1338339244354.html