1、AJAX访问Spring的REST风格的服务工作原理13.1基于XML的消息传送方案13.1.1 客户端代码设计客户端代码设计1.请求汉字的传送处理请求汉字的传送处理var key=keyWord.value;/获取文本框的输入获取文本框的输入myurl=search/+key;myurl=encodeURI(myurl);myurl=encodeURI(myurl);xmlhttp.Open(POST,myurl,false);xmlhttp.setRequestHeader(Content-Type,application/x-www-form-urlencoded;charset=utf
2、-8);xmlhttp.send(null);2.对XML响应消息的解析处理var response=xmlhttp.responseText;var xmldoc=new ActiveXObject(Microsoft.XMLDOM);xmldoc.loadXML(response);var root=xmldoc.documentElement;var nodes=root.childNodes;for(var i=0;inodes.length;i+)/循环获取所有的查询结果循环获取所有的查询结果 s1=convert(nodes.item(i).getAttribute(titleNa
3、me),key);/获取资源获取资源的标题的标题 /资源其他属性的获取略资源其他属性的获取略 disp=disp+s1+s2;/拼接显示内容拼接显示内容 res.innerHTML=disp;/显示拼接的结果显示拼接的结果3.特殊显示的处理 转换函数转换函数convert将在将在message字符串中查找关键词字符串中查找关键词key,并将字符串,并将字符串中包含中包含key的部分加入红色字体显示的代码。的部分加入红色字体显示的代码。function convert(message,key)var k=0;var x=message;var le=key.length;k=x.indexOf(
4、key,k);while(k!=-1)x=x.substring(0,k)+key+x.substring(k+le);k=x.indexOf(key,k+le+23);/23是加入红色显示导致串字符增加个数是加入红色显示导致串字符增加个数return x;13.1.2 服务端代码设计1.加入字符过滤器加入字符过滤器为了实现中文的正确处理,需要在为了实现中文的正确处理,需要在web.xml文件中配置文件中加入过滤器文件中配置文件中加入过滤器,这样所有这样所有字符将变为字符将变为UTF-8编码。编码。2.业务逻辑方法业务逻辑方法public List search(String key)List
5、 m=jdbcTemplate.query(select*from resource where titleName like%+key+%,new RowMapper()public MyResource mapRow(ResultSet rs,int rowNum)throws SQLException MyResource r=new MyResource();r.setResourceID(rs.getInt(resourceID);.3.控制器的设计Controllerpublic class myController RequestMapping(value=/search/key
6、,method=RequestMethod.POST)public void search(PathVariable(key)String key,HttpServletResponse response)/根据根据key查数据库,将结果转化为查数据库,将结果转化为XML串通串通过过response发送发送 (1)对接收到的关键词的解码处理配合客户方对字符的编码处理,服务方在获取配合客户方对字符的编码处理,服务方在获取用户输入的查询关键词时要对字符进行解码。用户输入的查询关键词时要对字符进行解码。使用如下方法。使用如下方法。try ch_key=.URLDecoder.decode(key,U
7、TF-8);catch(UnsupportedEncodingException e1)(2)采用XML文档对象存储要返回的数据信息DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();DocumentBuilder builder=dbf.newDocumentBuilder();Document doc=builder.newDocument();Element root=doc.createElement(directory);doc.appendChild(root);/将根元素添加到文档上将根元素添加到文档上I
8、terator it=x.iterator();while(it.hasNext()MyResource tf=it.next();Element tmpNode=doc.createElement(file);root.appendChild(tmpNode);tmpNode.setAttribute(titleName,tf.getTitleName();tmpNode.setAttribute(des,tf.getDescription();tmpNode.setAttribute(url,tf.getResourceID()+.+tf.getFiletype();(3)将XML文档对象
9、转化为字符串public String doc2String(Document doc)String str=null;try TransformerFactory factory=TransformerFactory.newInstance();Transformer trans=factory.newTransformer();Writer outwriter=new StringWriter();StreamResult strOut=new StreamResult(outwriter);Source xmlSource=new DOMSource(doc);trans.transfo
10、rm(xmlSource,strOut);str=outwriter.toString();catch(Exception e)return str;(4)将响应消息发送给客户端response.setContentType(text/plain);response.setCharacterEncoding(gb2312);response.getWriter().write(doc2String(doc);13.2 基于Json的消息传送方案13.2.1 服务器方消息响应处理服务器方消息响应处理List x=r.search(mm);ListMap list=new ArrayListMap
11、();Iterator it=x.iterator();while(it.hasNext()MyResource r=it.next();Map map=new HashMap();map.put(titleName,r.getTitleName();map.put(des,r.getDescription();map.put(url,r.getResourceID()+.+r.getFiletype();list.add(map);response.setHeader(ContentType,text/plain);response.setCharacterEncoding(utf-8);/
12、解决汉字显示问题解决汉字显示问题 Gson gson=new Gson();String listToJson=gson.toJson(list);/将对象转换为将对象转换为Json格式格式 try response.getWriter().write(listToJson);catch(IOException e)e.printStackTrace();13.2.2 客户方解析消息处理var c=xmlhttp.responseText;var jsonobj=eval(+c+);for(i=0;ijsonobj.length;i+)s1=convert(jsonobji.titleName,x);/可以用对象属性形式访问属性成员可以用对象属性形式访问属性成员 s2=convert(jsonobjides,x);/也可以按数组的成员形式访问属性成员也可以按数组的成员形式访问属性成员 s3=jsonobjiurl;disp=disp+s1+s2;disp=disp+;res.innerHTML=disp;/用用DHTML显示结果显示结果