SpringMVC-响应数据和结果视图
1.返回值分类
1.1 字符串
Controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
/** * String 返回值 * 指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/pages/success.jsp * @param model * @return */ @RequestMapping("/testString") public String testString(Model model){ System.out.println("testString方法执行了..."); User user = new User(); user.setUsername("张三"); user.setAge(18); user.setSex("女"); // 存储 model.addAttribute("user", user); return "success"; }
1.2 void,没有返回值
Servlet原始API可以作为控制器中方法的参数。
(1) 使用request请求转发:
/** * 没有返回值 * @param */ @RequestMapping("/testVoid") public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { User user = new User(); user.setUsername("张三"); user.setAge(18); user.setSex("女"); //存储 request.setAttribute("user", user); System.out.println(user); //请求转发 request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response); //设置中文乱码 response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); return; }
(2) 使用response重定向:
//重定向 response.sendRedirect(request.getContextPath()+ "/response.jsp");
(3) 可以通过response指定相应结果。例如响应json数据。
//直接会进行响应 response.getWriter().print("hello");
1.3 ModelAndView
ModelAndView是SpringMVC为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
/** * ModelAndView:数据存储+视图跳转 * @param modelAndView * @return */ @RequestMapping("/testModelAndView") public ModelAndView testModedAndView(ModelAndView modelAndView){ User user = new User(); user.setUsername("王五"); user.setSex("男"); user.setAge(16); //存储 modelAndView.addObject("user", user); //跳转视图 modelAndView.setViewName("success"); return modelAndView; }
2. 转发和重定向
2.1 forward转发
controller方法在提供了String类型的返回值之后,默认就是请求转发。我们也可以写成:
/** * 使用关键字的方式进行转发和重定向 * @return */ @RequestMapping("/testForwardOrRedirect") public String testForwardOrRedirect(){ //请求转发 return "forward:/WEB-INF/pages/success.jsp"; }
注意:如果用了forward:则路径必须写成实际视图url,不能写成逻辑视图。
相当于“request.getRequestDispatcher("url").forward(request,response);”。使用请求转发,既可以转发到jsp,也可以转发到其他的控制器方法。
2.2 Redirect重定向
contrller 方法提供了一个 String 类型返回值之后,它需要在返回值里使用:redirect:
/** * 使用关键字的方式进行转发和重定向 * @return */ @RequestMapping("/testForwardOrRedirect") public String testForwardOrRedirect(){ //请求转发 // return "forward:/WEB-INF/pages/success.jsp"; //重定向 return "redirect:/response.jsp"; }
它相当于“response.sendRedirect(url)”。如果是重定向到的jsp页面,则页面不能在WEB-INF
3. ResponseBody响应json数据
3.1 使用说明
作用:该注解将Controller方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据。如:json,xml等,通过Response响应给客户端。
3.2 使用示例
使用@ResponseBody注解实现将controller方法返回对象转换为json响应给客户端。
SpringMVC默认用MappingJacksonHttpMessageConverter对json数据进行转换,需要加入依赖。
pom.xml:
<!--jackson--> <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> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> </dependencies>
controller代码:
// /** // * 模拟异步请求响应 // * @param body // */ // @RequestMapping("/testAjax") // public void testAjax(@RequestBody String body){ // System.out.println(body); // } // /** * 模拟异步请求响应 * @param user */ @RequestMapping("/testAjax") public @ResponseBody User testAjax(@RequestBody User user){ System.out.println(user); // 做响应 user.setUsername("孙悟空"); user.setSex("男"); user.setAge(18); return user; }
ajax请求:
<head> <title>Title</title> <%--<script src="js/jquery.min.js"></script>--%> <script src="https://code.jquery.com/jquery-3.0.0.min.js"></script> <script> // 页面加载,绑定点击事件 $(function(){ $("#btn").click(function () { // alert("hello"); // 发送ajax请求 $.ajax({ url:"user/testAjax", contentType:"application/json;charset=UTF-8", data:'{"username":"张三","age":"19","sex":"女"}', dataType:"json", type:"post", success:function (data) { alert(data); alert(data.username); alert(data.age); alert(data.sex); } }); }); }); </script> </head> <body> <button id="btn">发送ajax</button>
源码:github