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