一、返回值的分类
(1)字符串
controller方法 返回字符串 可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
指定逻辑视图名,经过视图解析器解析为jsp 物理路径:/WEB-INF/pages/success.jsp
@RequestMapping("/testString") public String testString(Model model) { System.out.println("testString()执行了...");
User user = new User(); user.setUsername("哈哈"); user.setPassword("xmgl0609"); user.setAge(30);
model.addAttribute("user",user); return "success"; }
|
(2)void
我们知道Servlet 原始API 可以作为控制器中方法的参数。则可以使用request 或response 指定响应结果,例如请求转发,重定向,响应数据等
@RequestMapping("/testVoid") public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("testVoid()方法执行了..."); request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
response.sendRedirect(request.getContextPath() + "index.jsp");
response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); response.getWriter().print("你好"); }
|
(3)ModelAndView
ModelAndView是SpringMVC为我们提供的一个对象,顾名思义是一个model和View的结合,该对象也可以用作控制器方法的返回值。
可以封装存储addObject()对象 同时可以选择setViewName()跳转的页面。
@RequestMapping("/testModelAndView") public ModelAndView testModelAndView() { ModelAndView mv = new ModelAndView(); System.out.println("testModelAndView()执行了...");
User user = new User(); user.setUsername("哈哈"); user.setPassword("xmgl0609"); user.setAge(30);
mv.addObject("user",user);
mv.setViewName("success");
return mv; }
|
注意: mv.addObject(“user”,user); 想在页面获得这个对象。
使用的是requestScope.username取的,所以返回ModelAndView类型时,浏览器跳转只能是请求转发。
二、转发和重定向
(1)forward转发
controller方法在提供了String类型的返回值之后,默认就是请求转发。
即return字符串,就是在forward:/WEB-INF/pages/success.jsp
@RequestMapping("/testForwardOrRedirect") public String testForwardOrRedirect() { System.out.println("testForwardOrRedirect()执行了..."); return "forward:/WEB-INF/pages/success.jsp"; }
|
需要注意的是,如果用了formward:则路径必须写成实际视图url,不能写逻辑视图。 它没有使用试图解析器。
它相当于“request.getRequestDispatcher(“url”).forward(request,response)”。使用请求转发,既可以转发到jsp,也可以转发到其他的控制器方法。(servlet)
(2)Redirect重定向
@RequestMapping("/testForwardOrRedirect") public String testForwardOrRedirect() { System.out.println("testForwardOrRedirect()执行了..."); return "redirect:/index.jsp"; }
|
它相当于response.sendRedirect(url)。需要注意的是,如果是重定向到jsp页面,则jsp页面不能写在WEB-INF目录中,否则无法找到。(一般都是写在webapp下,或者它下面的子文件夹里)
三、ResponseBody响应json数据
该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端。
需要加入jackson的包
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0</version> </dependency>
|
则在前端jsp中,
<script src="js/jquery.min.js"></script>
<script> $(function(){ $("#btn").click(function(){ $.ajax({ url:"user/testAjax", contentType:"application/json;charset=UTF-8", data:'{"username":"hehe","password":"123","age":30}', dataType:"json", type:"post", success:function(data){ alert(data); alert(data.username); alert(data.password); alert(data.age); } });
}); });
</script>
<button id="btn">发送ajax的请求</button>
|
控制器中的代码:
@RequestMapping("/testAjax") public @ResponseBody User testAjax(@RequestBody User user) { System.out.println("testAjax()执行了...");
System.out.println(user); user.setUsername("haha"); user.setAge(40);
return user; }
|
运行的结果:
1.控制台打印json格式的User内容
2.在jsp页面,会获取到 data服务器端响应的json的数据,进行解析,然后显示在弹出框中。