AJax

1.全局刷新和局部刷新

1.全局刷新:整个浏览器被新的数据覆盖。在网络中会传输大量的数据,浏览器需要加载、渲染页面。
2.局部刷新:
    1.概念:在浏览器内部发起请求,获取数据,改变页面的部分内容。其余页面无需加载和渲染。
    2.特点:网络中数据传输量少,用户体验好。
    3.实现方式:Ajax就是用来做局部刷新的

  4.示意图

2.异步对象
  1.Ajax技术是用来做局部刷新的,利用异步对象(XMLHTTPRequest)实现这个功能。
  2.这个异步对象存在于浏览器内存中,使用JS语法创建和使用异步对象。

3.概念

(1)Ajax:Asynchronous JavaScript and XML(异步的jS和XML)
    Asynchronous:异步
    JS:JavaScript脚本语言,在浏览器中执行
    xml:一种数据格式
(2)Ajax是一种局部刷新的新方法,不是一种语言。使用的技术主要包括:JS、dom、css、xml。
    JS:负责创建异步对象,发送请求,更新页面的DOM对象,
    JSON:网络中传输数据的格式,替代了冗余的xml数据格式
(3)发生了数据交换才是局部刷新的标志。

4.异步对象的属性:readyState:表示异步对象请求的状态变化


5.异步对象使用的步骤

第一步:创建异步对象:new XMLHttpRequest();

第二步:绑定事件

注意:函数写好以后,只要状态发生变化,它就会调用函数一次。

1  xmlHttp.onreadystatechange = function(){
2       // 处理请求的状态变化
3      if(xmlHttp.readState == 4 && xmlHttp.status== 200){
4           // 可以处理服务器的数据,更新当前页面
5            var data = xmlHttp.responseText;
6             document.getElementById("name").value = data;
7      }
8 }

第三步:初始化异步请求对象

  1.格式:xmlHttp.open("请求方式","服务器地址",同步|异步请求(默认是true));

  2.示例:xmlHttp.open("get","loginServlet?name=jason&pwd=123",true);

第四步:发送请求:xmlHttp.send();

6,异步对象使用案例

演示全局刷新:

1.index.jsp

1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
2 <center>
3   <form action="/myweb/one" method="get">
4     用户<input type="text" name="name"><br/>
5     身高(米)<input type="text" name="h"><br/>
6     体重(公斤)<input type="text" name="w"><br/>
7     <input type="submit" value="提交">
8   </form>
9 </center>

2.OneServlet

 1 package com.bjpowernode;
 2 
 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 
 9 public class OneServlet extends HttpServlet {
10 
11     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
12         // 1.获取请求参数
13         String name = request.getParameter("name");
14         String height = request.getParameter("h");
15         String weight = request.getParameter("w");
16 
17         // 2.计算BMI     BMI值 = 体重/身高的平方
18         float h = Float.valueOf(height);
19         float w = Float.valueOf(weight);
20         float bmi = w / (h * h);
21 
22         // 3.判断BMI的范围
23         String msg = "";
24         if(bmi <= 18.5){
25             msg = "你的身材处于偏瘦状态";
26         }else if(bmi > 18.5 && bmi <= 23.9){
27             msg = "你的身材处于正常状态";
28         }else if(bmi > 24 && bmi <= 27){
29             msg = "你的身材处于偏胖状态";
30         }else {
31             msg = "你的身材处于肥胖状态";
32         }
33         System.out.println(msg);
34         msg = ("你好" + name + "先生/女士,您的BMI值是" + bmi + "," + msg);
35 
36         // 4.把数据存储到request域中
37         request.setAttribute("msg",msg);
38 
39         // 5.然后通过请求转发到页面
40         request.getRequestDispatcher("/result.jsp").forward(request,response);
41     }
42 }

3.result.jsp

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3 <head>
 4     <title>Title</title>
 5 </head>
 6 <body>
 7     <p style="color: green;font-size: 40px">BMI值计算结果</p>
 8     <h3>${msg}</h3>
 9 </body>
10 </html>

局部刷新演示

1.index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
    <script type="text/javascript">
      // 使用内存中的异步对象,代替浏览器发送请求,异步对象使用JS创建和管理
        function doAjax(){
          var xmlHttp = new XMLHttpRequest();// 1.创建异步对象
          xmlHttp.onreadystatechange = function(){      // 2.绑定事件 
              if(xmlHttp.readyState == 4 && xmlHttp.status == 200){ // 处理服务器返回的数据,更新当前页面
                   var data = xmlHttp.responseText;   
                   var data = document.getElementById("mydata").innerText=data;// 更新dom对象,更新页面数据
              }
          }       
          var name = document.getElementById("name").value;   // 获取dom对象的属性值
          var w = document.getElementById("w").value;
          var h = document.getElementById("h").value;
          var param = "name=" + name + "&w="+w+ "&h="+h;
          xmlHttp.open("get","bmi?"+param,true); // 3.初始化请求数据
          xmlHttp.send();          // 4.发送请求
        }
    </script>
  </head>
  <body>
  <div>
      用户<input id="name"><br/>
      体重<input id="h"><br/>
      身高<input id="w"><br/>
      <input type="button" value="计算BMI值" onclick="doAjax()">
  </div>
  <br/>
  <br/>
  <div id="mydata">等待加载数据......</div>
  </body>
</html>

2.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>BmiServlet</servlet-name>
        <servlet-class>com.bjpowernode.BmiServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BmiServlet</servlet-name>
        <url-pattern>/bmi</url-pattern>
    </servlet-mapping>
</web-app>

3.servlet

package com.bjpowernode;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class BmiServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.接收请求参数
        String name = request.getParameter("name");
        String weight = request.getParameter("w");
        String height = request.getParameter("h");

        // 2.计算BMI     BMI值 = 体重/身高的平方
        float h = Float.valueOf(height);
        float w = Float.valueOf(weight);
        float bmi = w / (h * h);
        // 3.判断BMI的范围
        String msg = "";
        if(bmi <= 18.5){
            msg = "你的身材处于偏瘦状态";
        }else if(bmi > 18.5 && bmi <= 23.9){
            msg = "你的身材处于正常状态";
        }else if(bmi > 24 && bmi <= 27){
            msg = "你的身材处于偏胖状态";
        }else {
            msg = "你的身材处于肥胖状态";
        }
        System.out.println(msg);
        msg = ("你好" + name + "先生/女士,您的BMI值是" + bmi + "," + msg);
        // 4.输出数据
        response.setContentType("text/html;charset=utf-8");
        PrintWriter pw = response.getWriter();
        pw.write(msg);
        pw.flush();
        pw.close();
    }
}

4.tomcat路径配置:http://localhost:8080/myweb/

省市查询案例

1.基本步骤:

1.准备两张城市和省份的数据表
    
    1.省份信息表

    2.城市信息表

2.所需jar包
    1.jackson-annotations-2.9.0.jar
    2.jackson-core-2.9.0.jar
    3.jackson-databind-2.9.0.jar
    4.mysql-connector-java-5.1.6.jar

3.创建页面

4.使用JDBC访问数据库
    1.用到连接数据库的工具类

5.测试Servlet是否是通的

6.拿到省份编号文本框的值和Servlet绑在一起

7.拿到响应数据,将数据输出到省份名称文本框

1.index.jsp

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3   <head>
 4     <title>$Title$</title>
 5     <script type="text/javascript">
 6       function search(){
 7         // 1.创建异步对象
 8         var xmlHttp = new XMLHttpRequest();
 9         // 2.绑定事件
10         xmlHttp.onreadystatechange = function(){
11           // alert(xmlHttp.readyState);
12           if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
13             document.getElementById("proname").value = xmlHttp.responseText; //拿到响应数据 将响应数据输出到proname文本框里面
14           }
15         }
16         var proid = document.getElementById("proid").value; // 拿到proid文本框的值
17         xmlHttp.open("get","queryProvince?proid=" + proid,true);// 3.初始化异步对象
18         xmlHttp.send();// 4.发送数据
19       }
20     </script>
21   </head>
22   <body>
23     <p>Ajax 根据省份ID获取名称</p>
24     <table>
25       <tr>
26         <td>省份编号</td>
27         <td><input id="proid">
28             <input type="button" value="搜索" onclick="search()">
29         </td>
30       </tr>
31       <tr>
32         <td>省份名称</td>
33         <td><input id="proname"></td>
34       </tr>
35     </table>
36   </body>
37 </html>

2.web.xml

1  <servlet>
2         <servlet-name>QueryProvinceServlet</servlet-name>
3         <servlet-class>com.bjpowernode.controller.QueryProvinceServlet</servlet-class>
4     </servlet>
5     <servlet-mapping>
6         <servlet-name>QueryProvinceServlet</servlet-name>
7         <url-pattern>/queryProvince</url-pattern>
8     </servlet-mapping>

3.servlet

 1 package com.bjpowernode.controller;
 2 
 3 import com.bjpowernode.dao.ProvinceDao;
 4 
 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 
12 public class QueryProvinceServlet extends HttpServlet {
13     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
14         // 处理get请求
15         String proid = request.getParameter("proid");
16         System.out.println("proid=" + proid);
17         // 访问数据库,拿到数据
18         String result = "默认是无数据";
19         ProvinceDao dao = new ProvinceDao();
20         if(result != null && !"".equals(proid.trim())){  // 结果不为空,并且去掉两边空格后不能是空字符串
21             result = dao.queryProvinceNameById(Integer.valueOf(proid));
22         }
23         // 使用响应对象输出数据
24         response.setContentType("text/html;charset=utf-8");
25         PrintWriter pw = response.getWriter();
26         pw.write(result);
27         pw.flush();
28         pw.close();
29     }
30 }

4.项目结构图

posted @ 2021-02-28 12:16  兵长砍猴  阅读(62)  评论(0)    收藏  举报