pringmvc响应 ajax 返回不同的值

框架提供了通用的功能
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;
		
	}

猜你喜欢

转载自blog.csdn.net/rdz_NNN/article/details/88408011
今日推荐