2012-05-31 15:40:18.0|分类: struts|浏览量: 1635
情景: 由于业务的需要,我需要对namespace的为calculator并且type为layout的进行特殊的处理。 这就需要用到拦截器,如下配置文件 <package name="calculator" extends="default" namespace="/calculator"> <action name="index" class="com.CalculatorAction" method="index"> <result name="success" type="layout">/WEB-INF/calculator/index.jsp</result> </action>
1、拦截获得namespace很好做,代码: Object action = invocation.getAction(); String namespace = invocation.getProxy().getNamespace(); 2、但是怎么知道返回的结果是type="layout"的类型的呢? (1)在 interface ActionProxy 中看到了这个方法 ActionConfig getConfig(); (2)在class ActionConfig 中看到了这个方法: public Map<String, ResultConfig> getResults() { return results; } 这个就因该是要找的那个方法。 public class ResultConfig extends Located implements Serializable { private Map<String,String> params; private String className; private String name; .... } (3)测试一下是否和想的一样啊 ? ActionProxy ap = invocation.getProxy(); Map<String, ResultConfig> map = ap.getConfig().getResults(); Collection<ResultConfig> c = map.values(); Iterator it = c.iterator(); for (; it.hasNext();) { ResultConfig rc = (ResultConfig) it.next(); System.out.println( rc.getClassName()); System.out.println( rc.getName()); System.out.println( rc.getLocation()); System.out.println( rc.getParams()); } 打印的结果: /*** // * // * org.apache.struts2.dispatcher.ServletDispatcherResult // exception // global-results - file:/E:/javaHome/workspace2/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/fangdo/WEB-INF/classes/struts.xml:36:19 // {location=/WEB-INF/web/error.jsp} // com.core.view.LayoutResult // success // action - file:/E:/javaHome/workspace2/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/fangdo/WEB-INF/classes/struts/struts-calculator.xml:128:86 // {location=/WEB-INF/calculator/itemUser/listTax.jsp} // * */
(4)虽然没有直接表示type="layout"的这个属性,但是rc.getClassName()已经能完成,根据className就可以判断了。 完整代码:
package com.action.interceptor; import java.util.Map; import com.action.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionProxy; import com.opensymphony.xwork2.config.entities.ResultConfig; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class CustomerInterceptor extends AbstractInterceptor { private static final long serialVersionUID = 977669153564407337L; @Override public String intercept(ActionInvocation invocation) throws Exception { Object action = invocation.getAction(); ActionProxy actionProxy = invocation.getProxy(); String namespace = actionProxy.getNamespace(); if(action instanceof Action){ action = (Action)action; if(namespace.contains("calculator")){ Map<String, ResultConfig> map = actionProxy.getConfig().getResults(); ResultConfig resultConfig = map.get("success"); if(resultConfig!=null){ String className = resultConfig.getClassName(); if(className!=null && className.equals("com.core.view.LayoutResult")){ //要处理的代码 } } } } return invocation.invoke(); } }
|