一、ModelAndView
若处理器放心处理完后,需要跳转到其它资源,且又要在跳转的资源间传递数据,此时处理器方法返回ModelAndView比较好。当然,若要返回到ModelAndView,则处理器方法中需要定义ModelAndView对象。
在使用时,若该处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何资源跳转(如对页面的Ajax异步响应),此时返回ModelAndView,则将总是有一部分多余,要么Model多余,要么View多余,即此时返回ModelAndView将不合适。
二、String
处理器方法返回的字符串可以指定逻辑视图名,通过视图解析器解析可以将其转换为物理视图地址。简而言之String相当于ModelAndView里面的View,只返回视图,没有数据。
当然,我们也可以给它手动加上数据
@RequestMapping(value = "/dosome")
public String dosome(HttpServletRequest request,String name,Integer age)
{
request.setAttribute("myname",name);
request.setAttribute("myage",age);
return "show";
}
也可以用String直接返回文本数据
@RequestMapping(value = "/dosome",prouces = "text/plain;charset=utf-8")
@ResponseBody
public String dosome()
{
return "返回的文本";
}
三、Void
对于处理器方法返回void的应用场景,AJAX响应,若处理器对请求处理后,无需跳转到其它任何资源,此时可以让处理器方法返回void。简而言之就是,不能表示数据,也不能表示视图。
使用场景:AJAX的异步请求响应。通过HttpServletResponse输出数据,响应AJAX请求。AJAX请求服务器端返回的就是数据,和视图无关。
class Student {
private String name;
private Integer age;
get...
set...
}
public void dosome(HttpServletResponse response,String name,Integer age) throws IOException{
Student student = new Student();
student.setName(name);
student.setAge(age);
//JSON格式化对象
String json = "";
if(student != null)
{
ObjectMapper om = new ObjectMapper();
json = om.writeValueAsString(student);
}
//输出数据,响应ajax请求
response.setContentType("application/json;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println(json);
pw.flush();
pw.close();
}
四、Object
处理器方法也可以返回Object对象。这个Object可以是Integer、String、自定义对象、Map、List等。但返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。返回对象,需要使用@ResponseBody注解,将转换后的JSON数据放入到响应体中。简而言之,Object是对象,对象有属性,属性就是数据,所以返回Object表示数据,和视图无关。
<!--加入驱动注解-->
<mvc:annotation-driven>
@RequestMapping(value = "/dosome")
@ResponseBody
public String dosome(HttpServletRequest request,String name,Integer age)
{
//调用service,获取请求结果数据,Student对象标识结果数据
Student student = new Student();
student.setName("松松");
student.setAge(22);
return student;//会被框架转为json
}
@ResponseBody的作用:把处理器返回对象转为json后,通过HttpServletResponse输出给浏览器,位置放在方法定义上面,和其它注解没有顺序之间的关系。