全局刷新:整个浏览器被新的数据覆盖,需要在网络中传输大量的数据。浏览器需要加载,渲染页面。相当于我们正常点击访问网站的方式。
局部刷新:在浏览器的内部,发起请求,获取数据,改变页面的部分内容。其余的页面无需加载和渲染,网络中的数据传输量少,给用户感觉好。
而我们网页的局部刷新使用的就是Ajax!
首先我们编辑一个小程序来更好的理解什么叫做全局刷新。
bmiindex.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>全局刷新title>
head>
<body>
<p>全局刷新计算bmip>
<form action="bmiServlet" method="get">
姓名:<input type="text" name="name"/>
体重(公斤):<input type="text" name="w"/>
身高(米):<input type="text" name="h"/>
<input type="submit" value="提交"/>
form>
body>
html>
BmiPrintServlet.java
package com.test.controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BmiPrintServlet extends HttpServlet {
public BmiPrintServlet() {
// TODO Auto-generated constructor stub
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//接收请求参数
String name = req.getParameter("name");
String height = req.getParameter("h");
String weight = req.getParameter("w");
//计算bmi bmi = 体重/身高的平方
float h = Float.valueOf(height);
float w = Float.valueOf(weight);
float bmi = w / (h * h);
//判断bmi的范围
String msg = "";
if(bmi <= 18.5){
msg = "您比较瘦";
}else if(bmi > 18.5 && bmi <= 23.9){
msg = "你的bmi是正常的";
}else if(bmi > 23.9 && bmi <= 27){
msg = "你的身体比较胖";
}else{
msg = "你的身体肥胖";
}
msg = "您好:"+name+"先生/女士,您的bmi的值是:"+bmi+","+msg;
// 使用HttpServletResponse输出数据
resp.setContentType("text/html;charset=utf-8");
// 输出PrintWriter
PrintWriter pw = resp.getWriter();
//输出数据
pw.println(msg);
//清空缓存:可以加速网页加载
pw.flush();
//关闭pw
pw.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
web.xml
<servlet>
<servlet-name>BmiPrintServletservlet-name>
<servlet-class>com.test.controller.BmiPrintServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>BmiPrintServletservlet-name>
<url-pattern>/bmiPrinturl-pattern>
servlet-mapping>
打开bmiindex.jsp
输入你的基本信息,点击提交。
这种提交全局刷新后显示的过程叫做全局刷新。
上边讲到了全局刷新,现在讲一下使用ajax的局部刷新。
在使用ajax进行网页局部刷新时,主要使用XMLHttpRequest异步对象完成的。
1.首先,新建jsp,使用XMLHttpRequest异步对象。
使用异步对象有以下四个步骤:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>ajax局部刷新title>
<script type="text/javascript">
//使用内存的异步对象,代替浏览器发送请求。异步对象使用js创建和管理的。
function doAjax() {
// 1.创建异步对象
var xmlHttp = new XMLHttpRequest();
// 2.绑定事件
xmlHttp.onreadystatechange = function() {
// 处理服务器返回的数据,更新当前页面
if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
var data = xmlHttp.responseText;
document.getElementById("mydata").innerText = data;
}
}
// 获取dom对象的value属性值
var name = document.getElementById("name").value;
var w = document.getElementById("w").value;
var h = document.getElementById("h").value;
var param = "name="+name+"&w="+w+"&h="+h;
// 3.初始请求数据
xmlHttp.open("get", "bmiAjax?"+param, true);
// 4.发起请求
xmlHttp.send();
}
script>
head>
<body>
姓名:<input type="text" id="name"/><br>
体重(公斤):<input type="text" id="w"/><br>
身高(米):<input type="text" id="h"/><br>
<input type="button" value="计算bmi" onclick="doAjax()"/>
p>
body>
html>
可以看到我们的提交已经不是通过form表单完成,而是使用了doAjax()这个点击事件,使用内存的异步对象,代替浏览器发送请求,而异步对象使用js创建和管理的。
注意点:var param = “name=”+name+"&w="+w+"&h="+h;此处就是在模拟get方式的数据发送格式。
BmiAjaxServlet.java
package com.test.controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BmiAjaxServlet extends HttpServlet {
public BmiAjaxServlet() {
// TODO Auto-generated constructor stub
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//接收请求参数
String name = req.getParameter("name");
String height = req.getParameter("h");
String weight = req.getParameter("w");
//计算bmi bmi = 体重/身高的平方
float h = Float.valueOf(height);
float w = Float.valueOf(weight);
float bmi = w / (h * h);
//判断bmi的范围
String msg = "";
if(bmi <= 18.5){
msg = "您比较瘦";
}else if(bmi > 18.5 && bmi <= 23.9){
msg = "你的bmi是正常的";
}else if(bmi > 23.9 && bmi <= 27){
msg = "你的身体比较胖";
}else{
msg = "你的身体肥胖";
}
msg = "您好:"+name+"先生/女士,您的bmi的值是:"+bmi+","+msg;
// 相应ajax的数据,使用HttpServletResponse输出数据
resp.setContentType("text/html;charset=utf-8");
PrintWriter pw = resp.getWriter();
pw.println(msg);
pw.flush();
pw.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
这个servlet服务器的代码和全局刷新区别不大,最大的区别就是他是回调到发起请求的那个页面。
运行ajaxbmiindex.jsp,输入相应信息。
点击计算bmi。
回调信息直接显示在页面上,其他地方都没有改变,这就是我们使用ajax完成的局部刷新。