2012-05-31 15:40:18.0|分类: struts|浏览量: 1808
|
情景: 由于业务的需要,我需要对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();
}
}
|
