框架提供了通用的功能
1.框架可以把处理器方法的返回值对象转为所需的数据格式,例如把Student转为json
//student转为json
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(student);
2.框架可以把转换后的数据(json,xml等)输出到浏览器
//输出json,响应ajax
PrintWriter pw = response.getWriter();
pw.println(json);
pw.flush();
pw.close();
框架实现通用的功能原理:
1.框架可以把处理器方法的返回值对象转为所需的数据格式,使用HttpMessageConverter接口和他的实现类完成
HttpMessageConverter叫做消息转换器, 他定义了把java对象转为json,xml,文本,二进制等数据格式的方法。
HttpMessageConverter接口的实现类有很多,这些实现类,完成对List,Map,Student,Integer, Float等
类型的转换操作。 把不同的返回值转为需要的数据格式(json,xml等等)
2.框架可以把转换后的数据(json,xml等)输出到浏览器
框架使用@ResponseBody的注解,完成把数据输出到应答体(浏览器)
PrintWriter pw = response.getWriter();
pw.println(json);
框架实现把处理器的方法返回值转为json,xml,二进制等数据的步骤:
1.加入处理json的工具库, springmvc默认使用jackson工具库。
2.在springmvc配置文件中,加入mvc:annotation-driven
目的是创建HttpMessageConverter接口的7个实现类对象
StringHttpMessageConverter : 处理器方法返回String,使用这个类处理String数据
MappingJackson2HttpMessageConverter:处理器方法返回对象, 转为json
3.处理器方法的上面加入@ResponseBody注解, 将数据输出到浏览器。
步骤:
1.新建 web project
2.导入jar:
spring的jar: spring-beans.jar,spring-core.jar,spring-context.jar, spring-expression.jar
spring-aop.jar, spring-web.jar
springmvc模块的jar:spring-webmvc.jar
json的工具库: jackson的相关jar
其他:commons-logging.jar, log4j.jar
3.注册springmvc框架的核心对象 :DispatherServlet
1)DispatherServlet它的父类继承了HttpServlet. 所以他是一个Servlet对象
2)DispatherServlet称为中央调度器(前端控制器 front controller)
3)DispatherServlet的作用是接收用户的请求,把处理结果显示给用户。
4.新建 jsp发起请求
加入JQuery.js文件
5.新建类
1)在类的上面加入@Controller,表示创建处理器对象
2)在类中定义方法,方法的上面加入@RequestMapping
处理器方法的形参String name, int age
6.新建jsp作为结果页面
7.新建springmvc的配置文件, 把处理器类的对象交给容器创建和管理。
1)声明组件扫描器context:component-scan
2)声明视图解析器对象
8.修改处理器方法,使用视图逻辑名称。
1 returnVoid-ajax:处理器方法返回void, 响应ajax请求
/**
* 处理器方法返回void, 没有数据也没有视图。
* 可以响应ajax请求。是通过HttpServletResponse对象输出数据。
*/
@RequestMapping(value = "/myajax.do")
public void doSome(HttpServletResponse response, String name, Integer age) throws IOException {
Student student = new Student();
student.setName(name);
student.setAge(age);
// student转为json
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(student);
// 输出json,响应ajax
PrintWriter pw = response.getWriter();
pw.println(json);
pw.flush();
pw.close();
}
2 returnVoid-ajax:处理器方法返回对象(Object),对象表示数据。
ajax请求需要数据, 所以处理器方法返回对象,可以响应ajax
/**
* 处理器方法返回对象,对象表示数据,响应ajax
*
* 第一个例子:返回值是String,String表示数据,不是视图。
* 区分返回值String是数据还是视图,看处理器方法上面是否有@ResponseBody
* 1.有@ResponseBody, String返回值就是数据。
* 2.没有@ResponseBody, String返回值就是视图
*
* 框架的处理过程:
* 1.框架根据处理器方法的返回值的数据类型, 寻找能够处理这种类型的HttpMessageConverter接口的
* 实现类 对象。
* String -- StringHttpMessageConverter
* 2.框架使用找到的实现类对象, 调用write()方法,把处理器方法的返回值对象转为某种数据格式(json,
* xml等) StringHttpMessageConverter把返回的“Hello
SpringMVCHttpMessageConverter”按“text/plain;charset=ISO-8859-1”
* 格式处理,转为文本数据, 数据的编码是ISO-8859-1.默认是不支持中文的。
*
* 3.使用@ResponseBody把2中的数据输出到浏览器。
* @ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response
* body 中,一般在异步获取数据时使用【也就是AJAX】,在使用 @RequestMapping后,
* 返回值通常解析为跳转路径, 但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,
* 而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,
* 会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入
* 方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
*
*/
//完整视图路径
@RequestMapping(value="/myajax.do",produces="text/plain;charset=utf-8")
@ResponseBody
public String doSome(String name,Integer age) {
System.out.println("执行处理器的doSome() name:"+name+"|age:"+age);
return "Hello SpringMVC HttpMessageConverter 中文数据";
}
3 returnObject-Student:处理器方法返回对象(Object),对象表示数据。
ajax请求需要数据, 所以处理器方法返回对象,可以响应ajax
/**
* 处理器方法返回对象,对象表示数据,响应ajax
*
* 第一个例子:返回值是Student。
``@RequestMapping(value="/myajax.do")
@ResponseBody
public Student doSome(String name,Integer age) {
System.out.println("执行处理器的doSome() name:"+name+"|age:"+age);
Student student = new Student();
student.setName("学生"+name);
student.setAge(age);
return student;
}
4 returnObject-list:处理器方法返回对象(Object),对象表示数据。
ajax请求需要数据, 所以处理器方法返回对象,可以响应ajax
@RequestMapping(value="/myajax.do")
@ResponseBody
public List<Student> doSome(String name,Integer age) {
System.out.println("执行处理器的doSome() name:"+name+"|age:"+age);
Student student = new Student();
student.setName("张三");
student.setAge(20);
Student student2 = new Student();
student2.setName("李四");
student2.setAge(22);
List<Student> students = new ArrayList<>();
students.add(student2);//李四
students.add(student);//张三
return students;
}