当你在百度搜索栏中输入一些内容后,下面就出现一些候选相关选项,这就是ajax实现的:没有重载页面,但是更新了数据
XMLHttpRequest使用流程
通过open方法发送请求,实现异步传输。
注意:默认方法是异步的,也就是开子线程,同步方法已经被废弃,
request.readyState 0: 请求未初始化 1: 服务器连接已建立 2: 请求已接收 3: 请求处理中 4: 请求已完成,且响应已就绪
最常用的就是与http响应状态码“request.status == 200 && request.readyState == 4”进行请求成功与否的验证。
通过request.responseText获取
form表单不通过action发送请求,而是通过提交触发js代码,在js中发送异步请求
<form action="" method="get">
用户名:<input type="text" name="username" id="username"/>
密码:<input type="password" name="password" id="password"/>
<input type="button" value="登录" onclick="getlogin()"/>
</form>
<script type="text/javascript">
function getlogin() {
//1.获取表单的值
var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
//注意需要将参数拼接
var params = 'username=' + username + '&password=' + password;
console.log(params);
//2.创建ajax 对象XMLHttpRequest
var request = new XMLHttpRequest();
//3.发送请求,把请求参数放在?号后面
request.open('get','${pageContext.request.contextPath}/LoginServlet?' + params);
request.send(); //get方法不需要传参,post需要
//4.监听准备状态的改变(这种写法表明:js的属性可以是方法)
request.onreadystatechange = function(){
console.log('准备状态码' + request.readyState + ' - ' + '响应状态码' + request.status);
if(request.readyState == 4 && request.status == 200){
var rspTxt = request.responseText;
console.log('服务器响应:' + rspTxt);
if(rspTxt == 'success'){ //success是servlet返回的响应
alert('登录成功');
}else{
alert('登录失败');
}
}
}
}
</script>
对于服务器来说,ajax请求和普通请求都是一样的,没有区别
ajax的post请求流程
POST跟GET差不多,区别就在于
其他都一样
无论在任何语言中,JSON几乎成了网络中最广泛的数据交互手段。
键值对
{ "firstName":"Bill" , "lastName":"Gates" }
相当于Java中的map,python中的字典。
如果你学习过python,那么只要把JSON当成python字典来看即可,他们的“组合使用方式”基本一致。
就像是函数嵌套,只要符合最基本的
{ "firstName":"Bill" , "lastName":"Gates" }
如何嵌套,就看你的想象力。
数组形式:
[{ "firstName":"af" , "lastName":"al" },
{ "firstName":"bf" , "lastName":"bl" }]
字典套字典数组:
{"people":[
{ "firstName":"af" , "lastName":"al" },
{ "firstName":"bf" , "lastName":"bl" }
]
}
其实就是数据结构的组合使用,只要符合键值对的形式,任意套用都可以。
Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json字符串和xml文档,同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些,并且Jackson社区相对比较活跃,更新速度也比较快。
jackson特点
在maven仓库下载即可
相关方法:
创建“对象映射”对象,该对象提供对象与JSON的转换:
ObjectMapper mapper = new ObjectMapper();
转换方法:
//对象转JSON String
mapper.writeValueAsString(Object);
//JSON String 转对象
mapper.readValue(JSONString, Object.class);
案例:
//准备对象
User user1 = new User ("shunxu","123456");
//对象转字符串
String string = mapper.writeValueAsString(user1);
String str = "{\"username\":\"shunxu\",\"password\":\"123456\"}";
System.out.println(str);
User user2 = mapper.readValue(str, User.class);
System.out.println(user2);
writeValueAsString(Object) 可以传对象,map,list等多种方式。
原理:
Servlet
注意将contentType设为text/json
JS
<script type="text/javascript">
function postlogin() {
//1.获取表单的值
var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
var params = 'username=' + username + '&password=' + password;
console.log(params);
//2.创建XMLHttpRequest对象
var request = new XMLHttpRequest();
//3.发送请求,把请求参数放在send方法中
request.open('post','${pageContext.request.contextPath}/LoginServlet');
//设置请求头,一定要设置请求头
request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
request.send(params);
//4.监听准备状态的改变
request.onreadystatechange = function(){
console.log(request.readyState + ' - ' + request.status);
if(request.readyState == 4 && request.status == 200){
var rspTxt = request.responseText;
console.log(rspTxt);
//把返回的字符串转成json对象
var jsonObj = JSON.parse(rspTxt);
console.log(jsonObj);
var tip = document.getElementById('tip');//添加一个span标签用于显示登录状态
//通过对象点属性的方式取值
if(jsonObj.success == 1){
tip.innerHTML = "登录成功";
}else{
tip.innerHTML = jsonObj.message;
}
}
}
}
</script>
实际开发中,更多的是使用ajax的封装,axios就是其中的佼佼者。
请移步官网或中文网进行学习,本节只做初学基础重点总结。
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
特性:
从浏览器中创建 XMLHttpRequests
从 node.js 创建 http 请求
支持 Promise API
拦截请求和响应
转换请求数据和响应数据
取消请求
自动转换 JSON 数据
客户端支持防御 XSRF
安装 使用npm:
使用bower:
使用cdn:
axios({
method: 'post',
url: '/user/12345',
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
});
RESTful与axios