返回值分类
字符串
controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp
void
Servlet 原始 API 可以作为控制器中方法的参数:
@RequestMapping("/testReturnVoid")
public void testReturnVoid(HttpServletRequest request,HttpServletResponse response) throws Exception { }
在controller 方法形参上可以定义 request和 response,使用 request 或 response 指定响应结果:
1、使用 request 转向页面,如下:
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
2、也可以通过 response 页面重定向:
response.sendRedirect("testRetrunString")
3、也可以通过 response 指定响应结果,例如响应 json 数据:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("------json 串------");
ModelAndView
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
/** * 返回 ModeAndView * @return */ @RequestMapping("/testReturnModelAndView") public ModelAndView testReturnModelAndView() { ModelAndView mv = new ModelAndView(); mv.addObject("username", "张三"); //添加到ModelMap中 this.getModelMap().addAllAttributes(model);
mv.setViewName("success"); //用于设置逻辑视图名称, 视图解析器会根据名称前往指定的视图
return mv;
}
响应的 jsp代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>执行成功</title> </head> <body> 执行成功! ${requestScope.username} </body> </html>
注意:
我们在页面上获取使用的是 requestScope.username 取的,所以返回 ModelAndView 类型时,浏览器跳转只能是请求转发。
转发和重定向
forward 转发
controller方法在提供了String类型的返回值之后,默认就是请求转发。我们也可以写成:
/** * 转发 * @return */ @RequestMapping("/testForward") public String testForward() { System.out.println("AccountController的testForward 方法执行了。。。。"); return "forward:/WEB-INF/pages/success.jsp"; }
如果用了forward:则路径必须写成实际视图url,不能写逻辑视图。
Redirect重定向
在返回值里使用:redirect:
/** * 重定向 * @return */ @RequestMapping("/testRedirect") public String testRedirect() { System.out.println("AccountController的testRedirect 方法执行了。。。。"); eturn "redirect:testReturnModelAndView"; }
它相当于“response.sendRedirect(url)”。
需要注意的是,如果是重定向到jsp页面,则jsp页面不能写在WEB-INF目录中,否则无法找到。
ResponseBody响应json数据
作用:
该注解用于将控制器的方法返回的对象, 通过HttpMessageConverter接口转换为指定格式的数据:
如 json, xml 通过Response响应给客户端
示例:
需求: 使用@ResponseBody注解实现将controller方法返回对象转换为json响应给客户端。
Springmvc默认用MappingJacksonHttpMessageConverter对json数据进行转换,需要加入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="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"> <script> // 页面加载,绑定单击事件 $(function(){ $("#testJson").click(function(){ // alert("hello btn"); // 发送ajax请求 $.ajax({ // 编写json格式,设置属性和值 url:"user/testAjax", contentType:"application/json;charset=UTF-8", data:'{"username":"hehe","password":"123","age":30}', dataType:"json", type:"post", success:function(data){ // data服务器端响应的json的数据,进行解析 console.log(data); console.log(data.username); console.log(data.password); console.log(data.age); } }); }); });
</script>
<!-- 测试异步请求 -->
<input type="button" value="测试ajax请求json和响应json" id="testJson"/>
控制器中的代码
/** * 模拟异步请求响应 */ @RequestMapping("/testAjax") public @ResponseBody User testAjax(@RequestBody User user){ System.out.println("testAjax方法执行了..."); // 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中 System.out.println(user); // 做响应,模拟查询数据库 // 修改一下数据 user.setUsername("XiaoLi's Wife"); user.setAge(31); // 做响应 return user; }
运行结果: