【左京淳的JAVA WEB学习笔记】第七章 AJAX与JSON格式

AJAX指的是局部更新页面的技术,例如按了赞之後图示会变成实心的,按赞数也会增加之类的。
这个技术是透过javascript里面的一个物件实现的,叫做XMLHttpRequest。
嗯..看起来是个传送XML,或是JSON等其他类型的数据流的物件。

来做一个基本范例,用户注册时填入用户名,後台检查此名称是否可用,然後回传讯息到页面。
新增一个UnameSvl

public class UnameSvl extends HttpServlet {
(余略..)
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String uname = request.getParameter("uname");
  //如果使用者初次拜访页面,使用者名称应为空,直接送去regist.jsp页面填资料。
    if(uname == null) {
      request.getRequestDispatcher("/main/regist.jsp").forward(request, response);
    }
  //如果是透过AJAX访问此Sevlet,会带有uname参数,进行以下处理
    PrintWriter out = response.getWriter();
    if(uname == null || uname.equals("")) {
      out.print("0");
    }else {
      if(uname.equals("AAA") || uname.equals("BBB")) {
        out.print("1");
      }else {
        out.print("2");
      }
    }
    out.flush();
    out.close();
}

接下来制作regist.jsp页面

"<%@ page language=""java"" contentType=""text/html; charset=utf-8""
    pageEncoding=""utf-8""%>
<%
  String path = request.getContextPath();
  String basePath = request.getScheme() + ""://"" + request.getServerName()  
  + "":"" + request.getServerPort() + path + ""/"";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset=""utf-8"">
<title>Insert title here</title>
</head>
<script type=""text/javascript"">
  var xmlhttp;
  function validUname(){
   //若要测试此方法有没有被调用,使用以下code:
   //alert('validUname()被启动');
   
   //创建XMLHttpRequest物件
      if(window.XMLHttpRequest){
       xmlhttp = new XMLHttpRequest();
      }
   //利用.open方法设定参数,.send方法送request给後端。
      if(xmlhttp != null){
       xmlhttp.onreadystatechange = statechange;
       var uname = document.getElementById(""uname"").value;
       var url = ""<%=basePath%>UnameSvl?uname="" + uname;
       xmlhttp.open(""GET"",url,true);
       xmlhttp.send(null);
       }
   }
  function statechange(){
   if(xmlhttp.status == 200){
    var result= xmlhttp.responseText;
    var info;
    if(result == ""0""){info=""请填入用户名""}
    if(result == ""1""){info=""用户名已被使用""}
    if(result == ""2""){info=""可用的用户名""}
    document.getElementById(""nameAlert"").innerHTML = info;
    }
   }
  
</script>
<body>
<table>
  <tr>
    <td>用户名</td>
    <td>
      <input type=""text"" id=""uname"" name=""uname"" onblur=""validUname()"">
      <span id=""nameAlert"" style=""color:red;font-size:12px""></span>
    </td>
  </tr>
  <tr>
    <td>密码</td>
    <td><input type=""password"" name=""pwd""></td>
  </tr>
  <tr>
    <td>密码确认</td>
    <td><input type=""password"" name=""pwd2""></td>
  </tr>
  <tr>
    <td colspan=""2"" align=""center""><input type=""submit"" value=""送出""></td>
  </tr>
</table>
</body>
</html>"

XMLHttpRequest有readyState及status两种属性,可以用来设置到if条件式里面,因应不同状况呼叫不同函式。

readyState

存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且回应已就绪

status

200: "OK"
404: 未找到页面

使用AJAX的流程

  1. 创建物件
xmlhttp = new XMLHttpRequest();
  1. 利用.open方法设定参数,.send方法送request给後端。
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
  1. 当XMLHttpRequest状态改变时,触发收件方法
xmlhttp.onreadystatechange = statechange;
statechange(){…}

以上就是传统的AJAX设定方法,不过jQuery已经帮我们打包好了更简单的语法:

$.ajax({
  type:"POST",
  url:url,
  success:function(msg){
    处理内容
  }
});

套用到此案例就会长这样:

function validUname(){
  var uname = $('#uname').val();
  var url = "<%=basePath%>UnameSvl?uname=" + uname;
  var info;

  $.ajax({
    type:"POST",
    url:url,
    success:function(msg){
      if(msg == "0"){info = "..."}
      if(msg == "1"){info = "..."}
      if(msg == "2"){info = "..."}
      document.getElementById("nameAlert").innerHTML = info;
    }
  });
}

JSON传输格式

JSON是一种可快速被javascript解析的格式,比XML更快速而广泛被使用。长得像下面这样:

{
  "artist":"pH7",
  "title":"A LITTLE MONSTER",
  "year":1985,
  "tracks":["Lemon","sawadika"]
}

资料内容放在{}内,以":"区分键与值,以","区分各个资料,以[]表示列表。

做个案例

"<script  type=""text/javascript"">
var JSONstring = '{' +
'""artist"":""pH7"",' +
'""title"":""A LITTLE MONSTER"",' +
'""year"":1985,' +
'""tracks"":[""Lemon"",""sawadika""]' +
'}'

function pageLoad(){
   var album = eval(""("" + JSONstring + "")"");
   var innerHTML = ""artist = "" + album.artist + ""<br>"" + 
                   ""title = "" + album.title + ""<br>"" +
                   ""year = "" + album.year + ""<br>"";
   document.getElementById(""p1"").innerHTML = innerHTML;

   var tracks = """";
   for(var i = 0;i<album.tracks.length;i++){
     tracks += ""track#"" + i + "" = "" + album.tracks[i] + ""<br>""
   }
   document.getElementById(""p2"").innerHTML = tracks;
  }
</script>
<body onload=""pageLoad()"">
  <form id=""form1"">
    <div id=""p1""></div>
    <div id=""p2""></div>
  </form>
</body>"

用写死的JSONstring代替後台传来的资料,用eval()函式即可将资料存成物件。
再从物件中取出各个属性内的资料。
使用eval()时需再加入一个括号,如下例:

var data = eval("(" + JSONstring + ")");

<<:  身份验证,授权和会计(authentication, authorization, and accounting (AAA))Part II

>>:  进击的软件工程师之路-软件战斗营 第四周

Day 03 : Python 基础观念 (2)

昨天初步认识 python 怎麽设定变数的操作,今天我们要聚焦在串列、字典、字串的操作,东西有点多X...

Day 12 :阵列(array)与链结串列(linked list)

讨论过这麽多种演算法之後,会发现操作时常常会使用阵列或是某些资料结构。资料结构是指电脑中管理资料的特...

.Net Core Web Api_笔记20_api结合ADO.NET资料库操作part8_新闻文章查询

在大量数据同时表格陈列於画面上时通常 都会需要有一些关键字查询的机制 新增Search的Action...

Day 22 - Blocking & Non-blocking Mode

本篇重点 官方说明文件:https://sinotrade.github.io/tutor/adva...

DAY9 - BFS应用

昨天写了BFS模板&一题模板题,今天放几题比较复杂的~~ 例题实战 909. 蛇梯棋 这题最...