}
returnxml.toString(); }
privateStringprepareXMLResponse(DocumentxmlDoc){
NodeListselectedSkills=xmlDoc.getElementsByTagName(\
StringBufferxml=newStringBuffer(); xml.append(\
for(inti=0;i Stringskill=selectedSkills.item(i).getFirstChild().getNodeValue(); xml.append(\xml.append(skill); xml.append(\} returnxml.toString(); } } 这个Servlet只是简单的示范如何剖析XML,并重新使用以下的XML格式,将选择的资料发送回客户端: 将资料以新的XML格式发送回客户端,纯綷只是要示范客户端取得XML文件时,如果加以剖析处理,客户端接收到的资料如果是XML文件,则可以使用XMLHttpRequest的responseXML属性,尝试取得代表XML文件的DOM对象,之后就可以利用DOM的各种操作方法来剖析文件内容,例如: functionhandleStateChange(){ if(xmlHttp.readyState==4){ if(xmlHttp.status==200){ varxmlDoc=xmlHttp.responseXML;//取得DOM对象 varresponses=xmlDoc.getElementsByTagName(\varout=\ for(vari=0;i out=out+\} document.getElementById(\} } } 在这边您所看到的三段JavaScript片段,组成HandleXMLEx-1.js,可以搭配以下的HTML来完成一个完整的客户端/伺服端程式: 11 HandleXMLEx-1.html \ 如果执行这个程式,客户端所选择的资料以XML送出,伺服端加以剖析,并以另一个XML传回,客户端再剖析XML并显示标签中的文字,这是一个基本的XML传送与接收的例子。 40.6JSON传送与接收 在JSON中我们已经介绍过其基本格式,与XML相同,JSON只是一个文字格式,只要客户端与伺服端可以剖析它,就可以利用它作为传送资料的格式,但它是JavaScript的核心特性之一,所以在JavaScript中使用JSON作为资料格式很方便,您还可以在http://www.json.org找到处理JSON的程式库,包括客户端JavaScriptlibrary与伺服端的library。 相较于XML,JSON在资料表示时更为简洁,例如一个表示帐户的资料,XML中可能如下表示: 而使用JSON可以这么表示: varaccount={ number:\name:\balance:\}; 12 您可以下载http://www.json.org/json.js,并将之加入至网页之中: json.js中有JSONparser与JSONstringifier,例如它扩充了对象,增加了toJSONString()函式,您可以直接如下传回对象的JSON表示法: functionAccount(number,name,balance){ this.number=number; this.name=name; this.balance=balance; } varaccount=newAccount(123456,\alert(account.toJSONString()); 您可以按下执行范例观看结果。 您可以把JSON表示法以POST发送至伺服端,例如: HandleJSONEx-2.js varxmlHttp; functioncreateXMLHttpRequest(){ if(window.XMLHttpRequest){ xmlHttp=newXMLHttpRequest(); } elseif(window.ActiveXObject){ xmlHttp=newActiveXObject(\} } functionprepareJSON(){ varnumber=document.getElementById(\ varname=document.getElementById(\ varbalance=document.getElementById(\ varaccount=newObject(); account.number=number; account.name=name; account.balance=balance; returnaccount.toJSONString(); } functionhandleAccount(){ varjson=prepareJSON(); varurl=\createXMLHttpRequest(); xmlHttp.onreadystatechange=handleStateChange; xmlHttp.open(\ xmlHttp.setRequestHeader(\\xmlHttp.send(json); } functionhandleStateChange(){ 13 if(xmlHttp.readyState==4){ if(xmlHttp.status==200){ document.getElementById(\} } } 这个程式使用者输入的帐号资讯包装为对象,并使用JSON扩充的toJSONString()将之转换为JSON格式,之后POST至伺服端,伺服端可以至JSONinJava下载JSON伺服端的Parser,您可以撰写以下的程式: JSONServlet.java packageonlyfun.caterpillar; importjava.io.*; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.json.*; publicclassJSONServletextendsjavax.servlet.http.HttpServlet implementsjavax.servlet.Servlet{ publicJSONServlet(){ super(); } protectedvoiddoPost(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException,IOException{ Stringjson=readJSONString(request); JSONObjectjsonObject=null; StringresponseText=null; try{ jsonObject=newJSONObject(json); responseText=\帐号\\名称\余额\+jsonObject.getString(\} catch(JSONExceptione){ e.printStackTrace(); } response.setCharacterEncoding(\response.setContentType(\response.getWriter().print(responseText); } privateStringreadJSONString(HttpServletRequestrequest){ StringBufferjson=newStringBuffer(); Stringline=null; 14 try{ BufferedReaderreader=request.getReader(); while((line=reader.readLine())!=null){ json.append(line); } } catch(Exceptione){ System.out.println(e.toString()); } returnjson.toString(); } } 这个Servlet剖析JSON,并将资料取出后再传回文字回应。 如果将JSON字串传回给客户端浏览器,则可以使用eval()将之运算为一个JavaScript对象以进行操作。 40.7输入验证 表单资料的验证可以分为客户端验证与伺服端验证,为了安全起见,避免客户端验证被跳过,伺服端验证往往是必须的。 当使用者在表单中输入资料时,在过去往往只能靠使用者完成资料输入,再按下“送出”按钮,才可以进行伺服端验证,现在可以利用非同步请求方式,在使用者某些栏位输入完成之后,就以非同步方式在背景发送请求给伺服端进行验证,若有误再以DOM更新页面讯息,使用者可以即时发现先前错误的输入。 举个例子来说,有个网页必须输入帐户号码与姓名,帐户号码是XXX-XXXXXX-X的格式,X为数字: InputValidateEx-1.html \ 帐户号码: 当使用者在帐户号码输入完成,转而输入姓名时,这时会触发onchange事件而执行validate()函式,您可以在validate()函式中发送号码栏位,以非同步方式向伺服端要求验证: InputValidateEx-1.js varxmlHttp; functioncreateXMLHttpRequest(){ 15