这次只是预热,将在下一次笔记中更具体的讲述。
返回值和HTTP响应有关。void表示方法手动处理了响应,Spring不需要再进行其他处理。然而可以回复其他类型,有时还带有annotation,告知Spring如何响应。这些都在以后学习,先粗略看看。
-
Model类型
- 返回Map<String, Object>、ModelMap或者Model
- Spring通过配置的org.springframework.web.servlet.RequestToViewNameTranslator确定使用哪个view View类型
- 返回一个指定的view来渲染响应,Spring提供了数十个View,我们也可以自定义。Controller可以返回String指出View的名字
- 方法可以返回ModelAndView,可以返回View和和model类型,或者view名字和model类型。 Response Body Entities
- 返回 HttpEntity<?>或org.springframework.http.ResponseEntity<?>(是HttpEntity的继承),Spring将根据协商的Content-Type,使用适当的转换器来处理响应。例子如下
-
@RequestMapping(value="user/{userId}", method=RequestMethod.GET) public ResponseEntity<User> getUser(@PathVariable("userId") long userId){ User user = this.userService.getUser(id); return new ResponseEntity<User>(user, HttpStatus.OK); } //上面等同与下面的写法 @RequestMapping(value="user/{userId}", method=RequestMethod.GET) @ResponseBody @ResponseStatus(HttpStatus.OK) public User getUser(@PathVariable("userId") long userId){ return this.userService.getUser(id); }
- 之前我们使用了@ResponseBody,返回String表示直接作为响应的body,而不使用view。
-
任意类型
- 对于其他类型,Spring将视为Model的属性。
-
//第一个例子,model的属性名字为userAccount(采用camelCase方式,也就是第一个单词首字母小写,其余的大写) @RequestMapping("user/{userId}") public UserAccount viewUser(@PathVariable("userId") long userId) { ... } //第二个例子,定义了@ModelAttribute,也就是指定model的属性名字为user @RequestMapping("user/{userId}") @ModelAttribute("user") public UserAccount viewUser(@PathVariable("userId") long userId) { ... }
-
异步类型
- 返回java.util.concurrent.Callable<?>或者org.springframework.web.context.request.async.DeferredResult<?>将采用异步处理,在其他线程处理Callable或者DeferredResult。
- 仍可以使用@ResponseBody, @ResponseStatus, @ModelAttribute。