JSON&Ajax介绍和实例
- JSON指的是JavaScript对象表示法( JavaScript Object Notation),JSON的本质仍然是JavaScript对象
- JSON是轻量级的文本数据交互格式,也是前后端进行数据通讯的一种格式:
- JSON独立于语言,即java,PHP,asp.net,go等都可以使用json
- JSON具有自我描述性,更易理解。一句话,JSON很好用。
例子:
k-v形式,然后v中又可以嵌套k-v,并且每对k-v之间用逗号隔开
- 映射(元素/属性)用冒号:表示,\”名称\”:值,注意名称是字符串,因此要用双引号括起来
- 并列的数据之间用逗号,分隔,如\”名称1\”:值,\”名称2\”:值
- 映射的集合(对象)用大括号{}表示,如{\”名称1\”:值,\”名称2\”:值}
- 并列数据的集合(数组)用方括号[]表示,如[{\”名称1\”:值,\”名称2\”:值},{\”名称1\”:值,\”名称2\”:值}]
- 元素值类型:string,number,object,array,true,false,null
打开浏览器控制台,输出如下:
- JSON.stringify(json):将一个json对象转换成为json字符串
- JSON.parse(jsonString):将一个json字符串转换成为json对象
- 转换前提是传入的字符串的格式必须满足json格式
打开浏览器控制台,输出如下:
- JSON.stringify(json对象)会返回对应的string,并不会影响原来json对象
- JSON.parse(jsonString)方法会返回对应的json对象,并不会影响原来的string
- 在定义Json对象时,可以使用单引号\’\’或者双引号\”\”表示字符串,甚至前面的key可以不用任何引号
- 比如var json_person={\”name\”:\”jack\”,\”age\”:100};
- 也可以写成var json_person={\’name\’:\’jack\’,\’age\’:100};
- 或者是var json_person={name:\”jack\”,age:100};
- 但是在把原生字符串转成json对象时,必须使用双引号\”\”,否则会报错
- JSON.springfiy(json对象)方法返回的字符串都是双引号\”\”表示的字符串,所以在语法格式正确的情况下,是可以重新转成json对象的。
例子
打开浏览器控制台,输出如下:
前面讲述的是前端页面中json对象和字符串之间的转化。在实际开发中,前端将json格式的字符串发送给后端,后端拿到后,可以将其转成java对象,进行其他操作,并可以在业务操作后,重新向前端发送json格式的字符串。
这意味着在Java后端中,同样有对象和字符串对象转换的需求。
- Java中使用json,需要引入第三方的包 gson.jar
- Gson是Google提供的用来在Java对象和 JSON数据之间进行映射的Java类库
- 可以对JSON字符串和Java对象相互转换
- Javabean对象和json字符串的相互转换
- List对象和json字符串的相互转换
- Map对象和json字符串的相互转换
在项目中的lib目录下将gson.jar文件复制过来,点击add as library作为库
Javabean:Book类
JavaJson:
Book类见4.3
JavaJson:
TypeToken类的作用是:得到类型的完整路径,然后进行底层的反射
一个问题,TypeToken为什么要加{}?
- 如果我们把下面语句中的 {} 去掉,会提示\’TypeToken()\’ has protected access in \’com.google.gson.reflect.TypeToken\’
- 因为TypeToken的无参构造器是protected的,而语句TypeToken<List<Book>>()就是调用其无参构造器。我们知道,如果一个方法是protected,并且和当前类不在同一个包,那么就没有该方法的访问权限,因此报错。
- 那为什么加上{} ,就可以访问了呢?这里涉及到匿名内部类的知识。
- 当我们这样使用的时候:new TypeToken<List<Book>>(){} ,其实这个类型就不是TypeToken,而是一个匿名内部类(可以理解为TypeToken的一个子类)
- 而且这个匿名内部类有自己的无参构造器(隐式),根据java基础,当执行子类的无参构造器时,默认调用super(); 到父类的无参构造器执行
我们在Type type = new TypeToken<List<Book>>() {}.getType();处打上断点,并在TypeToken类中的无参构造器旁也打上断点。点击debug,点击Resume Program按钮
可以看到光标跳转到TypeToken类中的无参构造器:
再点击step over,可以看到,type属性拿到了类型的完整路径,这样才能去进行底层的反射
我们用两个类来模拟一下上述4.4.1的过程
在src目录下创建两个包:t1和t2,在t1中创建一个A类,在t2中创建一个Test类
A类:
这时如果在Test类中new一个A类对象,那么将会报错,原因就是被 protected 修饰的成员对于本包和其子类可见。而A和Test类既不在同一个包,也不是继承关系。这和4.4.1报错的原因完全一致。
实际上,protected的可见性在于两点:1.基类的 protected 成员是包内可见的,并且对子类可见;2.若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。
Java protected 关键字详解 | 菜鸟教程 (runoob.com)
Book类见4.3
JavaJson:
- AJAX 即“Asynchronous JavaScript And XML”(异步JavaScript和XML)
- Ajax 是一种浏览器异步发起请求(指定发哪些数据),局部更新页面的技术
- 传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。而使用Ajax,通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
- 传统的网页(不使用 AJAX),如果没有得到服务器的响应,浏览器程序会处于一个等待挂起的状态,无法执行其他操作,直至得到http响应。
- 搜索引擎根据用户输入关键字,自动提示检索关键字
- 动态加载数据,按需取得数据 [树形菜单,联动菜单]
- 改善用户体验 [输入内容前提示,带进度条文件上传]
- 电子商务应用 [购物车,邮件订阅]
- 访问第三方服务 [访问搜索服务,rss阅读器]
- 页面局部刷新
- Ajax的三个特点异步请求发送指定数据局部刷新
传统web应用数据通信方式
- 浏览器发出http请求(携带数据username=xxx&pwd=xxx)
- 服务端接收数据,并处理
- 通过http响应,把数据返回给浏览器
缺点:
- 表单提交是把该表单的所有数据都提交给服务端,数据量大,没有意义
- 在服务端没有响应前,浏览器前端页面处于等待状态,处于一个挂起的状态
- 不能进行局部刷新页面,而是刷新整个页面
Ajax数据通信方式:
- 浏览器发出http请求,使用XMLHttpRequest对象
- 服务端接收数据,并处理
- 通过http响应,把数据返回给浏览器(返回的数据格式可以多样 如json,xml,普通文本)
优点:
- 可以通过XMLHttpReques对象,发送指定数据,数据量小,速度快
- XMLHttpReques是异步发送,在服务端没有Http响应前,浏览器不需要等待,用户可以进行其他操作
- 可以进行局部刷新,提高了用户体验
AJAX – XMLHttpRequest 对象 (w3school.com.cn)
- onreadystatechange 事件
当请求被发送到服务器时,我们需要执行一些基于响应的任务。
每当 readyState 改变时,就会触发 onreadystatechange 事件。
readyState 属性存有 XMLHttpRequest 的状态信息。
下面是 XMLHttpRequest 对象的三个重要的属性:
在 onreadystatechange 事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务。
演示JavaScript发送原生Ajax请求的案例
- 在输入框输入用户名
- 点击验证用户名,使用ajax方式,服务端验证该用户名是否已经被占用,如果已经被占用,以json格式返回该用户信息
- 假定用户名为king,就不可用,其他用户名可以(后面我们接入DB)
- 对页面进行局部刷新,显示返回信息
- 思考:为什么直接返回用户名是否可用信息?==>为什么返回json格式的字符串?
- 可以根据返回的json可以做更多的业务操作。
思路
- 首先创建一个新项目,添加web支持(暂时不使用maven)
- 在web-inf文件夹下添加lib目录,添加servlet和json的相关jar包
- 配置Tomcat服务器
- 创建login.html,使用ajax
- 大致的流程是:用户点击验证用户名按钮后,操作dom获取填写的用户名,然后创建XMLHttpRequest对象[ajax引擎对象],调用XMLHttpRequest 对象的 open() 和 send() 方法
- 在open中设置三个参数:1.请求方式、2.请求url(如果是get请求,url需包括请求参数)、3.是否使用异步发送
- 给XMLHttpRequest对象绑定一个事件onreadystatechange,该事件的触发时机是XMLHttpRequest的readyState状态改变。
- readyState状态详见:AJAX – 服务器响应 (w3school.com.cn)
- 然后调用send方法真正发送ajax请求(如果是post请求,参数就是在send方法中设置)
- 根据readyState的状态判断请求已完成且响应已就绪,然后进行业务操作。
- 在web.xml中配置servlet
- CheckUserServlet:如果接收到的用户名为king,就将其信息以json形式返回前端页面,如果是其他名字,就返回空串。
- Javabean,为了完成对象–>json字符串的需求
需求分析:到数据库中验证用户名是否可用
- 点击验证用户名,到数据库中验证用户名是否可用
- 自己设计创建数据库ajaxdb,创建users表
- 使用ajax方式,服务端验证该用户名是否已经被占用了,若已经被占用,以json格式返回该用户信息
- 对页面进行局部刷新,显示返回信息
- 提示:[Mysql+JDBC+数据库连接池]
只需在前面的应用实例中进行升级改进,接入DB
项目的整体架构:
在项目的lib库下添加德鲁伊,Apache-DBUtils,mysql-connect数据库连接驱动
数据库连接池详见:javase基础-jdbc和数据库连接池
在项目src目录下添加德鲁伊配置文件
创建德鲁伊工具类JDBCUtilsByDruid
修改3.2中的Javabean–User类
详见3.2应用实例
重启Tomcat,在浏览器中访问http://localhost:8080/ajax/login.html
原生Ajax请求问题分析:
- 编写原生的Ajax要写很多的代码,还要考虑浏览器兼容问题,使用不方便
- 在实际工作中,一般使用JavaScript的框架(比如jquery)发动Ajax请求,从而解决这个问题。
在线文档:jQuery 参考手册 – Ajax (w3school.com.cn)
完整的参数查看手册:jQuery ajax – ajax() 方法
$.ajax 常用参数:
- url:请求的地址
- type:请求的方式get或者post, 默认为 \”GET\”。
- 注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。
- data:发送到服务器的数据,将自动转换为请求字符串格式
- success:请求成功后的回调函数
- 参数:由服务器返回,并根据 dataType 参数进行处理后的数据;描述状态的字符串。
- 这是一个 Ajax 事件。
- error:默认值: 自动判断 (xml 或 html),请求失败时的回调函数。
- dataType:指定返回的数据类型,常用json或text
jQuery AJAX get() 和 post() 方法
$.get()请求和$.post()请求常用参数:
- url:请求的url地址
- data:请求发送到服务器的数据
- success:成功时的回调函数
- type:返回内容的格式,xml,html,script,json,text
说明:$.get()和 $.post()底层还是使用$.ajax()方法来实现异步请求
get() 方法通过远程 HTTP GET 请求载入信息
这是一个简单的 GET 请求功能以取代复杂 $.ajax,请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax().
语法:
post() 方法通过 HTTP POST 请求从服务器载入数据。
语法:
jQuery ajax – getJSON() 方法
$.getJSON()常用参数
- url:请求发送哪个url
- data:请求发送到服务器的数据
- success:请求成功时运行的函数
说明:$.getJSON()底层使用$.ajax()方法来实现异步请求
$.getJSON()方法通过 HTTP GET 请求载入 JSON 数据,语法:
演示jquery发送ajax的案例
- 在输入框输入用户名
- 点击验证用户名,服务端验证该用户是否已经占用了,如果是,则以json格式返回该用户信息
- 假定king为已使用的用户名
- 对页面进行局部刷新,显示返回的信息
思路分析:直接参考3.2的思路图即可
引入jquery库:
注意:如果有的资源是拷贝进来的,有时候运行目录out没有及时更新,这时可以点击Rebuild Project,如果不行就redeploy Tomcat
配置servlet:
创建CheckUserServlet2:
login2.html:
使用4.5的应用实例,将上面的html页面改写,其他不变。
使用4.5的应用实例,将上面的html页面改写,其他不变。
使用4.5的应用实例,将上面的html页面改写,其他不变。
● 需求分析: 到数据库去验证用户名是否可用
- 点击验证用户名, 到数据库中验证用户名是否可用
- 创建数据库 ajaxdb , 创建表 user 表 自己设计
- 使用 Jquery + ajax 方式, 服务端验证该用户名是否已经占用了, 如果该用户已经占用,以 json 格式返回该用户信息
- 对页面进行局部刷新, 显示返回信息
提示: 根据day34-JSON&Ajax02-3.3练习 的 ajax 请求+jdbc+mysql 到数据库验证案例完成
根据之前的day34-JSON&Ajax02-3.3练习,我们已经写了JDBCUtilsByDruid,BaseDAO,UserDAO,UserService,User等类,只需要在CheckUserServlet2中修改一下代码即可完成:
前端html页面使用4.5.4的$.getJSON()方法发送ajax请求,在4.5.4代码的基础上修改返回数据的判断条件即可
JavaScript学习 — ajax方法的POST请求
在Web开发中,通过POST请求将数据发送给服务器是一种常见的方式。使用jQuery可以轻松地发送POST请求,这需要使用jQuery的ajax()方法。本文将介绍jQuery如何使用POST请求发送数据,并提供一个实际的例子。
使用jQuery的ajax()方法发送POST请求需要设置以下属性:
- url:要发送请求的URL
- type:请求类型,这里应设置为POST
- dataType:预期响应数据类型,可以是JSON、XML或HTML等
- data:要发送的数据,可以是一个JavaScript对象或字符串
以下是一个示例代码:
在上面的示例中,我们向URL为https://example.com/api的API发送一个POST请求,并携带一个JavaScript对象作为数据发送。
当API响应成功时,success()回调函数将被执行,并将响应数据作为参数传递。当API响应失败时,error()回调函数被执行,并将HTTP错误信息作为参数传递。
除了使用ajax()方法外,还可以使用jQuery的$.post()方法来发送POST请求,如下所示:
使用$.post()方法时,第一个参数是请求URL,第二个参数是要发送的数据,第三个参数是成功响应后的回调函数,最后一个参数是响应数据类型。
在发送POST请求时,有时需要在请求头中添加一些信息,例如身份验证令牌或版本信息。可以使用以下代码在请求中添加标头信息:
在上面的示例中,我们将headers属性添加到请求中,并在其中添加了Authorization和X-API-Version标头。
在contentType中传递的“application/json”指示我们发送的数据是JSON格式。data属性使用JSON.stringify()方法将数据转换为JSON字符串。
本文介绍了如何使用jQuery发送POST请求,并提供了简单和带标头信息的请求的实际示例。使用jQuery可以方便地向服务器发送数据,并等待响应。在实际开发中,我们通常会使用POST请求来提交表单数据、发送文件或与服务器进行交互。
Jquery实现Ajax请求的几种常见方式总结
1.1、JQuery的GET方式实现AJAX
核心语法:$.get(url,[data],[callback],[type]);
url:请求的资源路径。
data:发送给服务器端的请求参数,格式可以是key=value,也可以是 js 对象。
callback:当请求成功后的回调函数,可以在函数中编写我们的逻辑代码。
type:预期的返回数据的类型,取值可以是 xml, html, js, json, text等。
代码实现
1.2、JQuery的POST方式实现AJAX
核心语法:$.post(url,[data],[callback],[type]);
url:请求的资源路径。
data:发送给服务器端的请求参数,格式可以是key=value,也可以是 js 对象。
callback:当请求成功后的回调函数,可以在函数中编写我们的逻辑代码。
type:预期的返回数据的类型,取值可以是 xml, html, js, json, text等。
代码实现
1.6、JQuery的通用方式实现AJAX
核心语法:$.ajax({name:value,name:value,…});
url:请求的资源路径。
async:是否异步请求,true-是,false-否 (默认是 true)。
data:发送到服务器的数据,可以是键值对形式,也可以是 js 对象形式。
type:请求方式,POST 或 GET (默认是 GET)。
dataType:预期的返回数据的类型,取值可以是 xml, html, js, json, text等。
success:请求成功时调用的回调函数。
error:请求失败时调用的回调函数。
代码实现
1.7、小结
AJAX(Asynchronous JavaScript And XML):异步的 JavaScript 和 XML。
通过浏览器与服务器进行少量数据交换,就可以使网页实现异步更新。也就是在不重新加载整个页面的情况下,对网页的部 分内容进行局部更新。
同步和异步
同步:服务器端在处理过程中,无法进行其他操作。
异步:服务器端在处理过程中,可以进行其他操作。
GET 方式实现:$.get();
POST 方式实现:$.post();
url:请求的资源路径。
data:发送给服务器端的请求参数,格式可以是key=value,也可以是 js 对象。
callback:当请求成功后的回调函数,可以在函数中编写我们的逻辑代码。
type:预期的返回数据的类型,取值可以是 xml, html, js, json, text等。
通用方式实现:$.ajax();
url:请求的资源路径。
async:是否异步请求,true-是,false-否 (默认是 true)。
data:发送到服务器的数据,可以是键值对形式,也可以是 js 对象形式。
type:请求方式,POST 或 GET (默认是 GET)。
dataType:预期的返回数据的类型,取值可以是 xml, html, js, json, text等。
success:请求成功时调用的回调函数。
error:请求失败时调用的回调函数。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。