【速成之路】网页编程必会的Ajax——Ajax工作流程(二)

🎉个人主页:这个昵称我想了20分钟
✨往期专栏: 【速成之路】jQuery
      【速成之路】SQLserver


🔓本期专栏:【速成之路】Ajax


在这里插入图片描述

在这里插入图片描述

请求头和主体信息

  HTTP协议中规定客户端向服务器端发送的信息分为两个部分:请求的头部信息请求的主体信息。其中,主体信息通常是发给服务器端的处理程序处理的数据,这是请求的核心数据部分,请求的头部信息用来传递一些对服务器及处理程序有用的附加信息,例如请求的字符集、客户端的类型等,这有助于服务器及处理程序能更好地处理主体数据。
  在Ajax应用中,使用 XMLHttpRequest 对象可以发送请求的头部信息及请求的主体信息。头部信息使用 setRequestHeader (name, value)方法发送。主体信息通过URL的附加参数通过 XMLHttpRequest 对象的send()方法发送。

Ajax请求

  Ajax使用 XMLHttpRequest 对象发送的请求,与浏览器发送的请求相比,并没有本质上的区别,都是基于HTTP协议的请求。在HTTP协议中规定了多种请求类型,从应用的角度来讲比较常用的包括GET请求POST请求

GET请求

  GET请求的主要用途是从指定的服务器中获取资源。在GET请求中,通常只需指定资源的路径。如果请求的是一个动态的资源,比如JSP、PHP、CGI等,可以在请求的路径后面附加查询的参数信息,以便程序可以根据该参数查询更为具体的信息。附加参数的方法如下所示:

请求的路径?名称1=值1&名称2=值2&名称3=值3…

  JSP在服务器端可以使用request. getQueryString()方法返回“?”后面的整个字符串,也可以使用==request.getParameter (“名称”)==返回某个值。

POST请求

  POST请求的主要用途是向服务器发送信息。在POST请求中,参数信息并不是通过URL来传递的,而是在请求的主体中,这部分信息用户无法看见,并且没有长度的限制。请求主体的参数格式如下所示:

名称1=值1&名称2=值2&名称3=值3…

  需要注意的是,为了通知服务器端请求的主体内容为表单中的参数信息,需要调用 XMLHttpRequest 的 setRequestHeader ()方法来设置请求头,否则将无法取到参数,该方法的使用如下所示:

setRequestHeader ("Content-Type"," application /x-www-form-urlencoded ;charset=UTF-8");

  JSP在服务器端可以使用request.getReader()方法以流的形式得到这些信息,也可以使用==request.getParameter (“名称”)==返回某个值。

  例1检测用户输入的用户名在服务器中是否已被其他用户使用,如果没有被使用,将用绿底白字显示“用户名可用”,否则将用红底白字显示“用户名被占用”,在浏览器的运行结果如图1和图2所示。

【例1】

<!DOCTYPE html>
<html>
   <head>
   <title>用户名测试</title>
   <meta http-equiv="keywords"content="keyword1,keyword2,keyword3">
   <meta http-equiv=" description "content="this is my page">
   <meta http-equiv="content-type" content="text/html;  charset=UTF-8">
   <script type="text/javascript ">
      window.onload=function(){
          var myUser=document.getElementById ("username");
          myUser.onblur= loadXMLDoc ;
          function  loadXMLDoc ()
          {
            var xmlhttp;
            if(window.XMLHttpRequest )
          {
            //IE7+、Firefox、Chrome、Opera、Safari浏览器执行代码
			xmlhttp=new  XMLHttpRequest ();
           }
           else
           {
             //IE6、IE5浏览器执行代码
             xmlhttp=new  ActiveXObject ("Microsoft.XMLHTTP");
            }
            xmlhttp.onreadystatechange =function(){
              //判断和服务器端的交互是否完成,判断服务器端是否正确返回了数据
              if(xmlhttp.readyState ==4){// readyState=4表示交互完成
                 if(xmlhttp.status==200){//status=200表示正确返回了数据
                 var message=xmlhttp.responseText ;//读取服务器返回的数据
                 var flag=message.replace(/\s*/g,"");//使用正则表达式删除空格
                 var disp=document.getElementById ("display")
                 if(flag=="true"){
                       disp.innerHTML="用户名被占用";
                       disp.style.color="white";
                       disp.style. background ="red";
                  }
                  else
                  {
                    disp.innerHTML="用户名可用";
                    disp.style.color="white";
                    disp.style.background ="green";
                   }
                }
            }
        }
        xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8"); 
		xmlhttp.open("POST","/he11o/AjaxServlet ", true);//设置post方法
		xm1http.send('name='+myUser.value);//向服务器传送输入的用户名
        }
    }
   </script>
   </head>
<body>
   <form action=""  method="get">
     <input type="text"  id="username"  name="username">
     <span id="display"></span><br>
      <input type="submit"  value="测试">
   </form>
</body>
</html>

  例1中,当触发“失去焦点”的事件时,将调用以POST方式提交到服务器的Servlet,由Servlet进行简单的验证,即当用户名是“abc”时,向客户端返回“true”,其他任何用户名都返回“false”。这里调用的服务器端servlet程序的源代码名称是 AjaxServlet.java,如下所示:

package com.lb.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import  javascript.servlet.http.HttpServletResponse;
public class  AjaxServlet  extends  HttpServlet {
   private static final long serialVersionUID=1L;
   public  AjaxServlet (){
      super();
   }
   public void destroy(){
   super.destroy();
   //Put your code here
   }
   public void doGet( HttpServletRequest  request, HttpServletResponse  response) throws  ServletException , IOException {
     String username=(String)request.getParameter("name");
     response.setContentType("text/html");
     PrintWriter  out=response.getWriter();
     if(username.equals("abc")){   //用户名等于abc,返回true,否则返回false
      out.println(true);
     }
     else
     {
      out.println(false);
     }
   }
   public void doPost(HttpServletRequest  request, HttpServletResponse  response) throws  ServletException , IOException {
	   this.doGet(request, response);
   }
     public void init() throws  ServletException {
     //初始化Servlet
    }
}

例1中,如果使用GET方法向服务器端发送数据,可以把例1程序源代码中斜体的两行换成以下两句:

xmlhttp.open("GET","9-2-server. jsp? username="+myUser. value, true); 
xmlhttp.send();

在这里插入图片描述

  • 51
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 47
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个昵称我想了20分钟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值