小编典典

在拦截器中获取结果类型

json

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

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

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


阅读 497

收藏
2020-07-27

共1个答案

小编典典

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

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

尽管确实没有 类型 ,但如果以AJAX方式调用Action,例如返回JSON的Action,则其所有结果 都应
具有相同的结果类型(在这种情况下为JSON),这也是事实。您正在使用单个操作来执行不同的逻辑操作(ajax和non-ajax操作,这是一种反模式);

就是说,如果您想从所有Action(每个都有其结果类型的Action)使用的Interceptor内部返回正确的 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";
    }
}

尽管从技术上讲这是可行的,但我不鼓励这样做,因为……没有真正的理由这样做。

为了您的目的,请记住 每个 全局结果 都在其范围内 <package>

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

2020-07-27