【问题标题】:Getting Result type in Interceptor在拦截器中获取结果类型
【发布时间】:2013-05-15 12:14:20
【问题描述】:

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

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

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

【问题讨论】:

  • 您目前如何确定该操作是否为“JSON 类型”?您可以在PreResultListener 中获取结果代码,但操作应该与其结果分离,这是模式的重点。其他选项,包括检查请求。

标签: java json struts2 interceptor actionresult


【解决方案1】:

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

当动作被拦截时,你可以得到结果

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

ResultConfig 中有className 属性,可用于确定结果的类型。

【讨论】:

    【解决方案2】:

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

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

    虽然 Action 没有 类型 是真的,但如果以 AJAX 方式调用 Action,就像返回 JSON 的动作一样,它的所有结果应该 具有相同的结果类型(在这种情况下为 JSON),除非您使用单个 Action 来执行不同的逻辑操作(ajax 和非 ajax 操作,这是一种反模式);

    也就是说,如果您想返回正确的 GLOBAL 错误结果,则从您的所有操作(每个操作都有其结果类型)使用的拦截器内部,基于它们的 其他结果类型(比如说:SUCCESS,假设每个Action都有一个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";
        }
    }
        
    
            
    

    虽然这在技术上是可行的,但我不鼓励这样做,因为......没有真正的理由这样做;

    出于您的目的,请记住每个全局结果都在其范围内 &lt;package&gt;;

    由于您可以(/应该)为经典操作(&lt;package&gt; 扩展 struts-default)和 JSON 操作(&lt;package&gt; 扩展 json-default)提供两个不同的包,您可以简单地定义两个不同的每个同名但结果类型不同的包的全局错误结果;这样,Interceptor 将调用与当前 Action 的包相关的那个,输出所需的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 2010-10-24
      相关资源
      最近更新 更多