JavaWeb

来源:互联网 发布:神话特效软件 编辑:程序博客网 时间:2024/05/30 07:14

Ajax讲解

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无端的增多了对服务器的访问次数,给服务器带来了压力

5.ajax发送异步请求(四步操作)
1.第一步

  • 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 creatXMLHttpRequest(){    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
  • 得到服务器响应的内容
    • var content = xmlHttp.responseText;//得到服务器的响应的文本格式的内容
    • var content = xmlHttp.responseXML;//叨叨服务器的响应的xml响应的内容,xmlHttp对象会自动对响应的字符串进行解析,它是Document

示意代码:
双重判断

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

Ajax练习


第一例:Ajax的HelloWorld

Servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        // TODO Auto-generated method stub        System.out.println("Hello xiaohei");        response.getWriter().print("Hello xiaohei");    }

JSP:

<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><script>//创建异步对象function creatXMLHttpRequest(){    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;            }        }    }}window.onload = function(){//文档加载完毕后执行    var but = document.getElementById("but");    but.onclick = function(){//给按钮的点击事件注册监听        //ajax四步操作        //1.得到异步对象        var xmlHttp = creatXMLHttpRequest();        //2.打开数据库连接,这里是在jsp页面中使用标签,客户端看到jsp页面的时候是服务端tomcat把jsp页面变成html页面才发送过来的,到客户端就没有jsp标签了,已经变成字符串"/day23_1_itcast/AServlet"        xmlHttp.open("GET","<c:url value='/AServlet'/>", true);        //3.发送请求        xmlHttp.send(null);//GET请求没有请求体,但也要给出null,不然FireFox可能会不能发送        //4.给异步对象的onreadystatechange注册监听器        xmlHttp.onreadystatechange = function(){//当xmlHttp的状态发生变化时执行            //双重判断                  if(xmlHttp.readyState == 4 && xmlHttp.status == 200){                var h4 = document.getElementById("h4");                var text = xmlHttp.responseText;                h4.innerHTML = text;            }        }    }}</script></head><body>    <button id="but">点击这里</button>    <h4 id="h4"></h4></body>

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

  • open:xmlHttp.open(“POST”…)
  • 添加一步:设置Content-Type请求头:
    xmlHttp.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
  • send:xmlHttp.send(“username=zhangsan&password=123”);发送请求时指定请求体
    Servlet:
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        // TODO Auto-generated method stub        request.setCharacterEncoding("UTF-8");        response.setContentType("text/html;charset=UTF-8");        String username = request.getParameter("username");        System.out.println("(Post)...Hello xiaohei" + username);        response.getWriter().print("(Post:)...Hello xiaohei" + username);    }

JSP:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><script>function creatXMLHttpRequest(){    try {        return new XMLHttpRequest();    } catch (e) {        try {            return ActiveXObject("Msxml2.XMLHTTP");        } catch (e) {            try {                return ActiveXObject("Microsoft.XMLHTTP");            } catch (e) {                alert("您用的是什么浏览器啊?");                throw e;            }        }    }}window.onload = function(){    var but = document.getElementById("but");    but.onclick = function(){        //ajax四步操作        //1.得到异步对象        var xmlHttp = creatXMLHttpRequest();        //2.打开数据库连接        /********修改open方法,指定请求方式为POST**********/        xmlHttp.open("POST","<c:url value='/AServlet'/>", true);        /*********设置请求头:Content-Type*********/        xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");        //3.发送请求        /*********发送时指定请求体*********/        xmlHttp.send("username=张三");        //4.给异步对象的onreadystatechange注册监听器        xmlHttp.onreadystatechange = function(){            if(xmlHttp.readyState == 4 && xmlHttp.status == 200){            var h4 = document.getElementById("h4");            var text = xmlHttp.responseText;            h4.innerHTML = text;            }        }    }}</script></head><body>    <button id="but">点击这里</button>    <h4 id="h4"></h4></body></html>

第三例:用户名是否已被注册

Servlet:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        request.setCharacterEncoding("UTF-8");        response.setContentType("text/html;charset=UTF-8");        String username = request.getParameter("username");        if(username.equalsIgnoreCase("itcast")){            response.getWriter().print("1");        }else{            response.getWriter().print("0");        }    }

JSP:

<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><script type="text/javascript">function creatXMLHttpRequest(){    try {        return new XMLHttpRequest();    } catch (e) {        try {            return ActiveXObject("Msxml2.XMLHTTP");        } catch (e) {            try {                return ActiveXObject("Microsoft.XMLHTTP");            } catch (e) {                alert("您用的是什么浏览器啊?");                throw e;            }        }    }}    window.onload = function(){        //获取文本框,给它的失去焦点事件注册监听        var nameele = document.getElementById("usernameele");        nameele.onblur = function(){            //1.得到异步对象            var xmlHttp = creatXMLHttpRequest();            //2.开启与服务器的连接            xmlHttp.open("POST", "<c:url value='/ValidateUsernameServlet' />", true);            //3.设置请求头:Content-Type            xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");            //4.发送请求,给出请求体            xmlHttp.send("username=" + nameele.value);            //5.给xmlHttp的onreadystatechange事件注册监听            xmlHttp.onreadystatechange = function(){                //双重判断                if(xmlHttp.readyState == 4 && xmlHttp.status == 200){                    var text = xmlHttp.responseText;                    var spanele = document.getElementById("errorspan");                    if(text == "1"){                        spanele.innerHTML = "该用户名已被注册";                    } else {                        spanele.innerHTML = "";                    }                }            }        };    };</script></head><body>    <form action="" method="post">        name:<input type="text" name="username" id="usernameele" /><span id="errorspan"></span><br/>        password:<input type="password" name="password" /><br/>        <input type="submit" value="Submit" />    </form></body>

第四例:响应XML

如果服务端响应内容为xml数据:

  • 服务器端:设置响应头ContentType=“text/xml;charset=utf-8”
  • 客户端:var doc = xmlHttp.responseXML;//得到的是document对象
    Servlet:
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        String xml = "<students>" +                "<student number='ITCAST_1001'>" +                "<name>zhangsan</name>" +                "<age>18</age>" +                "<sex>male</sex>" +                "</student>" +                "</students>";        response.setContentType("text/xml);charset=UTF-8");        response.getWriter().print(xml);    }

JSP:

<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><script>function creatXMLHttpRequest(){    try {        return new XMLHttpRequest();    } catch (e) {        try {            return ActiveXObject("Msxml2.XMLHTTP");        } catch (e) {            try {                return ActiveXObject("Microsoft.XMLHTTP");            } catch (e) {                alert("您用的是什么浏览器啊?");                throw e;            }        }    }}window.onload = function(){     var but = document.getElementById("but");    but.onclick = function(){        //ajax四步操作        //1.得到异步对象        var xmlHttp = creatXMLHttpRequest();        //2.打开数据库连接        xmlHttp.open("GET","<c:url value='/BServlet'/>", true);        //3.发送请求        xmlHttp.send(null);        //4.给异步对象的onreadystatechange注册监听器        xmlHttp.onreadystatechange = function(){            if(xmlHttp.readyState == 4 && xmlHttp.status == 200){                //获取服务器响应结果(xml)                var doc = xmlHttp.responseXML;                var ele = doc.getElementsByTagName("student")[0];                //获取元素名为number的属性值                var number = ele.getAttribute("number");                var name;                 var age;                 var sex;                if(window.addEventListener){                    name = ele.getElementsByTagName("name")[0].textContent;//其他浏览器                } else{                    name = ele.getElementsByTagName("name")[0].text;//IE浏览器                }                if(window.addEventListener){                    age = ele.getElementsByTagName("age")[0].textContent;//其他浏览器                } else{                    age = ele.getElementsByTagName("age")[0].text;//IE浏览器                }                if(window.addEventListener){                    sex = ele.getElementsByTagName("sex")[0].textContent;//其他浏览器                } else{                    sex = ele.getElementsByTagName("sex")[0].text;//IE浏览器                }                var text = number + "," + name + "," + age + "," + sex;                var h4 = document.getElementById("h4");                h4.innerHTML = text;            }        }    }}</script></head><body>    <button id="but">点击这里</button>    <h4 id="h4"></h4></body></html>

JSON

JSON基础

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

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

3.应用json
var person = {“name”:”zhangsan”, “age”:18, “sex”:”male”};

服务端向客户端发送json串
String str = “{\”name\”:\”zhangsan\”, \”age\”:18, \”sex\”:\”male\”}”;
需要转义,为了能在字符串中正确的表示双引号,双引号是字符串内容的一部分
通常,我们在jsp页面中获取到服务器响应来的json串后,需要去执行它,就需要调用eval方法,然后在json串两边加上括号
var text = xmlHttp.responseText;
var person = eval(“(” + text + “)”);

json-lib

json-lib的核心jar包:json-lib.jar
json-lib的依赖jar包:

  • commons-lang.jar
  • commons-beanutils.jar
  • commons-logging.jar
  • commons-collections.jar
  • ezmorph.jar

核心类:
JSONObject:类似于Map

  • toString();返回一个JSON串
  • fromObject(Object arg);这是一个静态方法,可以把一个对象转成JSONObject类型
    JSONObject map = JSONObject.fromObject(person);

JSONArray:类似于List

  • toString();返回一个JSON串
    • fromObject(Object arg);
      JSONArray jsonArray = JSONObject.fromObject(list);把一个List转换成JSONArray
原创粉丝点击