使用@Controller 注解的处理器的处理器方法,
其返回值常用的有四种类型:
第一种:ModelAndView
第二种:String
第三种:无返回值 void
第四种:返回自定义类型对象
ModelAndView: 有数据和视图,对视图执行forward(转发)。
代码实例:
@RequestMapping(value = "/other.do", method = RequestMethod.POST)
public ModelAndView doOter(@RequestParam(value = "rname") String name,
@RequestParam(value = "rage") Integer age) {
ModelAndView mv = new ModelAndView();
mv.addObject("myname", name);
mv.addObject("myage", age);
mv.setViewName("other");
return mv;
}
在使用时,若该处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何 资源跳转(如对页面的 Ajax 异步响应),此时若返回 ModelAndView,则将总是有一部分多 余:要么 Model 多余,要么 View 多余。即此时返回 ModelAndView 将不合适。
String:表示视图,可以逻辑名称,也可以是完整视图路径(返回的是一个地址)
代码实例:
@RequestMapping(value = "/returnStrinng-view.do", method = RequestMethod.POST)
public String doReturnString(HttpServletRequest request, String name, Integer age) {
request.setAttribute("myname", name);
request.setAttribute("myage", age);
return "other";
}
//完整视图路径(不配置视图解析器)
@RequestMapping(value = "/returnStrinng-view2.do", method = RequestMethod.POST)
public String doReturnString2(HttpServletRequest request, String name, Integer age) {
request.setAttribute("myname", name);
request.setAttribute("myage", age);
//这样不可以配置视图解析器,否则会路径拼接错误
return "/WEB-INF/view/other.jsp";
}
对于处理器方法返回 void 的应用场景,AJAX 响应.
若处理器对请求处理后,无需跳转到其它任何资源,此时可以让处理器方法返回 void。
代码实例:
//未使用框架进行简化
@RequestMapping(value = "/returnVoid-ajax.do", method = RequestMethod.POST)
public void ReturnVoid(HttpServletResponse response, String name, Integer age) throws IOException {
System.out.println(name + " " + age);
//处理ajax,使用json做数据的格式
//server调用完成了
Student student = new Student();
student.setAge(age);
student.setName(name);
String json = "";
//把结果的对象转为json格式的数据
if (student != null) {
ObjectMapper om = new ObjectMapper();
json = om.writeValueAsString(student);
System.out.println("student 的 json格式 :" + json);
}
//输出数据,响应ajax的请求
response.setContentType("application/json;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println(json);
pw.flush();
pw.close();
}
ajax实现步骤
现在做ajax, 主要使用json的数据格式。 实现步骤:
1.加入处理json的工具库的依赖, springmvc默认使用的jackson。
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-coreartifactId>
<version>2.9.8version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.8version>
dependency>
2.在sprigmvc配置文件之间加入 <mvc:annotation-driven> 注解驱动。
json = om.writeValueAsString(student);
<mvc:annotation-driven/>
3.在处理器方法的上面加入@ResponseBody注解
response.setContentType("application/json;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println(json);
处理器方法也可以返回 Object 对象。这个 Object 可以是 Integer,String,自定义对象, Map,List 等。但返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。
返回对象,需要使用@ResponseBody 注解,将转换后的 JSON 数据放入到响应体中。
代码实例
/**
* 处理器方法返回一个Student,通过框架转为json,响应ajax请求
*
* @ResponseBody 作用:把处理器方法返回对象转为json后,通过HttpServletResponse输出给浏览器
* 位置:方法定义的上面,和其他注解没有顺序的关系
*
* 返回对象框架的处理流程:
* 1. 框架会把返回Student类型,调用框架的中ArrayList中每个类的canWrite()方法
* 检查那个HttpMessageConverter接口的实现类能处理Student类型的数据--MappingJackson2HttpMessageConverter
*
* 2.框架会调用实现类的write(), MappingJackson2HttpMessageConverter的write()方法
* 把李四同学的student对象转为json, 调用Jackson的ObjectMapper实现转为json
* contentType: application/json;charset=utf-8
*
* 3.框架会调用@ResponseBody把2的结果数据输出到浏览器, ajax请求处理完成
*/
@RequestMapping(value = "/returnStudentJson.do")
@ResponseBody
public Student ReturnStudentJson(String name, Integer age) {
//调用service,获取请求结果数据
Student student = new Student();
student.setName("LH同学");
student.setAge(age);
return student;
}
@RequestMapping(value = "/returnStudentJsonList.do")
@ResponseBody
public List<Student> ReturnStudentJsonArray(String name, Integer age) {
//调用service,获取请求结果数据
List<Student> stulist = new ArrayList<>();
Student student = new Student();
student.setName("LH同学");
student.setAge(age);
stulist.add(student);
student = new Student();
student.setName("HSY同学");
student.setAge(18);
stulist.add(student);
return stulist;
}
即在@RequestMapping中添加produces属性
produces = “text/plain;charset=utf-8”
对应 要在前端代码的ajax中的js部分去除 dataType: "json"
代码实例:
/**
* 处理器方法返回的是String , String表示数据的,不是视图。
* 区分返回值String是数据,还是视图,看有没有@ResponseBody注解
* 如果有@ResponseBody注解,返回String就是数据,反之就是视图
*
* 默认使用“text/plain;charset=ISO-8859-1”作为contentType,导致中文有乱码,
* 解决方案:给RequestMapping增加一个属性 produces, 使用这个属性指定新的contentType.
* 返回对象框架的处理流程:
* 1. 框架会把返回String类型,调用框架的中ArrayList中每个类的canWrite()方法
* 检查那个HttpMessageConverter接口的实现类能处理String类型的数据--StringHttpMessageConverter
*
* 2.框架会调用实现类的write(), StringHttpMessageConverter的write()方法
* 把字符按照指定的编码处理 text/plain;charset=ISO-8859-1
*
* 3.框架会调用@ResponseBody把2的结果数据输出到浏览器, ajax请求处理完成
*/
@RequestMapping(value = "/returnStringData.do", produces = "text/plain;charset=utf-8")
@ResponseBody
public String doStringData(String name, Integer age) {
return "Hello SpringMVC 返回对象,表示数据";
}