您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在拦截器中获取结果类型

在拦截器中获取结果类型

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

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

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

就是说,如果您想从所有Action(每个都有其结果类型的Action)使用的Interceptor内部返回正确的 ,则基于它们的 _ 结果类型( 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的程序包调用一个,从而输出所需的结果。

其他 2022/1/1 18:13:37 有717人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶