东莞公司品牌网站建设,怎么写wordpress,微信优惠群怎么做网站,网页制作软件三剑客ListenerAjaxaxios1 Listener1.1 概述1.2 分类1.3 代码演示2 Ajax2.1 概述2.1.1 作用2.1.2 同步和异步2.2 快速入门2.2.1 服务端实现2.2.2 客户端实现2.2.3 测试2.3 案例2.3.1 分析2.3.2 后端实现2.3.3 前端实现2.4 测试3 axios3.1 基本使用3.2 快速入门3.2.1 后端实…
ListenerAjaxaxios1 Listener1.1 概述1.2 分类1.3 代码演示2 Ajax2.1 概述2.1.1 作用2.1.2 同步和异步2.2 快速入门2.2.1 服务端实现2.2.2 客户端实现2.2.3 测试2.3 案例2.3.1 分析2.3.2 后端实现2.3.3 前端实现2.4 测试3 axios3.1 基本使用3.2 快速入门3.2.1 后端实现3.2.2 前端实现3.3 请求方法别名3.4 测试4 JSON4.1 概述4.2 JSON 基础语法4.2.1 定义格式4.2.2 代码演示4.2.3 发送异步请求携带参数4.3 JSON串和Java对象的相互转换4.3.1 Fastjson 概述4.3.2 Fastjson 使用4.3.3 代码演示目标 能够使用 axios 发送 ajax 请求 1 Listener 1.1 概述 Listener 表示监听器是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。  监听器可以监听就是在 applicationsessionrequest 三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。 request 和 session 我们学习过。而 application 是 ServletContext 类型的对象。 ServletContext 代表整个web应用在服务器启动的时候tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象。  1.2 分类 
JavaWeb 提供了8个监听器 这里面只有 ServletContextListener 这个监听器后期我们会接触到ServletContextListener 是用来监听 ServletContext 对象的创建和销毁。 
ServletContextListener 接口中有以下两个方法 
void contextInitialized(ServletContextEvent sce)ServletContext 对象被创建了会自动执行的方法void contextDestroyed(ServletContextEvent sce)ServletContext 对象被销毁时会自动执行的方法 1.3 代码演示 
我们只演示一下 ServletContextListener 监听器 
定义一个类实现ServletContextListener 接口重写所有的抽象方法使用 WebListener 进行配置 
代码如下 
WebListener
public class ContextLoaderListener implements ServletContextListener {Overridepublic void contextInitialized(ServletContextEvent sce) {//加载资源System.out.println(ContextLoaderListener...);}Overridepublic void contextDestroyed(ServletContextEvent sce) {//释放资源}
}启动服务器就可以在启动的日志信息中看到 contextInitialized() 方法输出的内容同时也说明了 ServletContext 对象在服务器启动的时候被创建了。  2 Ajax 2.1 概述 
AJAX (Asynchronous JavaScript And XML)异步的 JavaScript 和 XML。 
我们先来说概念中的 JavaScript 和 XMLJavaScript 表明该技术和前端相关XML 是指以此进行数据交换。而这两个我们之前都学习过。 2.1.1 作用 
AJAX 作用有以下两方面 
与服务器进行数据交换通过AJAX可以给服务器发送请求服务器将数据直接响应回给浏览器。如下图 
我们先来看之前做功能的流程如下图 如上图Servlet 调用完业务逻辑层后将数据存储到域对象中然后跳转到指定的 jsp 页面在页面上使用 EL表达式 和 JSTL 标签库进行数据的展示。 
而我们学习了AJAX 后就可以使用AJAX和服务器进行通信以达到使用 HTMLAJAX来替换JSP页面了。如下图浏览器发送请求servletservlet 调用完业务逻辑层后将数据直接响应回给浏览器页面页面使用 HTML 来进行数据展示。 异步交互可以在不重新加载整个页面的情况下与服务器交换数据并更新部分网页的技术如搜索联想、用户名是否可用校验等等… 上图所示的效果我们经常见到在我们输入一些关键字例如 奥运后就会在下面联想出相关的内容而联想出来的这部分数据肯定是存储在百度的服务器上而我们并没有看出页面重新刷新这就是 更新局部页面 的效果。再如下图 我们在用户名的输入框输入用户名当输入框一失去焦点如果用户名已经被占用就会在下方展示提示的信息在这整个过程中也没有页面的刷新只是在局部展示出了提示信息这就是 更新局部页面 的效果。 2.1.2 同步和异步 
知道了局部刷新后接下来我们再聊聊同步和异步: 
同步发送请求过程如下  
 浏览器页面在发送请求给服务器在服务器处理请求的过程中浏览器页面不能做其他的操作。只能等到服务器响应结束后才能浏览器页面才能继续做其他的操作。 异步发送请求过程如下  浏览器页面发送请求给服务器在服务器处理请求的过程中浏览器页面还可以做其他的操作。  2.2 快速入门 2.2.1 服务端实现 
在项目创建 com.suki.web.servlet 并在该包下创建名为 AjaxServlet 的servlet 
WebServlet(/ajaxServlet)
public class AjaxServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 响应数据response.getWriter().write(hello ajax~);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}2.2.2 客户端实现 
在 webapp 下创建名为 01-ajax-demo1.html 的页面在该页面书写 ajax 代码 创建核心对象不同的浏览器创建的对象是不同的  var xhttp;
if (window.XMLHttpRequest) {xhttp  new XMLHttpRequest();
} else {// code for IE6, IE5xhttp  new ActiveXObject(Microsoft.XMLHTTP);
}发送请求 //建立连接
xhttp.open(GET, http://localhost:8080/ajax-demo/ajaxServlet);
//发送请求
xhttp.send();获取响应 xhttp.onreadystatechange  function() {if (this.readyState  4  this.status  200) {// 通过 this.responseText 可以获取到服务端响应的数据alert(this.responseText);}
};完整代码如下 
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
bodyscript//1. 创建核心对象var xhttp;if (window.XMLHttpRequest) {xhttp  new XMLHttpRequest();} else {// code for IE6, IE5xhttp  new ActiveXObject(Microsoft.XMLHTTP);}//2. 发送请求xhttp.open(GET, http://localhost:8080/ajax-demo/ajaxServlet);xhttp.send();//3. 获取响应xhttp.onreadystatechange  function() {if (this.readyState  4  this.status  200) {alert(this.responseText);}};
/script
/body
/html2.2.3 测试 
在浏览器地址栏输入 http://localhost:8080/ajax-demo/01-ajax-demo1.html 在 01-ajax-demo1.html加载的时候就会发送 ajax 请求效果如下 我们可以通过 开发者模式 查看发送的 AJAX 请求。在浏览器上按 F12 快捷键 这个是查看所有的请求如果我们只是想看 异步请求的话点击上图中 All 旁边的 XHR会发现只展示 Type 是 xhr 的请求。如下图 2.3 案例 
需求在完成用户注册时当用户名输入框失去焦点时校验用户名是否在数据库已存在 2.3.1 分析 
前端完成的逻辑 给用户名输入框绑定光标失去焦点事件 onblur发送 ajax请求携带username参数处理响应是否显示提示信息 后端完成的逻辑 接收用户名调用service查询User。此案例是为了演示前后端异步交互所以此处我们不做业务逻辑处理返回标记  
整体流程如下 2.3.2 后端实现 
在 com.suki.web.servlet 包中定义名为 SelectUserServlet 的servlet。代码如下 
WebServlet(/selectUserServlet)
public class SelectUserServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 接收用户名String username  request.getParameter(username);//2. 调用service查询User对象此处不进行业务逻辑处理直接给 flag 赋值为 true表明用户名占用boolean flag  true;//3. 响应标记response.getWriter().write(  flag);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}2.3.3 前端实现 
将 04-资料\1. 验证用户名案例\1. 静态页面 下的文件整体拷贝到项目下 webapp 下。并在 register.html 页面的 body 结束标签前编写 script 标签在该标签中实现如下逻辑 
第一步给用户名输入框绑定光标失去焦点事件 onblur 
//1. 给用户名输入框绑定 失去焦点事件
document.getElementById(username).onblur  function () {}第二步发送 ajax请求携带username参数 
在 第一步 绑定的匿名函数中书写发送 ajax 请求的代码 
//2. 发送ajax请求
//2.1. 创建核心对象
var xhttp;
if (window.XMLHttpRequest) {xhttp  new XMLHttpRequest();
} else {// code for IE6, IE5xhttp  new ActiveXObject(Microsoft.XMLHTTP);
}
//2.2. 发送请求
xhttp.open(GET, http://localhost:8080/ajax-demo/selectUserServlet);
xhttp.send();//2.3. 获取响应
xhttp.onreadystatechange  function() {if (this.readyState  4  this.status  200) {//处理响应的结果}
};由于我们发送的是 GET 请求所以需要在 URL 后拼接从输入框获取的用户名数据。而我们在 第一步 绑定的匿名函数中通过以下代码可以获取用户名数据 
// 获取用户名的值
var username  this.value;  //this  给谁绑定的事件this就代表谁而携带数据需要将 URL 修改为 
xhttp.open(GET, http://localhost:8080/ajax-demo/selectUserServlet?usernameusername);第三步处理响应是否显示提示信息 
当 this.readyState  4  this.status  200 条件满足时说明已经成功响应数据了。 
此时需要判断响应的数据是否是 “true” 字符串如果是说明用户名已经占用给出错误提示如果不是说明用户名未被占用清除错误提示。代码如下 
//判断
if(this.responseText  true){//用户名存在显示提示信息document.getElementById(username_err).style.display  ;
}else {//用户名不存在 清楚提示信息document.getElementById(username_err).style.display  none;
}综上所述前端完成代码如下 
//1. 给用户名输入框绑定 失去焦点事件
document.getElementById(username).onblur  function () {//2. 发送ajax请求// 获取用户名的值var username  this.value;//2.1. 创建核心对象var xhttp;if (window.XMLHttpRequest) {xhttp  new XMLHttpRequest();} else {// code for IE6, IE5xhttp  new ActiveXObject(Microsoft.XMLHTTP);}//2.2. 发送请求xhttp.open(GET, http://localhost:8080/ajax-demo/selectUserServlet?usernameusername);xhttp.send();//2.3. 获取响应xhttp.onreadystatechange  function() {if (this.readyState  4  this.status  200) {//alert(this.responseText);//判断if(this.responseText  true){//用户名存在显示提示信息document.getElementById(username_err).style.display  ;}else {//用户名不存在 清楚提示信息document.getElementById(username_err).style.display  none;}}};
}2.4 测试 
启动服务器访问http://localhost:8080/ajax-demo/register.html  3 axios 
Axios 对原生的AJAX进行封装简化书写。 
Axios官网是https://www.axios-http.cn 3.1 基本使用 
axios 使用是比较简单的分为以下两步 引入 axios 的 js 文件 script srcjs/axios-0.18.0.js/script使用axios 发送请求并获取响应结果  发送 get 请求 axios({method:get,url:http://localhost:8080/ajax-demo1/aJAXDemo1?usernamezhangsan
}).then(function (resp){alert(resp.data);
})发送 post 请求 axios({method:post,url:http://localhost:8080/ajax-demo1/aJAXDemo1,data:usernamezhangsan
}).then(function (resp){alert(resp.data);
});axios() 是用来发送异步请求的小括号中使用 js 对象传递请求相关的参数 
method 属性用来设置请求方式的。取值为 get 或者 post。url 属性用来书写请求的资源路径。如果是 get 请求需要将请求参数拼接到路径的后面格式为 url?参数名参数值参数名2参数值2。data 属性作为请求体被发送的数据。也就是说如果是 post 请求的话数据需要作为 data 属性的值。 
then() 需要传递一个匿名函数。我们将 then() 中传递的匿名函数称为 回调函数意思是该匿名函数在发送请求时不会被调用而是在成功响应后调用的函数。而该回调函数中的 resp 参数是对响应的数据进行封装的对象通过 resp.data 可以获取到响应的数据。 3.2 快速入门 3.2.1 后端实现 
定义一个用于接收请求的servlet代码如下 
WebServlet(/axiosServlet)
public class AxiosServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(get...);//1. 接收请求参数String username  request.getParameter(username);System.out.println(username);//2. 响应数据response.getWriter().write(hello Axios~);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(post...);this.doGet(request, response);}
}3.2.2 前端实现 
创建axiosDemo.html文件 引入 js 文件 script srcjs/axios-0.18.0.js/script发送 ajax 请求  get 请求 axios({method:get,url:http://localhost:8080/ajax-demo/axiosServlet?usernamezhangsan
}).then(function (resp) {alert(resp.data);
})post 请求 axios({method:post,url:http://localhost:8080/ajax-demo/axiosServlet,data:usernamezhangsan
}).then(function (resp) {alert(resp.data);
})整体页面代码如下 
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
bodyscript srcjs/axios-0.18.0.js/script
script//1. get/* axios({method:get,url:http://localhost:8080/ajax-demo/axiosServlet?usernamezhangsan}).then(function (resp) {alert(resp.data);})*///2. post  在js中{} 表示一个js对象而这个js对象中有三个属性axios({method:post,url:http://localhost:8080/ajax-demo/axiosServlet,data:usernamezhangsan}).then(function (resp) {alert(resp.data);})
/script
/body
/html3.3 请求方法别名 
为了方便起见 Axios 已经为所有支持的请求方法提供了别名。如下 get 请求  axios.get(url[,config])  delete 请求  axios.delete(url[,config])  head 请求  axios.head(url[,config])  options 请求  axios.option(url[,config])  post 请求axios.post(url[,data[,config])  put 请求axios.put(url[,data[,config])  patch 请求axios.patch(url[,data[,config])  
而我们只关注 get 请求和 post 请求。 
入门案例中的 get 请求代码可以改为如下 
axios.get(http://localhost:8080/ajax-demo/axiosServlet?usernamezhangsan).then(function (resp) {alert(resp.data);
});入门案例中的 post 请求代码可以改为如下 
axios.post(http://localhost:8080/ajax-demo/axiosServlet,usernamezhangsan).then(function (resp) {alert(resp.data);
})3.4 测试 
get 启动服务器访问http://localhost:8080/ajax-demo/axiosServlet?usernamezhangsan   4 JSON 4.1 概述 
概念JavaScript Object Notation。JavaScript 对象表示法. 
如下是 JavaScript 对象的定义格式 
{name:zhangsan,age:23,city:北京
}接下来我们再看看 JSON 的格式 
{name:zhangsan,age:23,city:北京
}通过上面 js 对象格式和 json 格式进行对比发现两个格式特别像。只不过 js 对象中的属性名可以使用引号可以是单引号也可以是双引号而 json 格式中的键要求必须使用双引号括起来这是 json 格式的规定。json 格式的数据有什么作用呢 
作用由于其语法格式简单层次结构鲜明现多用于作为数据载体在网络中进行数据传输。如下图所示就是服务端给浏览器响应的数据这个数据比较简单如果现需要将 JAVA 对象中封装的数据响应回给浏览器的话应该以何种数据传输呢 大家还记得 ajax 的概念吗 是 异步的 JavaScript 和 xml。这里的 xml就是以前进行数据传递的方式如下 
studentname张三/nameage23/agecity北京/city
/student再看 json 描述以上数据的写法 
{	name:张三,age:23,city:北京
}上面两种格式进行对比后就会发现 json 格式数据的简单以及所占的字节数少等优点。 4.2 JSON 基础语法 4.2.1 定义格式 
JSON 本质就是一个字符串但是该字符串内容是有一定的格式要求的。 定义格式如下 
var 变量名  {key:value,key:value,...};JSON 串的键要求必须使用双引号括起来而值根据要表示的类型确定。value 的数据类型分为如下 
数字整数或浮点数字符串使用双引号括起来逻辑值true或者false数组在方括号中对象在花括号中null 
示例 
var jsonStr  {name:zhangsan,age:23,addr:[北京,上海,西安]}4.2.2 代码演示 
创建一个页面在该页面的 script 标签中定义json字符串 
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
body
script//1. 定义JSON字符串var jsonStr  {name:zhangsan,age:23,addr:[北京,上海,西安]}alert(jsonStr);/script
/body
/html通过浏览器打开页面效果如下图所示 现在我们需要获取到该 JSON 串中的 name 属性值应该怎么处理呢 
如果它是一个 js 对象我们就可以通过 js对象.属性名 的方式来获取数据。JS 提供了一个对象 JSON 该对象有如下两个方法 
parse(str) 将 JSON串转换为 js 对象。使用方式是 var jsObject  JSON.parse(jsonStr);stringify(obj) 将 js 对象转换为 JSON 串。使用方式是var jsonStr  JSON.stringify(jsObject) 
代码演示 
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
body
script//1. 定义JSON字符串var jsonStr  {name:zhangsan,age:23,addr:[北京,上海,西安]}alert(jsonStr);//2. 将 JSON 字符串转为 JS 对象let jsObject  JSON.parse(jsonStr);alert(jsObject)alert(jsObject.name)//3. 将 JS 对象转换为 JSON 字符串let jsonStr2  JSON.stringify(jsObject);alert(jsonStr2)
/script
/body
/html4.2.3 发送异步请求携带参数 
后面我们使用 axios 发送请求时如果要携带复杂的数据时都会以 JSON 格式进行传递如下 
axios({method:post,url:http://localhost:8080/ajax-demo/axiosServlet,data:usernamezhangsan
}).then(function (resp) {alert(resp.data);
})请求参数不可能由我们自己拼接字符串吧肯定不用可以提前定义一个 js 对象用来封装需要提交的参数然后使用 JSON.stringify(js对象) 转换为 JSON 串再将该 JSON 串作为 axios 的 data 属性值进行请求参数的提交。如下 
var jsObject  {name:张三};axios({method:post,url:http://localhost:8080/ajax-demo/axiosServlet,data: JSON.stringify(jsObject)
}).then(function (resp) {alert(resp.data);
})而 axios 是一个很强大的工具。我们只需要将需要提交的参数封装成 js 对象并将该 js 对象作为 axios 的 data 属性值进行它会自动将 js 对象转换为 JSON 串进行提交。如下 
var jsObject  {name:张三};axios({method:post,url:http://localhost:8080/ajax-demo/axiosServlet,data:jsObject  //这里 axios 会将该js对象转换为 json 串的
}).then(function (resp) {alert(resp.data);
})注意 js 提供的 JSON 对象我们只需要了解一下即可。因为 axios 会自动对 js 对象和 JSON 串进行想换转换。发送异步请求时如果请求参数是 JSON 格式那请求方式必须是 POST。因为 JSON 串需要放在请求体中。 4.3 JSON串和Java对象的相互转换 
学习完 json 后接下来聊聊 json 的作用。以后我们会以 json 格式的数据进行前后端交互。前端发送请求时如果是复杂的数据就会以 json 提交给后端而后端如果需要响应一些复杂的数据时也需要以 json 格式将数据响应回给浏览器。 在后端我们就需要重点学习以下两部分操作 
请求数据JSON字符串转为Java对象响应数据Java对象转为JSON字符串 
接下来给大家介绍一套 API可以实现上面两部分操作。这套 API 就是 Fastjson 4.3.1 Fastjson 概述 
Fastjson 是阿里巴巴提供的一个Java语言编写的高性能功能完善的 JSON 库是目前Java语言中最快的 JSON 库可以实现 Java 对象和 JSON 字符串的相互转换。 4.3.2 Fastjson 使用 
Fastjson 使用也是比较简单的分为以下三步完成 导入坐标 dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.62/version
/dependencyJava对象转JSON String jsonStr  JSON.toJSONString(obj);将 Java 对象转换为 JSON 串只需要使用 Fastjson 提供的 JSON 类中的 toJSONString() 静态方法即可。  JSON字符串转Java对象 User user  JSON.parseObject(jsonStr, User.class);将 json 转换为 Java 对象只需要使用 Fastjson 提供的 JSON 类中的 parseObject() 静态方法即可。  4.3.3 代码演示 引入坐标  创建一个类专门用来测试 Java 对象和 JSON 串的相互转换代码如下 public class FastJsonDemo {public static void main(String[] args) {//1. 将Java对象转为JSON字符串User user  new User();user.setId(1);user.setUsername(zhangsan);user.setPassword(123);String jsonString  JSON.toJSONString(user);System.out.println(jsonString);//{id:1,password:123,username:zhangsan}//2. 将JSON字符串转为Java对象User u  JSON.parseObject({\id\:1,\password\:\123\,\username\:\zhangsan\}, User.class);System.out.println(u);}
}学习笔记 from 黑马程序员 By – Suki 2023/3/10