Struts 2 中如何拦截一个动作并根据给定的动作结果类型返回结果?

问题描述 投票:0回答:2

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

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

例如我的

Action.ERROR
转发到JSP页面。如果action是JSON类型,我想返回JSON错误。

java json struts2 interceptor actionresult
2个回答
1
投票

在 Struts2 中,动作没有类型。这意味着您无法配置操作的类型。相反,您可以在 xml 配置中配置结果类型。在 xml 配置文件中,这被定义为

result-type
标签。当您使用
result
标签配置结果时,您指定将用于确定相应结果类型的
type
属性。假设
name="success"
name="error"
dispatcher
结果类型的结果。

当动作被拦截时你可以得到结果

Map<String, ResultConfig> results =  actionInvocation.getProxy().getConfig().getResults();

ResultConfig
中有
className
属性,可用于确定结果的类型。


0
投票

我有具有不同( 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的包相关的方法,输出想要的结果。

© www.soinside.com 2019 - 2024. All rights reserved.