我的问题是关于Spring MVC的功能。
@RequestMapping("SOME_VALUE")
RETURN_TYPE NAME_OF_FUNCTION (PARAMS){
STATEMENTS;
}
RETURN_TYPE是否依赖于语句?
例如:当用户点击某个链接时,如果某个条件为真,我希望用户下载一个文件(即返回一个byte [])但是如果它是false,我想向用户显示一个网页可能的选项(即ModelAndView对象)。
现在我明白它可以简单地在页面中使用javascript实现,但回到我的原始问题,Spring MVC中是否有一种方法可以为我们提供更好的处理?
答案 0 :(得分:1)
Spring 3.2+(我不确定以前的版本)的工作原理如下。无论返回类型如何,都会通过反射调用处理程序方法@RequestMapping
注释。 Spring接收其返回值并调度已注册的HandlerMethodReturnValueHandler
以处理返回值(如果它支持它)。
有HandlerMethodReturnValueHandler
种类,@ResponseBody
,ResponseEntity
,String
,ModelAndView
等等。您可以看到大部分类型在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请求映射的控制器方法。