处理器方法的返回值
使用@Controller 注解的处理器的处理器方法,其返回值常用的有四种类型
1.ModelAndView
2.String
3.void
4.自定义类型对象
1.返回ModelAndView
若处理器方法处理完后,需要跳转到其他资源,且又要在跳转的资源间传递数据,此时处理器方法
返回ModelAndView比较好。当然,若要返回ModelAndView,则处理器方法中需要定义ModelAndView对象
在使用时,若该处理器方法只是进行跳转而不传递数据或只是传递数据而不向任何资源跳转(如对页面的Ajax异步响应)
此时若返回ModelAndView,则将总是有一部分多余:要么Model多余,要么View多余。即此时返回ModelAndView 不合适
2.返回String
1.返回内部资源逻辑视图名
2.返回View对象名
1 // 返回 内部资源逻辑视图名 (若只跳转不返回数据,则可以直接使用 String 作为返回值) 2 @RequestMapping(value = "/returnString1.do") 3 public String method() { 4 return "/WEB-INF/jsp/hello.jsp"; // 注册了 视图解析器 之后,好像就只能去 return 视图对象的 5 // id名,才能找到对应的视图 6 } 7 8 // 返回 外部资源逻辑视图名 (需 注册一个 视图解析器 。并定义id 为 taobao 的视图对象) 9 @RequestMapping(value = "/returnString2.do") 10 public String method2() { 11 return "taobao"; 12 }
3.返回void:
对于处理器方法返回void的应用场景,主要有两种:
1.通过ServletAPI 传递数据并完成跳转
2.AJAX 响应
1 // 返回 void ,通过 servlet里面的 API 完成数据的处理和跳转 2 @RequestMapping(value = "/returnVoid.do") 3 public void method3(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { 4 request.setAttribute("name", "xzk"); 5 request.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(request, response); 6 } 7 8 //返回 void ,通过AJAX 进行异步请求相应,不需要指定返回的视图,会自动返回到请求的页面 9 @RequestMapping(value = "/ajax.do") 10 public void method4(String name,int age,HttpServletResponse response) throws IOException { 11 //处理器对于 AJAX 请求中所提交的参数,可以使用逐个接受的方式,也可以以对象的方式整体接收。只要保证AJAX请求参数与接收对象的属性名称一致 12 Map<String, Object> map = new HashMap<String, Object>(); 13 //数据存储到 Map 中 14 map.put("name", name); 15 map.put("age", age); 16 17 //将 map 转为 JSON 18 JSONObject jsonObject = JSONObject.fromObject(map); 19 //得到JSON字符串 20 String jsonStr = jsonObject.toString(); 21 //将数据发回客户端(json字符串) 22 23 PrintWriter out = response.getWriter(); 24 out.print(jsonStr); 25 out.close(); 26 }
4.返回Object
处理器方法也可以放回Object 对象。但返回的这个Object对象不是作为逻辑视图出现的,
而是作为直接在页面显示的数据出现的
返回Object对象,需要使用 @ResponseBody 注解,将转换后的JSON数据放入到响应体中
环境搭建:1.导入Jar包 2.注册注解驱动
1 @Controller 2 @RequestMapping("/test") 3 public class MyController { 4 5 // 返回 Obejct ,但返回的这个Object对象 6 // 不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的(需要将Object转成JSON给浏览器页面,所以需要 jackson 7 // jar包)(为什么JSONObject 不可以呢,因为SpringMVC会自动去调jackson,是配套的,而不会自己去调用JSONObject吧,) 8 // 返回 Object 对象 ,需要使用 @ResponseBody 注解 ,将转换后的JSON数据 放入到响应体 中 9 @RequestMapping(value = "/ajax.do") 10 @ResponseBody 11 public Object method() { 12 return 99.99; 13 } 14 15 //返回字符串对象 (如果里面包含中文,需要使用 produces 来 限制输出结果的类型 ) 16 @RequestMapping(value = "/ajaxString.do",produces="text/html;charset=utf-8") 17 @ResponseBody 18 public String method2() { 19 return "99.99 字符"; 20 } 21 22 //返回自定义类型对象 23 @RequestMapping(value = "/ajaxPerson.do") 24 @ResponseBody 25 public Person method3() { 26 27 return new Person("徐泽昆",20); 28 } 29 30 //返回Map集合 31 @RequestMapping(value = "/ajaxMap.do") 32 @ResponseBody 33 public Map<String,Object> method4() { 34 Map<String,Object> map = new HashMap<String,Object>(); 35 map.put("person1", new Person("徐泽昆1",21)); 36 map.put("person2", new Person("徐泽昆2",22)); 37 38 return map; 39 } 40 41 //返回List 集合 42 @RequestMapping(value = "/ajaxList.do") 43 @ResponseBody 44 public List<Person> method5() { 45 List<Person> list = new ArrayList<Person>(); 46 list.add(new Person("徐泽昆1",21)); 47 list.add(new Person("徐泽昆2",22)); 48 list.add(new Person("徐泽昆3",23)); 49 return list; 50 } 51 }
1 <script type="text/javascript"> 2 3 $(function() { 4 /* 按钮的 点击响应事件 */ 5 $("button").click(function() { 6 $.ajax({ 7 //ajax 默认的请求方式是 GET,get方式 我们的 Spring 字符拦截器拦截不到,所以在这里设置成Post 8 type:"post", 9 //url:"test/ajax.do", 10 //url:"test/ajaxString.do", 11 //url:"test/ajaxPerson.do", 12 //url:"test/ajaxMap.do", 13 url:"test/ajaxList.do", 14 //后台处理成功后,会自动返回到 这里,(这里交流的方式是通过 json 字符串,给后台的是json,返回来的也是json) 15 success:function(data){ 16 //遍历这个 List 集合 17 $(data).each(function(index) { 18 alert(data[index].username + " " + data[index].age); 19 }); 20 } 21 }); 22 }); 23 }); 24 </script>
时间: 2024-11-02 11:00:22