在拦截器中获取结果类型

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

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

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

回答:

我有带有不同(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的程序包调用一个,从而输出所需的结果。

以上是 在拦截器中获取结果类型 的全部内容, 来源链接: utcz.com/qa/415071.html

回到顶部