北京动力节点-王鹤-AJAX-jQuery.pdf

ajax大纲

image.png

1.全局刷新和局部刷新

全局刷新: 整个浏览器被新的数据覆盖。 在网络中传输大量的数据。 浏览器需要加载,渲染页面。
局部刷新: 在浏览器器的内部,发起请求,获取数据,改变页面中的部分内容。
其余的页面无需加载和渲染。 网络中数据传输量少, 给用户的感受好。
ajax是用来做局部刷新的。局部刷新使用的核心对象是 异步对象(XMLHttpRequest)
这个异步对象是存在浏览器内存中的 ,使用javascript语法创建和使用XMLHttpRequest对象。

2.ajax:Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

Asynchronous: 异步的意思
JavaScript:javascript脚本,在浏览器中执行
and : 和
xml : 是一种数据格式

ajax是一种做局部刷新的新方法(2003左右),不是一种语言。 ajax包含的技术主要有javascript,
dom,css, xml等等。 核心是javascript 和 xml 。
javascript:负责创建异步对象, 发送请求, 更新页面的dom对象。 ajax请求需要服务器端的数据。
xml: 网络中的传输的数据格式。 使用json替换了xml 。
<数据>
<数据1>宝马1</数据1>
<数据2>宝马2</数据2>
<数据3>宝马3</数据3>
<数据4>宝马4</数据4>
</数据>

3.ajax中使用XMLHttpRequest对象

  1. 1)创建异步对象 var xmlHttp = new XMLHttpRequest();

2)给异步对象绑定事件。onreadystatechange :当异步对象发起请求,获取了数据都会触发这个事件。
这个事件需要指定一个函数, 在函数中处理状态的变化。

  1. btn.onclick = fun1()<br /> function fun1(){<br /> alert("按钮单击");<br /> }<br /> 例如:<br /> xmlHttp.onreadystatechange= function(){<br /> 处理请求的状态变化。<br /> if(xmlHttp.readyState == 4 && xmlHttp.status== 200 ){<br /> //可以处理服务器端的数据,更新当前页面<br /> var data = xmlHttp.responseText;<br /> document.getElementById("name").value= data;<br /> }<br /> }

异步对象的属性 readyState 表示异步对象请求的状态变化
0:创建异步对象时, new XMLHttpRequest();
1: 初始异步请求对象, xmlHttp.open()
2:发送请求, xmlHttp.send()
3: 从服务器端获取了数据,此时3, 注意3是异步对象内部使用, 获取了原始的数据。
4:异步对象把接收的数据处理完成后。 此时开发人员在4的时候处理数据。
在4的时候,开发人员做什么 ? 更新当前页面。
异步对象的status属性,表示网络请求的状况的, 200, 404, 500, 需要是当status==200
时,表示网络请求是成功的。

3) 初始异步请求对象
异步的方法open().
xmlHttp.open(请求方式get|post, “服务器端的访问地址”, 同步|异步请求(默认是true,异步请求))
例如:
xmlHttp.open(“get”, “loginServlet?name=zs&pwd=123”,true);

4)使用异步对象发送请求
xmlHttp.send()
获取服务器端返回的数据, 使用异步对象的属性 responseText .
使用例子:xmlHttp.responseText
回调:当请求的状态变化时,异步对象会自动调用onreadystatechange事件对应的函数。
访问地址: 使用get方式传递参数
http://localhost:8080/course_myajax/bmiPrint?name=李四&w=82&h=1.8

3.1 使用ajax的局部刷新

1.新建jsp,使用XMLHttpRequest异步对象。
使用异步对象有四个步骤:
1.创建
2.绑定事件
3.初始请求
4.发送请求。
2.创建服务器的servlet,接收并处理数据, 把数据输出给异步对象。

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>局部刷新-ajax</title>
  5. <script type="text/javascript">
  6. //使用内存中的异步对象,代替浏览器发起请求。异步对象使用js创建和管理的。
  7. function doAjax() {
  8. //1.创建异步对象
  9. var xmlHttp = new XMLHttpRequest();
  10. //2.绑定事件
  11. xmlHttp.onreadystatechange = function () {
  12. //处理服务器端返回的数据,更新当前页面
  13. //alert("readyState属性值======" + xmlHttp.readyState + "| status:" + xmlHttp.status)
  14. if( xmlHttp.readyState == 4 && xmlHttp.status ==200){
  15. // alert(xmlHttp.responseText);
  16. var data = xmlHttp.responseText;
  17. //更新dom对象, 更新页面数据
  18. document.getElementById("mydata").innerText = data;
  19. }
  20. }
  21. //3.初始请求数据
  22. //获取dom对象的value属性值
  23. var name = document.getElementById("name").value;
  24. var w = document.getElementById("w").value;
  25. var h = document.getElementById("h").value;
  26. //bmiPrint?name=李四&w=82&h=1.8
  27. var param = "name="+name + "&w="+w+"&h="+h;
  28. //alert("param="+param);
  29. xmlHttp.open("get","bmiAjax?"+param,true);
  30. //4.发起请求
  31. xmlHttp.send();
  32. }
  33. </script>
  34. </head>
  35. <body>
  36. <p>局部刷新ajax-计算bmi</p>
  37. <div>
  38. <!-- 没有使用form -->
  39. 姓名:<input type="text" id="name" /> <br/>
  40. 体重(公斤):<input type="text" id="w" /> <br/>
  41. 身高(米):<input type="text" id="h" /> <br/>
  42. <input type="button" value="计算bmi" onclick="doAjax()">
  43. <br/>
  44. <br/>
  45. <div id="mydata">等待加载数据....</div>
  46. </div>
  47. </body>
  48. </html>
  1. package com.bjpowernode.controller;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. import java.io.PrintWriter;
  8. // servlet
  9. public class BmiAjaxServlet extends HttpServlet {
  10. protected void doPost(HttpServletRequest request,
  11. HttpServletResponse response)
  12. throws ServletException, IOException {
  13. }
  14. protected void doGet(HttpServletRequest request,
  15. HttpServletResponse response)
  16. throws ServletException, IOException {
  17. System.out.println("====接收了ajax的请求=====");
  18. //接收参数
  19. String strName = request.getParameter("name");
  20. String weight = request.getParameter("w");
  21. String height = request.getParameter("h");
  22. //计算bmi
  23. float h = Float.valueOf(height);
  24. float w = Float.valueOf(weight);
  25. float bmi = w / ( h * h);
  26. //判断bmi的范围
  27. String msg = "";
  28. if( bmi <= 18.5) {
  29. msg = "您比较瘦";
  30. } else if( bmi > 18.5 && bmi <= 23.9 ){
  31. msg = "你的bmi是正常的";
  32. } else if( bmi >24 && bmi <=27){
  33. msg = "你的身体比较胖";
  34. } else {
  35. msg = "你的身体肥胖";
  36. }
  37. System.out.println("msg="+msg);
  38. msg = "您好:"+strName + "先生/女士, 您的bmi值是:"+ bmi + ","+ msg;
  39. //响应ajax需要的数据,使用HttpServletResponse输出数据
  40. response.setContentType("text/html;charset=utf-8");
  41. PrintWriter pw = response.getWriter();
  42. pw.println(msg);
  43. pw.flush();
  44. pw.close();
  45. }
  46. }

4.json使用

ajax发起请求———-servlet(返回的一个json格式的字符串 { name:”河北”, jiancheng:”冀”,”shenghui”:”石家庄”})

4.1 json分类:

  1. json对象 ,JSONObject ,这种对象的格式 名称:值, 也可以看做是 key:value 格式。
    2. json数组, JSONArray, 基本格式 [{ name:”河北”, jiancheng:”冀”,”shenghui”:”石家庄”} , { name:”山西”, jiancheng:”晋”,”shenghui”:”太原”} ]

4.2 为什么要使用json :

  1. json格式好理解
    2. json格式数据在多种语言中,比较容易处理。 使用java, javascript读写json格式的数据比较容易。
    3. json格式数据他占用的空间下,在网络中传输快, 用户的体验好。
    处理json的工具库: gson(google); fastjson(阿里),jackson, json-lib
    在js中的,可以把json格式的字符串,转为json对象, json中的key,就是json对象的属性名。

4.3 ajax请求处理方法

image.png

5、根据省份id查询省份名称

省份实体类

  1. package com.bjpowernode.entity;
  2. public class Province {
  3. private Integer id;
  4. private String name;
  5. private String jiancheng;
  6. private String shenghui;
  7. public Integer getId() {
  8. return id;
  9. }
  10. public void setId(Integer id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public String getJiancheng() {
  20. return jiancheng;
  21. }
  22. public void setJiancheng(String jiancheng) {
  23. this.jiancheng = jiancheng;
  24. }
  25. public String getShenghui() {
  26. return shenghui;
  27. }
  28. public void setShenghui(String shenghui) {
  29. this.shenghui = shenghui;
  30. }
  31. }

DAO层

  1. package com.bjpowernode.dao;
  2. import com.bjpowernode.entity.Province;
  3. import java.sql.*;
  4. //使用jdbc访问数据库
  5. public class ProvinceDao {
  6. //根据id获取名称
  7. public String queryProviceNameById(Integer proviceId){
  8. Connection conn = null;
  9. PreparedStatement pst = null;
  10. ResultSet rs = null;
  11. String sql= "";
  12. String url="jdbc:mysql://localhost:3306/springdb";
  13. String username="root";
  14. String password="123456";
  15. String name = "";
  16. //加载驱动
  17. try {
  18. Class.forName("com.mysql.jdbc.Driver");
  19. conn = DriverManager.getConnection(url,username,password);
  20. //创建PreparedStatement
  21. sql="select name from province where id=?";
  22. pst = conn.prepareStatement(sql);
  23. //设置参数值
  24. pst.setInt(1,proviceId);
  25. //执行sql
  26. rs = pst.executeQuery();
  27. //遍历rs
  28. /*while(rs.next()){ //当你的rs中有多余一条记录时。
  29. name = rs.getString("name");
  30. }*/
  31. if( rs.next()){
  32. name =rs.getString("name");
  33. }
  34. } catch (ClassNotFoundException | SQLException e) {
  35. e.printStackTrace();
  36. } finally {
  37. try{
  38. if( rs != null){
  39. rs.close();
  40. }
  41. if( pst != null){
  42. pst.close();
  43. }
  44. if( conn != null){
  45. conn.close();
  46. }
  47. }catch(Exception e){
  48. e.printStackTrace();
  49. }
  50. }
  51. return name;
  52. }
  53. //根据id获取一个完整的Province对象
  54. public Province queryProviceById(Integer proviceId){
  55. Connection conn = null;
  56. PreparedStatement pst = null;
  57. ResultSet rs = null;
  58. String sql= "";
  59. String url="jdbc:mysql://localhost:3306/springdb";
  60. String username="root";
  61. String password="123456";
  62. Province province = null;
  63. //加载驱动
  64. try {
  65. Class.forName("com.mysql.jdbc.Driver");
  66. conn = DriverManager.getConnection(url,username,password);
  67. //创建PreparedStatement
  68. sql="select id, name, jiancheng, shenghui from province where id=?";
  69. pst = conn.prepareStatement(sql);
  70. //设置参数值
  71. pst.setInt(1,proviceId);
  72. //执行sql
  73. rs = pst.executeQuery();
  74. //遍历rs
  75. /*while(rs.next()){ //当你的rs中有多余一条记录时。
  76. name = rs.getString("name");
  77. }*/
  78. if( rs.next()){
  79. province = new Province();
  80. province.setId( rs.getInt("id"));
  81. province.setName(rs.getString("name"));
  82. province.setJiancheng(rs.getString("jiancheng"));
  83. province.setShenghui(rs.getString("shenghui"));
  84. }
  85. } catch (ClassNotFoundException | SQLException e) {
  86. e.printStackTrace();
  87. } finally {
  88. try{
  89. if( rs != null){
  90. rs.close();
  91. }
  92. if( pst != null){
  93. pst.close();
  94. }
  95. if( conn != null){
  96. conn.close();
  97. }
  98. }catch(Exception e){
  99. e.printStackTrace();
  100. }
  101. }
  102. return province;
  103. }
  104. }
  1. package com.bjpowernode.controller;
  2. import com.bjpowernode.dao.ProvinceDao;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.io.PrintWriter;
  9. public class QueryProviceServlet extends HttpServlet {
  10. @Override
  11. protected void doGet(HttpServletRequest req,
  12. HttpServletResponse resp) throws ServletException, IOException {
  13. //处理get请求
  14. String strProid = req.getParameter("proid");
  15. System.out.println("strProid:"+ strProid);
  16. String name = "默认是无数据";
  17. //访问dao,查询数据库
  18. if( strProid != null && !"".equals(strProid.trim()) ){
  19. //创建dao对象,调用它的方法
  20. ProvinceDao dao = new ProvinceDao();
  21. name = dao.queryProviceNameById( Integer.valueOf(strProid));
  22. }
  23. //使用HttpServletResponse输出数据
  24. // servlet返回给浏览器的是 文本数据, 数据的编码是utf-8
  25. resp.setContentType("text/html;charset=utf-8");
  26. PrintWriter pw = resp.getWriter();
  27. //pw.println("中国");
  28. pw.println(name);
  29. pw.flush();
  30. pw.close();
  31. }
  32. }
  1. package com.bjpowernode.controller;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. public class LoginServlet extends HttpServlet {
  8. @Override
  9. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  10. super.doGet(req, resp);
  11. }
  12. @Override
  13. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  14. super.doPost(req, resp);
  15. }
  16. }
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>ajax根据省份id获取名称</title>
  5. <script type="text/javascript">
  6. function search() {
  7. //发起ajax请求,传递参数给服务器, 服务器返回数据
  8. //1.创建异步对象
  9. var xmlHttp = new XMLHttpRequest();
  10. //2.绑定事件
  11. xmlHttp.onreadystatechange = function () {
  12. if( xmlHttp.readyState == 4 && xmlHttp.status== 200){
  13. //alert(xmlHttp.responseText)
  14. //更新页面,就是更新dom对象
  15. document.getElementById("proname").value= xmlHttp.responseText;
  16. }
  17. }
  18. //3.初始异步对象
  19. //获取proid文本框的值
  20. var proid = document.getElementById("proid").value;
  21. xmlHttp.open("get","queryProvice?proid="+proid,true);
  22. //4.发送请求
  23. xmlHttp.send();
  24. }
  25. </script>
  26. </head>
  27. <body>
  28. <p>ajax根据省份id获取名称</p>
  29. <table>
  30. <tr>
  31. <td>省份编号:</td>
  32. <td><input type="text" id="proid"/>
  33. <input type="button" value="搜索" onclick="search()" />
  34. </td>
  35. </tr>
  36. <tr>
  37. <td>省份名称:</td>
  38. <td><input type="text" id="proname" /></td>
  39. </tr>
  40. </table>
  41. </body>
  42. <a href="html/main.jsp">link</a>
  43. </html>
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>使用json格式的数据</title>
  5. <script type="text/javascript">
  6. function doSearch() {
  7. //1.创建异步对象
  8. var xmlHttp = new XMLHttpRequest();
  9. //2.绑定事件
  10. xmlHttp.onreadystatechange = function() {
  11. if( xmlHttp.readyState == 4 && xmlHttp.status == 200){
  12. var data = xmlHttp.responseText;
  13. //eval是执行括号中的代码, 把json字符串转为json对象
  14. var jsonobj = eval("(" + data + ")");
  15. //更新dom对象
  16. callback(jsonobj);
  17. }
  18. }
  19. //3.初始异步对象的请求参数
  20. var proid = document.getElementById("proid").value;
  21. // true :异步处理请求。 使用异步对象发起请求后,不用等待数据处理完毕,就可以执行其它的操作。
  22. // false:同步,异步对象必须处理完成请求,从服务器端获取数据后,才能执行send之后的代码。 任意时刻只能执行一个异步请求。
  23. xmlHttp.open("get","queryjson?proid="+proid,false);
  24. //4.发送请求
  25. xmlHttp.send();
  26. //也可以创建其它的 XMLHttpRequest, 发送其它的请求处理。
  27. alert("====在send之后的代码====")
  28. }
  29. //定义函数,处理服务器端返回的数据
  30. function callback(json){
  31. document.getElementById("proname").value = json.name;
  32. document.getElementById("projiancheng").value=json.jiancheng;
  33. document.getElementById("proshenghui").value= json.shenghui;
  34. }
  35. </script>
  36. </head>
  37. <body>
  38. <p>ajax请求使用json格式的数据</p>
  39. <table>
  40. <tr>
  41. <td>省份编号:</td>
  42. <td><input type="text" id="proid">
  43. <input type="button" value="搜索" onclick="doSearch()">
  44. </td>
  45. </tr>
  46. <tr>
  47. <td>省份名称:</td>
  48. <td><input type="text" id="proname"></td>
  49. </tr>
  50. <tr>
  51. <td>省份简称:</td>
  52. <td><input type="text" id="projiancheng"></td>
  53. </tr>
  54. <tr>
  55. <td>省会名称:</td>
  56. <td><input type="text" id="proshenghui"></td>
  57. </tr>
  58. </table>
  59. </body>
  60. </html>
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>使用json格式的数据</title>
  5. <script type="text/javascript" src="js/jquery-3.4.1.js"></script>
  6. <script type="text/javascript">
  7. $(function(){
  8. $("#btn").click(function () {
  9. //获取dom的value值
  10. var proid = $("#proid").val();
  11. //发起ajax请求
  12. $.ajax({
  13. url:"queryjson",
  14. data:{
  15. "proid":proid
  16. },
  17. dataType:"json",
  18. success:function (resp) {
  19. //resp是json对象
  20. //alert(resp.name + " === "+resp.jiancheng)
  21. $("#proname").val(resp.name);
  22. $("#projiancheng").val(resp.jiancheng);
  23. $("#proshenghui").val(resp.shenghui);
  24. }
  25. })
  26. });
  27. })
  28. </script>
  29. </head>
  30. <body>
  31. <p>ajax请求使用json格式的数据</p>
  32. <table>
  33. <tr>
  34. <td>省份编号:</td>
  35. <td><input type="text" id="proid">
  36. <input type="button" value="搜索" id="btn">
  37. </td>
  38. </tr>
  39. <tr>
  40. <td>省份名称:</td>
  41. <td><input type="text" id="proname"></td>
  42. </tr>
  43. <tr>
  44. <td>省份简称:</td>
  45. <td><input type="text" id="projiancheng"></td>
  46. </tr>
  47. <tr>
  48. <td>省会名称:</td>
  49. <td><input type="text" id="proshenghui"></td>
  50. </tr>
  51. </table>
  52. </body>
  53. </html>
  1. package com.bjpowernode.controller;
  2. import com.bjpowernode.dao.ProvinceDao;
  3. import com.bjpowernode.entity.Province;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10. import java.io.PrintWriter;
  11. public class QueryJsonServlet extends HttpServlet {
  12. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. }
  14. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. //默认值, {} :表示json格式的数据
  16. String json = "{}";
  17. // 获取请求参数,省份的id
  18. String strProid = request.getParameter("proid");
  19. System.out.println("strProid========="+strProid);
  20. //判断proid有值时,调用dao查询数据
  21. if( strProid != null && strProid.trim().length() > 0 ){
  22. ProvinceDao dao = new ProvinceDao();
  23. Province p = dao.queryProviceById(Integer.valueOf(strProid));
  24. //需要使用jackson 把 Provice对象转为 json
  25. ObjectMapper om = new ObjectMapper();
  26. json = om.writeValueAsString(p);
  27. }
  28. //把获取的数据,通过网络传给ajax中的异步对象,响应结果数据
  29. //指定服务器端(servlet)返回给浏览器的是json格式的数据,json数据使用utf-8编码的
  30. //response.setContentType("text/json;charset=utf-8");
  31. response.setContentType("application/json;charset=utf-8");
  32. PrintWriter pw = response.getWriter();
  33. /**
  34. * <provines>
  35. * <province>
  36. * <name>河北</name>
  37. * <shenghui>石家庄</shenghui>
  38. * </province>
  39. * <province>
  40. * <name>山西</name>
  41. * <shenghui>太原</shenghui>
  42. * </province>
  43. * </provines>
  44. */
  45. pw.println(json); //输出数据---会付给ajax中 responseText属性
  46. pw.flush();
  47. pw.close();
  48. }
  49. }
  1. package com.bjpowernode;
  2. import com.bjpowernode.entity.Province;
  3. import com.fasterxml.jackson.core.JsonProcessingException;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. public class TestJson {
  6. public static void main(String[] args) throws JsonProcessingException {
  7. // 使用jackson 把java对象转为json格式的字符串
  8. Province p = new Province();
  9. p.setId(1);
  10. p.setName("河北");
  11. p.setJiancheng("冀");
  12. p.setShenghui("石家庄");
  13. //使用jackson 把 p 转为 json
  14. ObjectMapper om = new ObjectMapper();
  15. // writeValueAsString:把参数的java对象转为json格式的字符串
  16. String json = om.writeValueAsString(p);
  17. System.out.println("转换的json=="+json);
  18. }
  19. }