springMVC响应数据和结果视图
返回值分类
1. 返回字符串
Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。
//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp @RequestMapping("/testReturnString") public String testReturnString() { System.out.println("AccountController 的 testReturnString 方法执行了。。。。"); return "success"; }
具体的应用场景
@Controller @RequestMapping("/user") public class UserController { /** * 请求参数的绑定 */ @RequestMapping(value="/initUpdate") public String initUpdate(Model model) { // 模拟从数据库中查询的数据 User user = new User(); user.setUsername("张三"); user.setPassword("123"); user.setMoney(100d); user.setBirthday(new Date()); // 如果在类上添加 @SessionAttributes(value= {"xxx"},types={xxx.class}) 注解, // 表示把数据也存一份到session域中 model.addAttribute("user", user); // 把数据保存到request域中
return "update";
}
}
<h3>修改用户</h3> ${ requestScope } <form action="user/update" method="post"> 姓名:<input type="text" name="username" value="${ user.username }"><br> 密码:<input type="text" name="password" value="${ user.password }"><br> 金额:<input type="text" name="money" value="${ user.money }"><br> <input type="submit" value="提交"> </form>
2. 返回值是void
1. 如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。
默认会跳转到@RequestMapping(value="/initAdd") initAdd的页面。
2. 可以使用请求转发或者重定向跳转到指定的页面
@RequestMapping(value="/initAdd") public void initAdd(HttpServletRequest request,HttpServletResponse response) throws Exception { System.out.println("请求转发或者重定向"); // 请求转发 // request.getRequestDispatcher("/WEB-INF/pages/add.jsp").forward(request, response); // 重定向 // response.sendRedirect(request.getContextPath()+"/add2.jsp"); // 直接响应数据 response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().write("{\"name\": \"lily\"}");
}
3. 返回值是ModelAndView对象
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
/** * 返回ModelAndView对象 * 可以传入视图的名称(即跳转的页面),还可以传入对象。 * @return * @throws Exception */ @RequestMapping(value="/findAll") public ModelAndView findAll() throws Exception { ModelAndView mv = new ModelAndView(); // 跳转到list.jsp的页面 mv.setViewName("list"); // 模拟从数据库中查询所有的用户信息 List<User> users = new ArrayList<>(); User user1 = new User(); user1.setUsername("张三"); user1.setPassword("123"); User user2 = new User(); user2.setUsername("赵四"); user2.setPassword("456"); users.add(user1); users.add(user2); // 添加对象,把数据存入request域中 mv.addObject("users", users); return mv; }
转发和重定向
1.forward请求转发
controller方法返回String类型,默认就是请求转发。请求转发也可以编写成
/** * 使用forward关键字进行请求转发 * "forward:转发的JSP路径",不走视图解析器了,所以需要编写完整的路径 * @return * @throws Exception */ @RequestMapping("/delete") public String delete() throws Exception { System.out.println("delete方法执行了..."); // return "forward:/WEB-INF/pages/success.jsp"; // 转发到jsp页面 return "forward:/user/findAll"; // 转发到控制器 }
@RequestMapping("/forward") public ModelAndView forward() { ModelAndView mv = new ModelAndView(); // mv.setViewName("forward:/WEB-INF/pages/success.jsp"); // 转发到jsp页面 mv.setViewName("forward:/hello"); // 转发到控制器 return mv; }
重定向:
/** * 重定向 * @return * @throws Exception */ @RequestMapping("/count") public String count() throws Exception { System.out.println("count方法执行了..."); // springMVC会自动补充完整 http://localhost:8080/项目名 return "redirect:/add.jsp"; // return "redirect:/user/findAll"; }
/*public ModelAndView redirect() { ...... }*/
注意:如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到
RedirectAttributes参数:
1. 使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面 ,如http://localhost:8080/test.jsp?a=a
2. 使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,
这里的redirect必须是方法映射路径,jsp无效。
@RequestMapping("/redirectAttributes") public String redirectAttributes(RedirectAttributes attr) { // attr.addAttribute("a", "a"); // return "redirect:/test.jsp"; attr.addFlashAttribute("b", "b"); return "redirect:/redirect"; }
ResponseBody响应json数据
作用:
该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据
如:json,xml 等,通过 Response 响应给客户端
注意:如果把@ResponseBody配置到方法中,则表示直接把返回值打印在浏览器页面上
使用@RequestBody获取请求体数据:
/** * 获取请求体的数据 * @param body */ @RequestMapping("/testJson") public void testJson(@RequestBody String body) { System.out.println(body); }
使用@RequestBody注解把json的字符串转换成JavaBean的对象:
/** * 获取请求体的数据 * @param address */ @RequestMapping("/testJson") public void testJson(@RequestBody Address address) { System.out.println(address); }
使用@ResponseBody注解把JavaBean对象转换成json字符串,直接响应:
@RequestMapping("/testJson") public @ResponseBody Address testJson(@RequestBody Address address) { System.out.println(address); address.setAddressName("上海"); return address; }
json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包
<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>