虽然现在SpringBoot框架很火,但是SpringBoot并不能处理以及响应客户端的请求,最终还是要依赖SpringMVC框架,所以接下来介绍SpringMVC Controller方法的返回值类型,涵盖所有返回值类型。这篇博客只是扫盲点,没具体深入。
1. ModelAndView
- 我们在使用SpringMVC的时候,经常返回ModelAndView类型,现在前后端分离后,后端都是返回JSON格式数据为主。
- 返回 ModelAndView类型,我们可以在ModelAndView对象中指定视图名称,然后也可以绑定数据,如下面代码:
@RequestMapping("/userList")
public ModelAndView getAllUser(ModelAndView mv) {
List<User> users= userService.getAllUser();
//添加数据模型到request域中
mv.addObject("users", users);
mv.setViewName("userList");//指定视图名
return mv;
}
2.void
如果返回值为void的话,并不是真正没有返回值,而是会出现以下几种情况:
- 如果方法内真的没有返回值,那么SpringMVC默认把
deleteUser(映射的URL)
当成视图名称来解析,如果存在该视图,就返回给客户端;如果不存在该视图,就会报视图找不到异常。
@RequestMapping("/deleteUser")
public void deleteUser() {
//删除操作
}
通过加@ResponseBody来修改默认行为,加上该注解表示返回JSON数据,这里返回空JSON数据,而不是把URL当成视图名称来解析
@RequestMapping("/deleteUser")
@ResponseBody
public void deleteUser() {
//删除操作
}
- 请求转发
@GetMapping("/")
public void root(HttpServletRequest req,HttpServletResponse resp) {
req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req,resp);
}
- 重定向
@RequestMapping("/")
@ResponseBody
public void root(HttpServletResponse resp){
resp.setStatus(302);
resp.addHeader("Location","/WEB-INF/jsp/index.jsp");
}
@RequestMapping("/")
@ResponseBody
public void root(HttpServletResponse resp){
resp.sendRedirect("/WEB-INF/jsp/index.jsp");
}
3. String
当方法的返回值为String的时候,也会出现下面几种情况:
- 逻辑视图名
返回String最常见的是逻辑视图名,这种时候一般利用默认的参数Model来传递数据
@RequestMapping("/deleteUser")
//方法返回JSON数据
@ResponseBody
public String deleteUser(Model model) {
model.addAttribute("msg","删除成功");
return "userList";
}
- 重定向
登录失败的时候重定向到登录页面。
@RequestParam("/login")
public String redirect(User user){
if{
//登录成功...
}else{
//登录失败,重定向到登录页面
return "redirect:tologin";
}
}
- 请求转发
登录失败的时候请求转发到登录页面。
@RequestParam("/login")
public String redirect(User user){
if{
//登录成功...
}else{
//登录失败,转发到登录页面
return "forward:tologin";
}
}
- 真的返回String,相当于JSON格式的数据
@RequestMapping("/deleteUser")
@ResponseBody
public String deleteUser() {
try{
//删除成功
return "删除成功";
}catch(Exception e){
return "删除失败";
}
}
4.JSON
现在前后端分离的情况下,大部分后端只需要返回JSON数据即可,List 集合、Map集合,实体类等都可以返回,这些数据由 HttpMessageConverter自动转为JSON ,如果使用了Jackson或者Gson,不需要额外配置就可以自动返回JSON了,因为框架帮我们提供了对应的HttpMessageConverter ,如果使用了Alibaba的Fastjson的话,则需要自己手动提供一个相应的 HttpMessageConverter的实例,方法的返回值如下面代码:
@GetMapping("/getUser")
@ResponseBody
public User getUser() {
User user = userService.getUser();
return user;
}
@RequestMapping("/userList")
@ResponseBody
public List<User> getAllUser() {
List<User> users = userService.getAllUser();
return users;
}
好了,关于SpringMVC的返回值类型就总结完了,我们开发中也就是使用这几种返回值类型。