在拦截器中获取结果类型
我有带有不同(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