分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

09对ajax的支持

发布时间:2023-09-06 01:53责任编辑:白小东关键词:暂无标签
  • u  最直接的Ajax处理
  • u  数据绑定@RequestBody/@ResponseBody
  • u  使用@RequestBody/@ResponseBody来支持Ajax
  • u  使用HttpEntity/ResponseEntity来支持Ajax
  • u  对Ajax返回xml的支持
  • u  HttpMessageConverter
  • u  内容协商

1      最直接的Ajax处理

只要在Controller的方法里面,直接使用response输出你要返回的的Ajax数据,然后return null就可以了,示例如下:

Controller示例

@RequestMapping(value = "/hello")public ModelAndView handleRequest(UserModel um,HttpServletResponse response)throws IOException { ??response.setCharacterEncoding("utf-8"); ??response.getWriter().println("{uuid:‘"+um.getUuid()+"‘, name:‘"+um.getName()+"‘}"); ??return null;}

客户端示例,使用jQuery

<%@ page language="java" contentType="text/html; charset=UTF-8 " pageEncoding="UTF-8"%><head> ?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><script language="javascript“ src="/mvcexample/static/js/jquery-1.3.2.min.js"></script><script language="javascript"> ?$().ready(function(){ ?$.getJSON(‘/mvcexample/hello‘,{uuid:‘1‘,name:‘test‘}, ????function(data){ ????alert(data.uuid+" , "+data.name); ????}); ??});</script></html>

然后就可以启动服务器测试了。

2      数据绑定@RequestBody/@ResponseBody

@RequestBody

  功能:用于将HttpServletRequest的getInputStream()内容绑定到入参

 例子:

 @RequestMapping(value = "/hello") ?public byte[] handleRequest(@RequestBody String body)

@ResponseBody

功能:用于将ResponseBody方法的返回值作为响应体

例子:

@RequestMapping(value = “/hello")@ResponseBodypublic byte[] handleRequest(@RequestBody String body)

注意:他们都只能访问报文体,不能访问报文头

3      使用@RequestBody/@ResponseBody来支持Ajax

可以使用@RequestBody来自动获取Ajax上传的数据,同时也可以使用@ResponseBody,把要返回的对象自动拼成JSON的格式返回。当然,需要加入几个jackson的包,这里加入了:

jackson-core-2.1.2.jar、jackson-annotations-2.1.2.jar、jackson-databind-2.1.2.jar

测试使用的Controller的方法:

@RequestMapping(value = "/hello")@ResponseBodypublic UserModel handleRequest(@RequestBody String reqBody, UserModel um){ ???System.out.println("the reqBody="+reqBody); ???um.setName(um.getName()+",server"); ???return um;}

测试使用的页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> ?<html> ???<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> ??</head><script language="javascript"src="/mvcexample/static/js/jquery-1.3.2.min.js"></script><script language="javascript"> ?$().ready(function(){ ?$.getJSON(‘/mvcexample/hello‘,{uuid:‘1‘,name:‘test‘}, ???function(data){ ???alert(data.uuid+" , "+data.name); ???}); ?});</script>

去测试看看吧,可以看到Controller的方法直接返回一个um对象,但是@ResponseBody会把这个对象自动变成json格式的,再传回客户端,非常方便。

    当然,@ResponseBody也支持集合对象自动变成json格式,比如:

测试使用的Controller方法

@RequestMapping(value = "/hello")@ResponseBodypublic List<UserModel> handleRequest(@RequestBody String reqBody,UserModel um) { ???System.out.println("the reqBody="+reqBody); ???um.setName(um.getName()+",server"); ???List<UserModel> list = new ArrayList<UserModel>(); ???list.add(um); ???UserModel um2 = new UserModel(); ???um2.setUuid("22"); ???um2.setName("222"); ???list.add(um2); ???return list;}

测试使用的页面

<%@ page language="java" contentType="text/html; charset=UTF-8 " pageEncoding="UTF-8"%> ?<html> ????<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> ????</head> ?<script ?language="javascript“ ?????src="/mvcexample/static/js/jquery-1.3.2.min.js"> ?</script><script language="javascript"> ?$().ready(function(){ ?$.getJSON(‘/mvcexample/hello‘,{uuid:‘1‘,name:‘test‘}, ?function(data){ ?$.each(data,function(index,v){ ?alert("tr="+v.uuid+",v="+v.name); ?}); });});</script>

4      使用HttpEntity/ResponseEntity来支持Ajax

使用HttpEntity/ResponseEntity不但能访问到报文体,还可以访问报文头

示例,主要的变化在Controller的方法上,页面不用变化,如下:

@RequestMapping(value = "/hello")public ResponseEntity<List<UserModel>> handleRequest(HttpEntity<String> req, UserModel um) { ?System.out.println("req headers="+req.getHeaders()+", ???reqBody="+req.getBody());um.setName(um.getName()+",server"); ??List<UserModel> list = new ArrayList<UserModel>(); ??list.add(um); ??UserModel um2 = new UserModel(); ??um2.setUuid("22"); ??um2.setName("222"); ??list.add(um2); ??ResponseEntity<List<UserModel>> ret = new ?????ResponseEntity<List<UserModel>>(list,HttpStatus.OK); ??return ret;}

5      对Ajax返回xml的支持

前面的Ajax使用的是json格式,下面看看对xml的支持

要让Spring Web MVC支持xml格式,需要加入如下jar包:jaxb-api-2.2.5.jar,jaxb-impl-2.2.5.jar

在要返回的对象头上使用如下注解,例如:

   @XmlRootElement(name = "testxml")

   public class UserModel {

  • u  这表明返回的xml的根元素名称为testxml,注意:由于xml是单根的,所以只能返回一个对象,而不能返回一个list,如果要返回多条值,可以在这个对象中包含多个其他对象
  • u  返回的结果同样用@ResponseBody注解即可,这个注解会根据请求的类型,自动决定是返回json还是xml,当然默认是返回json格式的,如果要返回xml格式,那么请求的时候,要指定accept=application/xml
  • u  示例的Controller方法
@RequestMapping(value = "/hello")@ResponseBodypublic UserModel handleRequest(HttpEntity<String> req, UserModel um) { ??System.out.println("req headers="+req.getHeaders()+", ????reqBody="+req.getBody()); ??um.setName(um.getName()+",server"); ??PhoneNumberModel pnm = new PhoneNumberModel("123","321"); ??PhoneNumberModel pnm2 = new ???????????PhoneNumberModel("2222","333"); ??List<PhoneNumberModel> tempList = new ??????ArrayList<PhoneNumberModel>(); ??tempList.add(pnm2); ??tempList.add(pnm); ??um.setPm(tempList); ?return um;}

示例的页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><html> ??<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> ??</head> ?<script language="javascript" ??????src="/mvcexample/static/js/jquery-1.3.2.min.js"> ?</script><script language="javascript"> ??$().ready(function(){ ??$.ajax({ ????????url:‘/mvcexample/hello‘, ????????type: ‘POST‘, ????????dataType: ‘xml‘, ????????data: {uuid:‘1‘,name:‘test‘}, ????????timeout: 1000, ????????error: function(){ alert(‘Error loading XMLdocument‘); }, ????????success: function(xml){$(xml).find("testxml").children("pm").each(function(i){ ??????var uuid=$(this).children("areaCode").text(); ??????var name=$(this).children("phoneNumber").text(); ??????alert("uuid="+uuid+",name="+name); ???});} });});</script>

返回的xml形如

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><testxml> ??<age>0</age> ??<name>test,server</name> ??<pm> ?????<areaCode>2222</areaCode> ?????<phoneNumber>333</phoneNumber> ???</pm> ????<pm> ????????<areaCode>123</areaCode> ????????<phoneNumber>321</phoneNumber> ????</pm> ???<uuid>1</uuid></testxml>

6      HttpMessageConverter

其实前面的程序实现对json和xml的支持,之所以能正常运行,幕后英雄就是HttpMessageConverter,它负责对http传入和传出的内容进行格式转换。比如前面学的@RequestBody是将Http请求正文插入方法中,其实它就会使用适合的HttpMessageConverter将请求体写入某个对象。比如前面学的@ResponseBody是将内容或对象作为Http响应正文返回,使用@ResponseBody将会跳过视图处理部分,直接调用合适的HttpMessageConverter,将返回值写入输出流

现在只要你开启了<mvc:annotation-driven />,它会给AnnotationMethodHandlerAdapter初始化7个转换器,可以通过调用AnnotationMethodHandlerAdapter类的getMessageConverts()方法来获取转换器的一个集合List<HttpMessageConverter>,默认开启的有:

  • u  ByteArrayHttpMessageConverter
  • u  StringHttpMessageConverter
  • u  ResourceHttpMessageConverter
  • u  SourceHttpMessageConverter<T>
  • u  XmlAwareFormHttpMessageConverter
  • u  Jaxb2RootElementHttpMessageConverter
  • u  MappingJacksonHttpMessageConverter

Spring是如何寻找最佳的HttpMessageConverter呢?

最基本的方式就是通过请求的accept里面的格式来匹配,如果accept=application/json之类的,就使用json的HttpMessageConverter,如果accept=application/xml之类的,就使用xml的HttpMessageConverter。

7      内容协商

什么是内容协商?

    简单点说,就是同一资源,可以有多种表现形式,比如xml、json等,具体使用哪种表现形式,是可以协商的。

    这是RESTfull的一个重要特性,Spring Web MVC也支持这个功能。

09对ajax的支持

原文地址:https://www.cnblogs.com/zhouyeqin/p/9008452.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved