AjaxDay1

1.Ajax

Ajax(Asynchronous JavaScript And XML)异步的JavaScript(编程语言)和XML(文件格式)。

AJAX不是一门新的编程语言,是多门语言与已有技术组合后创新产生的技术。

核心点:

  核心编程语言是JS

  数据交换的工具是XML(现在已经被JSON替代)

  AJAX是一种异步请求方式

2同步请求与异步请求

使用Ajax需要先在页面导入相应的js文件

<!--引入jquery和MyAjax文件-->
<script type="text/javascript" src="${pageContext.request.contextPath}js/jquery-1.12.4.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/MyAjax.js"></script>

MyAjax.js

function myAJax(url,data,type,success){
// 1. 创建xhr对象
    var xhr;
    try{
        xhr= new XMLHttpRequest();
    }catch(e){
        try{
            xhr = new ActiveXObject("Msxml2.XMLHTTP");
        }catch(e){
            try{
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }catch(e){
                alert("您的浏览器不支持AJAX,请更换!");
                return false;
            }
        }
    }
// 2. 发起请求
// 2.1 设置请求方式和请求地址
// 2.2 发送数据
    if(type.toUpperCase() == "GET"){
        xhr.open("get",url+"?"+data);
        xhr.send();
    }else{
        xhr.open("post",url);
        //post方式必须设置Content-Type请求头,必须在open和send方法之前设置
        xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        xhr.send(data);
    }

// 3. 监听响应
    xhr.onreadystatechange= function(){
        if(xhr.readyState == 4){
            if(xhr.status == 200){
                //xhr.responseText;//获取响应的字符串
                //通过dom操作,将结果显示到页面
                //不同情况下,对于 结果字符串 的处理的代码是不同的
                success(xhr.responseText);

            }else{
                console.log(xhr.responseText);//获取到异常信息
            }
        }
    };
}

2 同步请求和异步请求

2.1 同步请求

浏览器发起的传统请求(表单、超链接、地址栏、location.href),都是同步请求。

用户从发起请求开始,到服务端响应结果完毕,这段时间内不能再操作页面。如果服务端响应结果耗时很长,用户在这段时间一直等待,用户体验很差。

同步请求的特点:

  • 一定刷新页面

  • 地址栏一定改变

  • 发起同步请求,会阻塞用户的其它操作

2.2 异步请求

AJAX是一种浏览器端的异步请求技术。

AJAX请求,服务端响应回不是一个完整页面,而是字符串(页面局部),不会刷新页面。

用户在JS发起请求开始,到服务端响应结果完毕,不用等待。用户可以一直操作页面,用户体验好。

异步请求的特点:

  • 不刷新页面

  • 地址栏不改变

  • 异步请求不会阻塞用户的其它操作

3 AJAX开发思路

AJAX技术核心对象是XMLHttpRequest对象,JS通过它和服务端建立连接,交换数据。

4 实战案例:校验用户名是否存在

4.1 同步方式

4.2 异步方式

 

asynchronousCheckUsername.jsp:

<html>
<head>
    <title>异步请求</title>
</head>
<body>
<form action="">
    用户名: <input type="text" name="username" id=""> <span id="usernameSpan"></span><br>
    <input type="button" value="校验">
</form>
<!--引入jquery.js -->
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.10.1.js"></script>
<script type="text/javascript">
    //通过jquery绑定事件
    $(function(){
        //进行事件绑定,保证一定在页面加载完毕时执行
        $("input:button").click(function(){
            //alert("单击了");
            //通过ajax发起用户名的校验请求
            // 获取到用户名
            var usernameVal = $("input[name='username']").val();

            // 1. 创建xhr对象
            var xhr;
            try{
                xhr= new XMLHttpRequest();
            }catch(e){
                try{
                    xhr = new ActiveXObject("Msxml2.XMLHTTP");
                }catch(e){
                    try{
                        xhr = new ActiveXObject("Microsoft.XMLHTTP");
                    }catch(e){
                        alert("您的浏览器不支持AJAX,请更换!");
                        return false;
                    }
                }
            }
            // 2. 发起请求
            // 2.1 设置请求方式和请求地址
            xhr.open("get","${pageContext.request.contextPath}/user/asynchronousCheckUsername?username="+usernameVal);

            // 2.2 发送数据
            xhr.send();





            // 3. 监听响应
           /* xhr.readyState
            属性值:0  刚新建xhr,没有open()
            1  xhr调用send(),建立连接
            2  开始接收到响应
            3  正在处理接收的数据
            4  接收处理数据完毕*/
           /* xhr.onreadystatechange
            事件:在readyState属性改变时触发*/


            xhr.onreadystatechange= function(){
                if(xhr.readyState == 4){
                    //获取到服务端响应的数据
                    //xhr.status 表示HTTP状态码
                    /*200 表示成功
                    302 表示重定向
                    404 资源找不到
                    500 服务器内部异常*/
                    if(xhr.status == 200){
                        //xhr.responseText;//获取响应的字符串
                        //通过dom操作,将结果显示到页面
                        $("#usernameSpan").html(xhr.responseText);
                    }else{
                        console.log(xhr.responseText);//获取到异常信息
                    }
                }
            };

        });
    })
</script>
</body>
</html>

AsynchronousCheckUsernameAction.java

public class AsynchronousCheckUsernameAction {
    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String check() throws InterruptedException, IOException {
        //校验
        //根据结果跳转
        // 调用业务层的校验方法
        //通过线程休眠,模拟耗时操作
        Thread.sleep(5000);
        //通过流响应结果
        HttpServletResponse response = ServletActionContext.getResponse();
        response.setCharacterEncoding("utf-8");
        PrintWriter pw = response.getWriter();
        if("xushy".equals(username)){
            pw.print("用户名已存在");
        }else{
            pw.print("用户名可以使用");
        }
        pw.flush();
        //不再跳转
        return null;
    }

}

5 AJAX发送post请求

1. 创建xhr对象
var xhr = new XMLHttpRequest();
2. 发起请求
   2.1 设置请求方式和请求地址
   xhr.open("post",url);
    //设置请求头
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
   2.2 发送数据
   xhr.send(data);//data: key=value的数据

3. 监听响应
xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
        if(xhr.status == 200){
            //请求正确,通过xhr.responseText获取结果字符串
        }else{
            //通过xhr.responseText获取异常信息
        }
    }
}

6 封装AJAX函数

function myAJax(url,data,type,success){
// 1. 创建xhr对象
        var xhr;
        try{
            xhr= new XMLHttpRequest();
        }catch(e){
            try{
                xhr = new ActiveXObject("Msxml2.XMLHTTP");
            }catch(e){
                try{
                    xhr = new ActiveXObject("Microsoft.XMLHTTP");
                }catch(e){
                    alert("您的浏览器不支持AJAX,请更换!");
                    return false;
                }
            }
        }
// 2. 发起请求
// 2.1 设置请求方式和请求地址
// 2.2 发送数据
        if(type.toUpperCase() == "GET"){
            xhr.open("get",url+"?"+data);
            xhr.send();
        }else{
            xhr.open("post",url);
            //post方式必须设置Content-Type请求头,必须在open和send方法之前设置
            xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            xhr.send(data);
        }

// 3. 监听响应
        xhr.onreadystatechange= function(){
            if(xhr.readyState == 4){
                if(xhr.status == 200){
                    //xhr.responseText;//获取响应的字符串
                    //通过dom操作,将结果显示到页面
                    //不同情况下,对于 结果字符串 的处理的代码是不同的
                    success(xhr.responseText);

                }else{
                    console.log(xhr.responseText);//获取到异常信息
                }
            }
        };
    }

为保证myAjax在多个页面都可以重用:

  1. 定义外部js文件myajax.js

  2. 在页面通过script标签引入,并使用

    7 实战案例

    7.1 登录

    同步请求的流程:异步请求的流程:login.jsp

  3. <html>
    <head>
        <title>登录页面</title>
    </head>
    <body>
    <span id="msg" style="color:red"></span>
    <form action="${pageContext.request.contextPath}/user/login">
        用户名: <input type="text" name="username" id=""> <br>
        密码: <input type="password" name="password" id=""> <br>
        <input type="button" value="登录">
    </form>
    
    <!-- 引入jQuery和自定义的js文件-->
    <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.10.1.js"></script>
    <script type="text/javascript" src="${pageContext.request.contextPath}/js/myajax.js"></script>
    <script type="text/javascript">
        //为input:button绑定单击事件
        $(function(){//保证页面加载完毕后执行
            //绑定事件
            $("input:button").click(function(){
                var usernameVal = $("input[name='username']").val();
                var passwordVal = $("input[name='password']").val();
                var url = "${pageContext.request.contextPath}/user/login";
                var data = "username="+usernameVal+"&password="+passwordVal;
                var type="post";
                myAJax(url,data,type,function(result){
                    if(result == "success"){
                        //登录成功,跳转到查询所有
                        location.href="${pageContext.request.contextPath}/student/showAllStudents";
                    }else{
                        //登录失败,回显错误信息
                        $("#msg").html(result);
                    }
                })
            })
        });
    </script>
    </body>
    </html>

    UserAction.java

    public class UserAction {
        private String username;
        private String password;
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String login() throws IOException {
            //调用业务层方法
            //模拟
            HttpServletResponse response = ServletActionContext.getResponse();
            response.setCharacterEncoding("utf-8");
            PrintWriter pw = response.getWriter();
            if("xushy".equals(username) && "123456".equals(password)){
                //登录成功
                pw.print("success");
            }else{
                //登录失败
                pw.print("用户名或密码错误");
            }
            pw.flush();
            return null;
        }
    }

    7.2 回显个人信息

 

  同步方式:

异步方式:

8 异步请求的编程模型

以粮为纲全面发展
原文地址:https://www.cnblogs.com/alexliuf/p/13811678.html