SpringMVC-方法四种类型返回值总结,你用过几种?
SpringMVC 现在算是 Java 领域的一个基础性框架了,很多人天天用,可是对于 SpringMVC 方法的返回值,你又是否完全清楚呢?今天松哥就来和大家聊一聊 SpringMVC 中四种不同类型的返回值,看看有没有 get 到你的知识盲点?
1. ModelAndView
以前前后端不分的情况下,ModelAndView 应该是最最常见的返回值类型了,现在前后端分离后,后端都是以返回 JSON 数据为主了。后端返回 ModelAndView 这个比较容易理解,开发者可以在 ModelAndView 对象中指定视图名称,然后也可以绑定数据,像下面这样:
@RequestMapping("/book")
public ModelAndView getAllBook() {
ModelAndView mv = new ModelAndView();
List<Book> books = new ArrayList<>();
Book b1 = new Book();
b1.setId(1);
b1.setName("三国演义");
b1.setAuthor("罗贯中");
books.add(b1);
Book b2 = new Book();
b2.setId(2);
b2.setName("红楼梦");
b2.setAuthor("曹雪芹");
books.add(b2);
//指定数据模型
mv.addObject("bs", books);
mv.setViewName("book");//指定视图名
return mv;
}
返回 ModelAndView ,最常见的两个操作就是指定数据模型+指定视图名 。
2. Void
返回值为 void 时,可能是你真的没有值要返回,也可能是你有其他办法,松哥将之归为如下四类,大伙来看下。
2.1 没有值
如果确实没有返回值,那就返回 void ,但是一定要注意,此时,方法上需要添加 @ResponseBody 注解,像下面这样:
@RequestMapping("/test2")
@ResponseBody
public void test2(){
//你的代码
}
2.2 重定向
由于 SpringMVC 中的方法默认都具备 HttpServletResponse 参数,因此可以重拾 Servlet/Jsp 中的技能,可以实现重定向,像下面这样手动设置响应头:
@RequestMapping("/test1")
@ResponseBody
public void test1(HttpServletResponse resp){
resp.setStatus(302);
resp.addHeader("Location","/aa/index");
}
也可以像下面这样直接调用重定向的方法:
@RequestMapping("/test1")
@ResponseBody
public void test1(HttpServletResponse resp){
resp.sendRedirect("/aa/index");
}
当然,重定向无论你怎么写,都是 Servlet/Jsp 中的知识点,上面两种写法都相当于是重回远古时代。
2.3 服务端跳转
既然可以重定向,当然也可以服务端跳转,像下面这样:
@GetMapping("/test5")
public void test5(HttpServletRequest req,HttpServletResponse resp) {
req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req,resp);
}
2.4 返回字符串
当然也可以利用 HttpServletResponse 返回其他字符串数据,包括但不局限于 JSON,像下面这样:
@RequestMapping("/test2")
@ResponseBody
public void test2(HttpServletResponse resp) throws IOException {
resp.setContentType("application/json;charset=utf-8");
PrintWriter out = resp.getWriter();
List<Book> books = new ArrayList<>();
Book b1 = new Book();
b1.setId(1);
b1.setName("三国演义");
b1.setAuthor("罗贯中");
books.add(b1);
Book b2 = new Book();
b2.setId(2);
b2.setName("红楼梦");
b2.setAuthor("曹雪芹");
books.add(b2);
String s = new Gson().toJson(books);
out.write(s);
out.flush();
out.close();
}
这是返回值为 void 时候的情况,方法返回值为 void ,不一定就真的不返回了,可能还有其他的方式给前端数据。
3. String
当 SpringMVC 方法的返回值为 String 类型时,也有几种不同情况。
3.1 逻辑视图名
返回 String 最常见的是逻辑视图名,这种时候一般利用默认的参数 Model 来传递数据,像下面这样 :
@RequestMapping("/hello")
public String aaa(Model model) {
model.addAttribute("username", "张三");
return "hello";
}
此时返回的 hello 就是逻辑视图名,需要携带的数据放在 model 中。
3.2 重定向
也可以重定向,事实上,如果在 SpringMVC 中有重定向的需求,一般采用这种方式:
@RequestMapping("/test4")
public String test4() {
return "redirect:/aa/index";
}
3.3 forward 转发
也可以 forward 转发,事实上,如果在 SpringMVC 中有 forward 转发的需求,一般采用这种方式:
@RequestMapping("/test3")
public String test3() {
return "forward:/WEB-INF/jsp/order.jsp";
}
3.4 真的是 String
当然,也有一种情况,就是你真的想返回一个 String ,此时,只要在方法上加上 @ResponseBody 注解即可,或者 Controller 上本身添加的是组合注解 @RestController,像下面这样:
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello provider!";
}
}
也可以像下面这样 :
@Controller
public class HelloController {
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "hello provider!";
}
}
这是返回值为 String 的几种情况。
4. JSON
返回 JSON 算是最最常见的了,现在前后端分离的趋势下,大部分后端只需要返回 JSON 即可,那么常见的 List 集合、Map,实体类等都可以返回,这些数据由 HttpMessageConverter 自动转为 JSON ,如果大家用了 Jackson 或者 Gson ,不需要额外配置就可以自动返回 JSON 了,因为框架帮我们提供了对应的 HttpMessageConverter ,如果大家使用了 Alibaba 的 Fastjson 的话,则需要自己手动提供一个相应的 HttpMessageConverter 的实例,方法的返回值像下面这样:
@GetMapping("/user")
@ResponseBody
public User getUser() {
User user = new User();
List<String> favorites = new ArrayList<>();
favorites.add("足球");
favorites.add("篮球");
user.setFavorites(favorites);
user.setUsername("zhagnsan");
user.setPassword("123");
return user;
}
@GetMapping("/users")
@ResponseBody
public List<User> getALlUser() {
List<User> users = new ArrayList<>();
for (int i = 0; i < 10; i++) {
User e = new User();
e.setUsername("zhangsan:" + i);
e.setPassword("pwd:" + i);
users.add(e);
}
return users;
}
总结
好了,这是松哥为大伙总结的 SpringMVC 方法四种不同类型的返回值,难倒是不难!有问题欢迎大伙留言讨论。
关注公众号【江南一点雨】,专注于 Spring Boot+微服务,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!

SpringMVC-方法四种类型返回值总结,你用过几种?的更多相关文章
- Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现.如 ...
- 方法的重写与重载的区别(Override与Overload)。重载的方法是否可以改变返回值的类型
方法的重写(Override)与重载(Overload)的区别.重载的方法是否可以改变返回值的类型?[基础] 解释: 方法的重写overriding和重载Overloading是Java多态性的不同表 ...
- Overloaded的方法是否可以改变返回值的类型
摘要: 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同) Overload是重载的意思,Override是覆盖的意思,也就是重写. 重载 ...
- Override和Overload差别,Overloaded的方法能否够改变返回值的类型?
Overload是重载的意思, Override是覆盖的意思,也就是重写. 重载Overload表示同一个类中能够有多个名称同样的方法,但这些方法的參数列表各不同样(即參数个数或类型不同). 重写Ov ...
- Overload重載和Override重写的区别。Overloaded的方法是否可以改变返回值的类型?
Overload是重载的意思,Override是覆盖的意思,也就是重写. 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同). 重写Ove ...
- Java常见面试题02-方法重写和方法重载的区别?方法重载能改变返回值类型吗?
方法重写和方法重载的区别?方法重载能改变返回值类型吗? A:Override方法重写和Overload方法重载的区别? Overload是否可以改变返回值类型?可以 方法重写 • 子类中 ...
- sring mvc 返回值至jsp界面的几种方式
Spring 通过Controller 向 View 传值的方法有以下四种 HttpServletRequest ModelAndView Map<String, Object> map ...
- springMVC源码分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(二)
在上一篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)我们介绍了返回值解析器HandlerMethodReturnValueHand ...
- 2. Bean Validation声明式校验方法的参数、返回值
你必须非常努力,才能干起来毫不费力.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众 ...
随机推荐
- wpf 代码设置图片路径(后台和xamll)
项目中经常使用背景图片,当一个小组共通开发时,路径的选择应该是在项目运行的固定文件夹下 此时,可用代码实现:pack://SiteOfOrigin:,,,/Images/Icons/HomePageB ...
- AI人脸识别的测试重点
最常见的 AI应用就是人脸识别,因此这篇文章从人脸识别的架构和核心上,来讲讲测试的重点. 测试之前需要先了解人脸识别的整个流程,红色标识代表的是对应AI架构中的各个阶段 首先是人脸采集. 安装拍照摄像 ...
- linux 中断底半部机制对比(任务队列,工作队列,软中断)--由linux RS485引出的血案【转】
转自:http://blog.chinaunix.net/uid-20768928-id-5077401.html 在LINUX RS485的使用过程中,由于各种原因,最后不得不使用中断底半部机制的方 ...
- django中嵌套的try-except
# 因为此时为yaml模板,而且只抓取node port,所以这样处理效率快content_dict = parse_yaml(content.replace("{{", &quo ...
- Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n ...
- Spring(003)-消费返回list的rest服务
通过spring提供的RestTemplate就可以访问rest服务.首先需要创建一个RestTemplate,这个需要手动来创建bean @Configuration public class De ...
- Provider和Consumer的搭建(六)
创建三个Maven Project: dubbo-service:公共模块,包括服务接口(packaging:jar) dubbo-service-impl:服务提供方,提供服务接口的具体实现,需要依 ...
- hbase链接失败
https://blog.csdn.net/u010886217/article/details/84444046
- 继上篇博客对安卓爬虫以及TextView更新的问题解释
只能在主线程更新ui,或者用handler传输.爬虫是在另一个异步线程进行,所以爬出来的数据对控件赋值就比较麻烦.这次使用了线程数据传到runnable将数据传到handler进行赋值. 结果图: 源 ...
- reactjs中配置代理跨域
第一步,下载依赖 http-proxy-middleware yarn add http-proxy-middleware 第二步,在src下建立setupProxy.js const proxy = ...