2013-05-20 58 views
2

我有不同的(HTML和JSON)結果類型的Struts2操作。他們使用共同的攔截器。攔截器獲取結果類型

如果需要攔截請求,如何根據給定的動作結果類型返回結果?

例如,我的Action.ERROR轉發到JSP頁面。如果操作是JSON類型,我想轉發JSON錯誤。

+0

您目前如何確定操作是否爲「JSON類型」?你可以在'PreResultListener'中得到結果代碼,但是行爲應該和結果分離,這就是模式的一個重點。其他選項包括檢查請求。 –

回答

0

我有不同的(HTML和JSON)結果類型的Struts2操作。他們使用共同的攔截器。如果需要攔截請求,如何根據給定的動作結果類型返回結果?

例如,我的Action.ERROR轉發到JSP頁面。如果操作是JSON類型,我想轉發JSON錯誤。請指教。

雖然是事實,一個動作不是,這也是事實,如果一個動作被稱爲一個AJAX的方式,像一個動作返回JSON,其所有結果應該具有相同結果類型(本例中爲JSON),除非您使用單個Action來執行不同的邏輯操作(ajax和非ajax操作,即反模式);

這就是說,如果你想回到正確的GLOBAL錯誤結果,從所使用的所有操作(每一個與它的結果類型)的攔截器內,根據自己的其他結果鍵入(比方說:SUCCESS,假設每一個動作有一個SUCCESS結果),這是做它的方式:

public String intercept(ActionInvocation invocation) throws Exception { 

    // Get the action configuration defined in struts.xml 
    ActionConfig config = invocation.getProxy().getConfig(); 

    // Get the SUCCESS result configured for that Action 
    ResultConfig success = config.getResults().get("success"); 

    // Get the class of the SUCCESS result 
    Object clazz = success.getClass(); 

    /* .... oops, some error occurred !! 
     We now need to redirect to the right global error result .... */ 

    if (clazz instanceof org.apache.struts2.dispatcher.ServletDispatcherResult) { 
     log.debug("Struts2 Result type: CLASSIC"); 
     return "error"; 
    } else if (clazz instanceof org.apache.struts2.json.JSONResult) { 
     log.debug("Struts2 Result type: JSON"); 
     return "jsonError"; 
    } else { 
     log.debug("Struts2 Result type: SOMETHING ELSE, returning default "); 
     return "error"; 
    } 
} 

儘管這在技術上是可行的,我會阻止它,因爲...沒有真正的理由去做;

你的目的,請記住,每個全球結果在其<package>的作用範圍;

因爲你可以(/應該)有經典動作(延伸json-default一個<package>)兩種不同的封裝(一<package>延伸struts-default)和JSON操作,你可以簡單地定義兩個不同的全局錯誤結果爲每個包具有相同名稱但結果類型不同;通過這種方式,攔截器將調用相對於當前Action的包的輸出,從而輸出所需類型的結果。

1

在Struts2中,該操作沒有類型。這意味着您不能配置操作的類型。相反,您可以在xml配置中配置結果類型。在xml配置文件中,它被定義爲result-type標籤。當使用result標記配置結果時,您將指定type屬性,該屬性將用於確定相應的結果類型。假設name="success"name="error"dispatcher結果類型的結果。

當動作被攔截,你可以得到的結果

Map<String, ResultConfig> results = actionInvocation.getProxy().getConfig().getResults(); 

ResultConfig有可能被用來確定結果的類型className屬性。