我有带有不同(HTML和JSON)结果类型的Struts2操作。他们使用通用拦截器。
如果需要拦截请求,如何根据给定的操作结果类型返回结果?
例如,我Action.ERROR转发到JSP页面。如果操作是JSON类型,我想转发JSON错误。
Action.ERROR
我有带有不同(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内部返回正确的 GLOBAL错误结果 ,则基于它们的 _ 其他 结果类型( SUCCESS_ 假设:,假设每个Action都有一个SUCCESS结果),这是做它的方式:
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>;
<package>
因为您可以(/应该)为Classic Actions(<package>扩展名struts-default)和JSON Actions(<package>扩展名)具有两个不同的包json-default,所以您可以 为每个具有相同名称但结果类型不同的包 简单地 定义两个不同的全局错误结果 ;这样,拦截器将相对于当前Action的程序包调用一个,从而输出所需的结果。
struts-default
json-default