响应中产生结果主要有两种方式:
@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; }