2

我有不同(HTML 和 JSON)结果类型的 Struts 2 操作。他们使用通用拦截器。

如果需要拦截请求,如何根据给定的动作结果类型返回结果?

例如,我的Action.ERROR转发到 JSP 页面。如果 action 是 JSON 类型,我想转发 JSON 错误。

4

2 回答 2

1

在 Struts2 中,动作没有类型。这意味着您无法配置操作的类型。相反,您可以在 xml 配置中配置结果类型。在 xml 配置文件中,这被定义为result-type标记。当您使用result标签配置结果时,您指定type将用于确定相应结果类型的属性。说name="success"或是结果类型name="error"dispatcher结果。

当动作被拦截时,您可以获得结果

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

在其中ResultConfigclassName可用于确定结果类型的属性。

于 2013-05-21T11:04:54.733 回答
0

我有不同(HTML 和 JSON)结果类型的 Struts2 操作。他们使用通用拦截器。如果需要拦截请求,如何根据给定的动作结果类型返回结果?

例如,我的 Action.ERROR 转发到 JSP 页面。如果 action 是 JSON 类型,我想转发 JSON 错误。请指教。

尽管 Action 没有type是正确的,但如果以 AJAX 方式调用 Action,例如返回 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>

由于您可以(/应该)为 Classic Actions(一个<package>扩展struts-default)和 JSON Actions(一个<package>扩展)有两个不同的包json-default,您可以简单地为每个具有相同名称但不同结果类型的包定义两个不同的全局错误结果;这样,Interceptor 将调用与当前 Action 的包相关的那个,输出所需的结果类型。

于 2013-05-22T11:58:54.383 回答