2023年3月

1. ajax是什么?
* asynchronous javascript and xml:异步的js和xml
* 它能使用js访问服务器,而且是异步访问!
* 服务器给客户端的响应一般是整个页面,一个html完整页面!但在ajax中因为是局部刷新,那么服务器就不用再响应整个页面!而只是数据!
> text:纯文本
> xml:大家都熟悉!!!
> json:它是js提供的数据交互格式,它在ajax中最受欢迎!

2. 异步交互和同步交互
* 同步:
> 发一个请求,就要等待服务器的响应结束,然后才能发第二个请求!中间这段时间就是一个字“卡”
> 刷新的是整个页面!
* 异步:
> 发一个请求后,无需等待服务器的响应,然后就可以发第二个请求!
> 可以使用js接收服务器的响应,然后使用js来局部刷新!

3. ajax应用场景
* 百度的搜索框
* 用户注册时(校验用户名是否被注册过)

4. ajax的优缺点
优点:
* 异步交互:增强了用户的体验!
* 性能:因为服务器无需再响应整个页面,只需要响应部份内容,所以服务器的压力减轻了!

缺点:
* ajax不能应用在所有场景!
* ajax无端的增多了对服务器的访问次数,给服务器带来了压力!

==========================================
==========================================

ajax发送异步请求(四步操作)

1. 第一步(得到XMLHttpRequest)
* ajax其实只需要学习一个对象:XMLHttpRequest,如果掌握了它,就掌握了ajax!!!
* 得到XMLHttpRequest
> 大多数浏览器都支持:var xmlHttp = new XMLHttpRequest();
> IE6.0:var xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
> IE5.5以更早版本的IE:var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

* 编写创建XMLHttpRequest对象的函数
function createXMLHttpRequest() {
try {
return new XMLHttpRequest();
} catch(e) {
try {
return new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try {
return new ActiveXObject("Microsoft.XMLHTTP");
} catch(e) {
alert("哥们儿,你用的是什么浏览器啊?");
throw e;
}
}
}
}

2. 第二步(打开与服务器的连接)
* xmlHttp.open():用来打开与服务器的连接,它需要三个参数:
> 请求方式:可以是GET或POST
> 请求的URL:指定服务器端资源,例如;/day23_1/AServlet
> 请求是否为异步:如果为true表示发送异步请求,否则同步请求!
* xmlHttp.open("GET", "/day23_1/AServlet", true);

3. 第三步(发送请求)
* xmlHttp.send(null):如果不给可能会造成部份浏览器无法发送!
> 参数:就是请求体内容!如果是GET请求,必须给出null。

4. 第四步()
* 在xmlHttp对象的一个事件上注册监听器:onreadystatechange
* xmlHttp对象一共有5个状态:
> 0状态:刚创建,还没有调用open()方法;
> 1状态:请求开始:调用了open()方法,但还没有调用send()方法
> 2状态:调用完了send()方法了;
> 3状态:服务器已经开始响应,但不表示响应结束了!
> 4状态:服务器响应结束!(通常我们只关心这个状态!!!)
* 得到xmlHttp对象的状态:
> var state = xmlHttp.readyState;//可能是0、1、2、3、4
* 得到服务器响应的状态码
> var status = xmlHttp.status;//例如为200、404、500
* 得到服务器响应的内容1
> var content = xmlHttp.responseText;//得到服务器的响应的文本格式的内容
> var content = xmlHttp.responseXML;//得到服务器的响应的xml响应的内容,它是Document对象了!

xmlHttp.onreadystatechange = function() {//xmlHttp的5种状态都会调用本方法
if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {//双重判断:判断是否为4状态,而且还要判断是否为200
// 获取服务器的响应内容
var text = xmlHttp.responseText;
}
};

==========================================
==========================================

第二例:发送POST请求(如果发送请求时需要带有参数,一般都用POST请求)

* open:xmlHttp.open("POST" ....);
* 添加一步:设置Content-Type请求头:
> xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
* send:xmlHttp.send("username=zhangSan
&password=123");//发送请求时指定请求体


==========================================
==========================================

第三例:注册表单之校验用户是否注册!

1. 编写页面:
* ajax3.jsp
> 给出注册表单页面
> 给用户名文本框添加onblur事件的监听
> 获取文本框的内容,通过ajax4步发送给服务器,得到响应结果
* 如果为1:在文本框后显示“用户名已被注册”
* 如果为0:什么都不做!

2. 编写Servlet
* ValidateUsernameServlet
> 获取客户端传递的用户名参数
> 判断是否为itcast
* 是:返回1
* 否:返回0

==========================================
==========================================

响应内容为xml数据

* 服务器端:
> 设置响应头:ContentType,其值为:text/xml;charset=utf-8
* 客户端:
> var doc = xmlHttp.responseXML;//得到的是Document对象!

=====================

第四例:响应内容为xml数据

==========================================
==========================================

第五例:省市联动

1. 页面
<selectname="province">
<option>===请选择省份===</option>
</select>
<selectname="city">
<option>===请选择城市===</option>
</select>2. ProvinceServlet
* ProvinceServlet:当页面加载完毕后马上请求这个Servlet!
> 它需要加载china.xml文件,把所有的省的名称使用字符串发送给客户端!

3. 页面的工作
* 获取这个字符串,使用逗号分隔,得到数组
* 循环遍历每个字符串(省份的名称),使用每个字符串创建一个
<option>元素添加到<selectname="province">这个元素中

4. CityServlet
* CityServlet:当页面选择某个省时,发送请求!
* 得到省份的名称,加载china.xml文件,查询出该省份对应的元素对象!,把这个元素转换成xml字符串,发送给客户端

5. 页面的工作
* 把
<selectname="city">中的所有子元素删除,但不要删除<option>===请选择城市===</option>* 得到服务器的响应结果:doc!!!
* 获取所有的
<city>子元素,循环遍历,得到<city>的内容
* 使用每个
<city>的内容创建一个<option>元素,添加到<selectname="city">==========================================
==========================================

XStream

1. 什么作用
* 可以把JavaBean转换为(序列化为)xml

2. XStream的jar包
* 核心JAR包:xstream-1.4.7.jar;
* 必须依赖包:xpp3_min-1.1.4c(XML Pull Parser,一款速度很快的XML解析器);

3. 使用步骤
* XStream xstream = new XStream();
* String xmlStr = xstream.toXML(javabean);

4. 使用细节
* 别名:把类型对应的元素名修改了
> xstream.alias("china", List.class):让List类型生成的元素名为china
> xstream.alias("province", Province.class):让Province类型生成的元素名为province
* 使用为属性:默认类的成员,生成的是元素的子元素!我们希望让类的成员生成元素的属性
> xstream.useAttributeFor(Province.class, "name"):把Province类的名为name成员,生成
<province>元素的name属性
* 去除Collection类型的成名:我们只需要Collection的内容,而不希望Collection本身也生成一个元素
> xstream.addImplicitCollection(Province.class, "cities"):让Province类的名为cities(它是List类型的,它的内容还会生成元素)的成名不生成元素
* 去除类的指定成名,让其不生成xml元素
> xstream.omitField(City.class, "description"):在生成的xml中不会出现City类的名为description的对应的元素!

==========================================
==========================================

JSON

1. json是什么
* 它是js提供的一种数据交换格式!

2. json的语法
* {}:是对象!
> 属性名必须使用双引号括起来!单引不行!!!
> 属性值:
* null
* 数值
* 字符串
* 数组:使用[]括起来
* boolean值:true和false

3. 应用json
* var person = {"name":"zhangSan", "age":18, "sex":"male"};

4. json与xml比较
* 可读性:XML胜出
* 解析难度:JSON本身就是JS对象(主场作战),所以简单很多
* 流行度:XML已经流行好多年,但在AJAX领域,JSON更受欢迎。

-----------------------------------

json-lib

1. 是什么?
* 它可以把javabean转换成json串

2. jar包
* 略

3. 核心类
* JSONObject --> Map
> toString();
> JSONObject map = JSONObject.fromObject(person):把对象转换成JSONObject对象
* JSONArray --> List
> toString()
> JSONArray jsonArray = JSONObject.fromObject(list):把list转换成JSONArray对象

1、直接输出:

2、字符串 通过eval转换输出,里面涉及到一个转义问题,还要注意eval的用法里面需要加"("+ + ")"

3、

\黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day23-资料源码\ajax_code\day23_3

本代码中有模拟 jquery里面的对Ajax的简化封装:

json2.jsp  Ajax原生请求

<%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'json2.jsp' starting page</title>
    
    <metahttp-equiv="pragma"content="no-cache">
    <metahttp-equiv="cache-control"content="no-cache">
    <metahttp-equiv="expires"content="0">    
    <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
    <metahttp-equiv="description"content="This is my page">
    <!--<link rel="stylesheet" type="text/css" href="styles.css">-->
<scripttype="text/javascript">
functioncreateXMLHttpRequest() {try{return newXMLHttpRequest();//大多数浏览器
}catch(e) {try{returnActvieXObject("Msxml2.XMLHTTP");//IE6.0
}catch(e) {try{returnActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本
}catch(e) {
alert(
"哥们儿,您用的是什么浏览器啊?");throwe;
}
}
}
}

window.onload
= function() {//获取btn元素 varbtn=document.getElementById("btn");
btn.onclick
= function() {//给按钮的点击事件上添加监听 //使用ajax得到服务器端响应,把结果显示到h3中 //1. 得到request varxmlHttp=createXMLHttpRequest();//2. 连接 xmlHttp.open("GET","<c:url value='/AServlet'/>",true);//3. 发送 xmlHttp.send(null);//4. 给xmlHttp的状态改变事件上添加监听 xmlHttp.onreadystatechange= function() {//双重判断 if(xmlHttp.readyState== 4 &&xmlHttp.status== 200) {vartext=xmlHttp.responseText;//它是一个json串 //执行json串 varperson=eval("(" +text+ ")");vars=person.name+ "," +person.age+ "," +person.sex;
document.getElementById(
"h3").innerHTML=s;
}
};
};
};
</script> </head> <body> <%--点击按钮后,把服务器响应的数据显示到h3元素中--%> <buttonid="btn">点击这里</button> <h1>JSON之Hello World</h1> <h3id="h3"></h3> </body> </html>

packagecn.itcast.demo1;importjava.util.ArrayList;importjava.util.List;importnet.sf.json.JSONArray;importnet.sf.json.JSONObject;importorg.junit.Test;/*** 演示JSON-LIB小工具 
*
@authorcxf
*
*/ public classDemo1 {/** 当map来用*/@Testpublic voidfun1() {
JSONObject map
= newJSONObject();
map.put(
"name", "zhangSan");
map.put(
"age", 23);
map.put(
"sex", "male");

String s
=map.toString();
System.out.println(s);
}
/** 当你已经有一个Person对象时,可以把Person转换成JSONObject对象*/@Testpublic voidfun2() {
Person p
= new Person("liSi", 32, "female");//把对象转换成JSONObject类型 JSONObject map =JSONObject.fromObject(p);
System.out.println(map.toString());
}
/*** JSONArray*/@Testpublic voidfun3() {
Person p1
= new Person("zhangSan", 23, "male");
Person p2
= new Person("liSi", 32, "female");

JSONArray list
= newJSONArray();
list.add(p1);
list.add(p2);

System.out.println(list.toString());
}
/*** 原来就有一个List,我们需要把List转换成JSONArray*/@Testpublic voidfun4() {
Person p1
= new Person("zhangSan", 23, "male");
Person p2
= new Person("liSi", 32, "female");
List
<Person> list = new ArrayList<Person>();
list.add(p1);
list.add(p2);


System.out.println(JSONArray.fromObject(list).toString());
}
}


//创建request对象
functioncreateXMLHttpRequest() {try{return new XMLHttpRequest();//大多数浏览器
    } catch(e) {try{return ActvieXObject("Msxml2.XMLHTTP");//IE6.0
        } catch(e) {try{return ActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本
            } catch(e) {
alert(
"哥们儿,您用的是什么浏览器啊?");throwe;
}
}
}
}
/** option对象有如下属性*/ /*请求方式*/method,/*请求的url*/url,/*是否异步*/asyn,/*请求体*/params,/*回调方法*/callback,/*服务器响应数据转换成什么类型*/typefunctionajax(option) {/** 1. 得到xmlHttp*/ var xmlHttp =createXMLHttpRequest();/** 2. 打开连接*/ if(!option.method) {//默认为GET请求 option.method = "GET";
}
if(option.asyn == undefined) {//默认为异步处理 option.asyn = true;
}
xmlHttp.open(option.method, option.url, option.asyn);
/** 3. 判断是否为POST*/ if("POST" ==option.method) {
xmlHttp.setRequestHeader(
"Content-Type", "application/x-www-form-urlencoded");
}
/** 4. 发送请求*/xmlHttp.send(option.params);/** 5. 注册监听*/xmlHttp.onreadystatechange= function() {if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {//双重判断 vardata;//获取服务器的响应数据,进行转换! if(!option.type) {//如果type没有赋值,那么默认为文本 data =xmlHttp.responseText;
}
else if(option.type == "xml") {
data
=xmlHttp.responseXML;
}
else if(option.type == "text") {
data
=xmlHttp.responseText;
}
else if(option.type == "json") {var text =xmlHttp.responseText;
data
= eval("(" + text + ")");
}
//调用回调方法 option.callback(data);
}
};
};

ajaxutils.js


<%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'json3.jsp' starting page</title>
    
    <metahttp-equiv="pragma"content="no-cache">
    <metahttp-equiv="cache-control"content="no-cache">
    <metahttp-equiv="expires"content="0">    
    <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
    <metahttp-equiv="description"content="This is my page">
    <!--<link rel="stylesheet" type="text/css" href="styles.css">-->
<scripttype="text/javascript"src="<c:url value='/ajax-lib/ajaxutils.js'/>"></script>

<scripttype="text/javascript">window.onload= function() {varbtn=document.getElementById("btn");
btn.onclick
= function() {/*1. ajax*/ajax(
{
url:
"<c:url value='/AServlet'/>",
type:
"json",
callback:
function(data) {
document.getElementById(
"h3").innerHTML=data.name+ "," +data.age+ "," +data.sex;
}
}
);
};
};
</script> </head> <body> <%--点击按钮后,把服务器响应的数据显示到h3元素中--%> <buttonid="btn">点击这里</button> <h1>显示自己封装的ajax小工具</h1> <h3id="h3"></h3> </body> </html>

json3.jsp 调用简化的Ajax

try{
SAXReader reader
= newSAXReader();
InputStream input
= this.getClass().getResourceAsStream("/china.xml");
Document doc
=reader.read(input);/** 查询所有province的name属性,得到一堆的属性对象
* 循环遍历,把所有的属性值连接成一个字符串,发送给客户端
*/List<Attribute> arrList = doc.selectNodes("//province/@name");
StringBuilder sb
= newStringBuilder();for(int i = 0; i < arrList.size(); i++) {
sb.append(arrList.get(i).getValue());
//把每个属性的值存放到sb中。 if(i < arrList.size() - 1) {
sb.append(
",");
}
}
response.getWriter().print(sb);
}
catch(Exception e) {throw newRuntimeException(e);
}

客户端解析字符串 要学会:放到下拉框里面;

\JavaWeb视频教程_day12_自定义标签JSTL标签库,java web之设计模式\day12_avi\12.EL入门.avi;


EL表达式1. EL是JSP内置的表达式语言!*jsp2.0开始,不让再使用java脚本,而是使用el表达式和动态标签来替代java脚本!* EL替代的是<%= ... %>,也就是说,EL只能做输出!2. EL表达式来读取四大域*${xxx},全域查找名为xxx的属性,如果不存在,输出空字符串,而不是null。*${pageScope.xxx}、${requestScope.xxx}、${sessionScope.xxx}、${applicationScope.xxx},指定域获取属性!3. javaBean导航<%Address address= newAddress();
address.setCity(
"北京");
address.setStreet(
"西三旗");

Employee emp
= newEmployee();
emp.setName(
"李小四");
emp.setSalary(
123456);
emp.setAddress(address);

request.setAttribute(
"emp", emp);%>

<h3>使用el获取request域的emp</h3>${requestScope.emp.address.street }<!--相当于 request.getAttribute("emp").getAddress().getStreet() --><br/>不能写方法,直接调用属性;不一定要有属性,只要有get方法就可以调用如:有get***();就可以在el里面调用***属性;4. EL可以输出的东西都在11个内置对象中!11个内置对象,其中10个是Map!pageContext不是map,它就是PageContext类型,1个项9个。*我们已经学习了四个*param:对应参数,它是一个Map,其中key参数名,value是参数值,适用于单值的参数。*paramValues:对应参数,它是一个Map,其中key参数名,value是多个参数值,适用于多值的参数。*header:对应请求头,它是一个Map,其中key表示头名称,value是单个头值,适用于单值请求头*headerValues:对应请求头,它是一个Map,其中key表示头名称,value是多个头值,适用于多值请求头* initParam:获取<context-param>内的参数!web.xml 中的初始化参数【所有servlet都可以用这个参数】,而servletconfig获取到的
    是局部的;在servlet中获取这个全局的是通过servlet,context来获取,待确认,!!!
<context-param>
<param-name>xxx</param-name>
<param-value>XXX</param-value>
</context-param>
<context-param>
<param-name>yyy</param-name>
<param-value>YYY</param-value>
</context-param>${initParam.xxx}* cookie:Map<String,Cookie>类型,其中key是cookie的name,value是cookie对象。 ${cookie.username.value}*pageContext:它是PageContext类型!${pageContext.request.contextPath}=========================================EL函数库(由JSTL提供的)* 导入标签库:<%@ tablib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>String toUpperCase(String input):把参数转换成大写
String toLowerCase(String input):把参数转换成小写
intindexOf(String input, String substring):从大串,输出小串的位置!booleancontains(String input, String substring):查看大串中是否包含小串booleancontainsIgnoreCase(String input, String substring):忽略大小写的,是否包含booleanstartsWith(String input, String substring):是否以小串为前缀booleanendsWith(String input, String substring):是否以小串为后缀
String substring(String input,
int beginIndex, intendIndex):截取子串
String substringAfter(String input, String substring):获取大串中,小串所在位置后面的字符串
substringBefore(String input, String substring):获取大串中,小串所在位置前面的字符串
String escapeXml(String input):把input中“
<”、">"、"&"、"'"、""",进行转义
String trim(String input):去除前后空格
String replace(String input, String substringBefore, String substringAfter):替换
String[] split(String input, String delimiters):分割字符串,得到字符串数组
intlength(Object obj):可以获取字符串、数组、各种集合的长度!
String join(String array[], String separator):联合字符串数组!