2014-03-03 25 views
1

我想在Struts2中編寫一個攔截器,它根據某些條件將請求重定向到不同的操作。我的攔截器工作正常,如下所示。Struts2 ActionContext setName方法不起作用

public String intercept(ActionInvocation actionInvocation) throws Exception { 
     ActionContext actionContext=actionInvocation.getInvocationContext(); 
     String actionName=actionContext.getName(); 
     String actionResult=null; 
     if(actionName.equals("admin")) 
     { 
      System.out.println("admin"); 
      //if(based on some condition) 
      actionContext.setName("ErrorPageForLinkAccess"); 
        System.out.println(actionContext.getName()); 
     } 
     actionResult = actionInvocation.invoke(); 
     return actionResult; 
    } 

Struts配置

<action name="other"> 
<result>Jsp/other.jsp</result> 
</action> 
<action name="admin" class="com.example.Admin" method="adminDemo"> 
<result name="success">Jsp/admin.jsp</result> 
</action> 
<action name="ErrorPageForLinkAccess"> 
    <result name="success">Jsp/ErrorPageForLinkAccess.jsp</result> 
</action> 

當過我叫管理行動,控制檯輸出

admin 
ErrorPageForLinkAccess 

但還是它不是調用動作ErrorPageForLinkAccess而調用admin行動。 爲什麼我面臨這個問題?

+0

設置名稱不會改變執行的操作。而是從攔截器返回一些不同的結果,並在struts.xml中配置此結果。 –

+0

如果您不重寫默認行爲,您將設置無用的值,Struts將爲您設置操作名稱。 –

+0

@Aleksandr你的建議是好的,但我的要求是不同的。我想打電話diffeerent行動不只是返回結果。因爲我需要爲每個操作配置結果名稱。 – mahesh

回答

0

由於動作已經解決並由調度程序調用,所以您面臨此問題,因此在動作上下文中更改動作名稱是毫無用處的。 Struts在過濾器中完成了這項操作

ActionMapping mapping = prepare.findActionMapping(request, response, true); 
if (mapping == null) { 
    boolean handled = execute.executeStaticResourceRequest(request, response); 
    if (!handled) { 
     chain.doFilter(request, response); 
    } 
} else { 
    execute.executeAction(request, response, mapping); 
} 
+0

然後他們爲什麼要提供setName() – mahesh

+0

@mahesh這是一個設置器來爲bean設置'name'。 Struts並不關心你將如何使用它。 –