我有具有不同(HTML 和 JSON)结果类型的 Struts 2 操作。他们使用通用拦截器。
如果需要拦截请求,如何根据给定的action结果类型返回结果?
例如我的
Action.ERROR
转发到JSP页面。如果action是JSON类型,我想返回JSON错误。
在 Struts2 中,动作没有类型。这意味着您无法配置操作的类型。相反,您可以在 xml 配置中配置结果类型。在 xml 配置文件中,这被定义为
result-type
标签。当您使用 result
标签配置结果时,您指定将用于确定相应结果类型的 type
属性。假设 name="success"
或 name="error"
是 dispatcher
结果类型的结果。
当动作被拦截时你可以得到结果
Map<String, ResultConfig> results = actionInvocation.getProxy().getConfig().getResults();
在
ResultConfig
中有 className
属性,可用于确定结果的类型。
我有具有不同( HTML 和 JSON )结果类型的 Struts2 操作。他们使用共同的拦截器。如果需要拦截请求,如何根据给定的action结果类型返回结果?
例如,我的Action.ERROR转发到JSP页面。如果操作是 JSON 类型,我想转发 JSON 错误。请指教。
虽然 Action 确实没有 type,但如果以 AJAX 方式调用 Action(如返回 JSON 的操作),其所有结果应该 都具有相同的结果类型(JSON 中),这也是事实。这种情况),除非您使用单个 Action 来执行不同的逻辑操作(ajax 和非 ajax 操作,这是一种反模式);
也就是说,如果您想从所有操作(每个操作都有其结果类型)使用的拦截器内部返回正确的GLOBAL错误结果,基于它们的other结果类型(让我们说:
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>
的struts-default
)和JSON操作(扩展<package>
的json-default
),您可以简单地定义两个不同的全局错误结果:每个包具有相同的名称但不同的结果类型;这样拦截器就会调用当前Action的包相关的方法,输出想要的结果。