Java——Spring MVC响应输出

响应中产生结果主要有两种方式:
  @ResponseBody 产生响应文本,返回字符串
  ModelAndView 利用模板引擎渲染输出,返回页面

1.@ResponseBody

@ResponseBody直接产生响应体的数据,过程不涉及任何视图。
@ResponseBody可产生标准字符串/JSON/XML等格式数据。
@ResponseBody被StringHttpMessageConverter所影响。

2.ModelAndView

ModelAndView对象是指“模型(数据)与视图(界面)”对象。
通过ModelAndView可将包含数据对象与模板引擎进行绑定。
Spring MVC中默认的View是JSP,也可以配置其他模板引擎。

在webapp目录下面,创建一个JSP文件。
然后编写控制器:

@GetMapping("/view")
public ModelAndView showView(){
    //测试根路径为webapp,/view.jsp与view.jsp均可。
    ModelAndView mav = new ModelAndView("/view.jsp");
    return mav;
}

 一般后端返回页面的时候肯定需要传入参数,因此我们需要向View页面中注入参数:

@GetMapping("/view")
public ModelAndView showView(@RequestParam(value = "userid") Integer userId){
    UserInfo userInfo = new UserInfo();
    if (userId == 1){
        userInfo.setName("科比");
        userInfo.setMobile("13167246031");
        userInfo.setAddress("湖北罗田");
    } else {
        userInfo.setName("陈星");
        userInfo.setMobile("18972068500");
        userInfo.setAddress("湖北安陆");
    }
    ModelAndView mav = new ModelAndView("/view.jsp");
    mav.addObject("user",userInfo);
    return mav;
}

然后在JSP页面中就可以接收了:
<h3>user:${user.name}</h3>
<h3>user:${user.address}</h3>
访问页面:

 在view中返回map、list都是可行的,不仅只有对象:
Map<String, String> map=new HashMap<String, String>();
map.put("sex","男");
mav.addObject("map",map);

或者直接返回一个字符串也行:
mav.addObject("msg", "我要返回值");

3.ModelAndView的核心用法

mav.addObject()方法设置的属性默认存放在当前请求中。
默认ModelAndView使用请求转发(forward)至页面。就是将当前请求原封不动的传递给view.jsp。addObecj()因此可以在当前请求中存放数据。
重定向使用new ModelAndView("redirect:/view.jsp"),所谓重定向就是发请一个新的请求来访问view.jsp

在请求/view的过程中,链接并没有发生变化:

 如果我们使用ModelAndView("redirect:/view.jsp"),那么页面就会发生跳转:

 URL其实发生了变化。
我们发现参数不见,那是因为原先包含数据的那个请求被清空了。那么如何解决数据丢失的问题?
ModelAndView mav = new ModelAndView();
mav.setViewName("/view.jsp"); //建议使用绝对路径,软件设计要减少对外部环境的依赖
mav.addObject("user",userInfo);
return mav;

我们只要在运行期间设置地址就可以。

4.String与ModelMap 

ModelMap可以实现与ModelAndView类似的功能。

@GetMapping("/show")
public String show(ModelMap modelMap){
    String view = "/um/view.jsp";
    modelMap.addAttribute("msg","我是传奇");
    return view;
}

方法被@ResponseBody描述,SpringMVC直接响应String字符串本身

@GetMapping("/show")
@ResponseBody
public String show(ModelMap modelMap){
    String view = "/um/view.jsp";
    modelMap.addAttribute("msg","我是传奇");
    return view;
}

原文地址:https://www.cnblogs.com/yangmingxianshen/p/12521560.html