2013-05-20 60 views
2

我有不同的(HTML和JSON)结果类型的Struts2操作。他们使用共同的拦截器。拦截器获取结果类型

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

例如,我的Action.ERROR转发到JSP页面。如果操作是JSON类型,我想转发JSON错误。

+0

您目前如何确定操作是否为“JSON类型”?你可以在'PreResultListener'中得到结果代码,但是行为应该和结果分离,这就是模式的一个重点。其他选项包括检查请求。 –

回答

0

我有不同的(HTML和JSON)结果类型的Struts2操作。他们使用共同的拦截器。如果需要拦截请求,如何根据给定的动作结果类型返回结果?

例如,我的Action.ERROR转发到JSP页面。如果操作是JSON类型,我想转发JSON错误。请指教。

虽然是事实,一个动作不是,这也是事实,如果一个动作被称为一个AJAX的方式,像一个动作返回JSON,其所有结果应该具有相同结果类型(本例中为JSON),除非您使用单个Action来执行不同的逻辑操作(ajax和非ajax操作,即反模式);

这就是说,如果你想回到正确的GLOBAL错误结果,从所使用的所有操作(每一个与它的结果类型)的拦截器内,根据自己的其他结果键入(比方说: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>的作用范围;

因为你可以(/应该)有经典动作(延伸json-default一个<package>)两种不同的封装(一<package>延伸struts-default)和JSON操作,你可以简单地定义两个不同的全局错误结果为每个包具有相同名称但结果类型不同;通过这种方式,拦截器将调用相对于当前Action的包的输出,从而输出所需类型的结果。

1

在Struts2中,该操作没有类型。这意味着您不能配置操作的类型。相反,您可以在xml配置中配置结果类型。在xml配置文件中,它被定义为result-type标签。当使用result标记配置结果时,您将指定type属性,该属性将用于确定相应的结果类型。假设name="success"name="error"dispatcher结果类型的结果。

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

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

ResultConfig有可能被用来确定结果的类型className属性。