@RequestMapping的Spring多重返回类型

时间:2013-11-13 21:41:26

标签: java spring spring-mvc

我的问题是关于Spring MVC的功能。

@RequestMapping("SOME_VALUE")
RETURN_TYPE NAME_OF_FUNCTION (PARAMS){
     STATEMENTS;
}

RETURN_TYPE是否依赖于语句?

例如:当用户点击某个链接时,如果某个条件为真,我希望用户下载一个文件(即返回一个byte [])但是如果它是false,我想向用户显示一个网页可能的选项(即ModelAndView对象)。

现在我明白它可以简单地在页面中使用javascript实现,但回到我的原始问题,Spring MVC中是否有一种方法可以为我们提供更好的处理?

2 个答案:

答案 0 :(得分:1)

Spring 3.2+(我不确定以前的版本)的工作原理如下。无论返回类型如何,都会通过反射调用处理程序方法@RequestMapping注释。 Spring接收其返回值并调度已注册的HandlerMethodReturnValueHandler以处理返回值(如果它支持它)。

HandlerMethodReturnValueHandler种类,@ResponseBodyResponseEntityStringModelAndView等等。您可以看到大部分类型在javadoc中。

这样做的一个丑陋方法是将方法定义为

RequestMapping("SOME_VALUE")
public Object NAME_OF_FUNCTION (PARAMS){
    if (something) {
        return "a string";
    } else if (somethingElse) {
        return new ResponseEntity(new byte[] {1,2,3});
    } else 
        return new OtherType();
}

Spring将使用HandlerMethodReturnValueHandler返回supportsReturnType的第一个true


在我看来,你不应该这样做。您应该尽可能地将条件设为外部条件,即来自请求。这样,您可以在@RequestMapping中映射条件并使用多个@RequestMapping方法,每种方法对应一种可能的条件。

答案 1 :(得分:1)

当你想要返回一个页面,或者将它设置为重定向(即“redirect:/ mydownloadablefile”)时,你可以简单地返回String并将其设置为JSP文件的名称(即“myjsppage”),而不是返回Object。你想开始下载。对于后一种情况,您还需要添加另一个带有“/ mydownloadablefile”URL请求映射的控制器方法。

相关问题