xsuo 发表于 2013-1-29 12:09:52

利用jaxp、dom实现ajax xml 响应

<iframe width="336" scrolling="no" height="280" frameborder="0" allowtransparency="true" hspace="0" vspace="0" marginheight="0" marginwidth="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-1832179689702023&dt=1183008743078&lmt=1179059997&format=336x280_as&output=html&correlator=1183008743078&channel=7111701428&url=http%3A%2F%2Fwww.java3z.com%2Fcwbwebhome%2Farticle%2Farticle5%2F5594.html%3Fid%3D948&color_bg=FFFFFF&color_text=000000&color_link=0000FF&color_url=3D81EE&color_border=FFFFFF&ad_type=text_image&ref=http%3A%2F%2Fwww.google.cn%2Fsearch%3Fcomplete%3D1%26hl%3Dzh-CN%26newwindow%3D1%26q%3DAJAX%2BXML%26btnG%3DGoogle%2B%25E6%2590%259C%25E7%25B4%25A2%26meta%3D&cc=52&flash=9&u_h=800&u_w=1280&u_ah=770&u_aw=1280&u_cd=32&u_tz=480&u_his=1&u_java=true&u_nplug=13&u_nmime=50" name="google_ads_frame"></iframe>       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

Document doc = builder.newDocument();
创建root元素 或其它元素 Element root = doc.createElement("selects");

doc.appendChild(root);
Element的appendChild()方法用来添加子元素

创建文本结点 doc.createTextNode(String textNode)

在servlet中 通过以下方法转换到输出流
Transformer t = TransformerFactory.newInstance().newTransformer();
t.transform(new DOMSource(doc),new StreamResult(response.getWriter()));   
一、web.inf 文件配置一个servlet
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
   version="2.4">
<display-name>Welcome to Tomcat</display-name>
<description>
   Welcome to Tomcat
</description>
<servlet>
<servlet-name>SelectServlet</servlet-name>
<servlet-class>drownmenu.SelectServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SelectServlet</servlet-name>
<url-pattern>/SelectServlet</url-pattern>
</servlet-mapping>
</web-app>
                  
二、JSP页面
                   <%@ page language="java" contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Ajax 联动下拉框</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<SCRIPT type="text/javascript">
      var req;
      window.onload=function(){
      }
      function Change_Select()
      {
            var zhi=document.getElementById('state').value;
            var url="/Tajax/SelectServlet?id="+escape(zhi);
            if(window.XMLHttpRequest)
            {
                req=new XMLHttpRequest();
            }else if(window.ActiveXObject)
            {
                req=new ActiveXObject("Microsoft.XMLHTTP");
            }
            if(req)
            {
                req.open("GET",url,true);
                req.onreadystatechange=callback;
                req.send(null);
            }
      }
      function callback()
      {
            if(req.readyState == 4)
            {
                if(req.status == 200)
                {
                  parseMessage();
                }else{
                  alert("Not able to retrieve description"+req.statusText);
                }
            }
      }
      function parseMessage()
      {
            var xmlDoc=req.responseXML.documentElement;
            var xSel=xmlDoc.getElementsByTagName('select');
            var select_root=document.getElementById('city');
            select_root.options.length=0;
            for(var i=0;i< xSel.length;i++)
            {
                var xValue=xSel.childNodes.firstChild.nodeValue;
                var xText=xSel.childNodes.firstChild.nodeValue;
                var option=new Option(xText,xValue);
                try{
                  select_root.add(option);
                }catch(e){
                }
            }
      }
</script>
</head> <body>
<div align="center">
<form name="form1" method="post" action="">
<TABLE width="70%" boder="0" cellspacing="0">
<TR>
<TD align="center">Ajax 联动下拉框</TD>
</TR>
<TR>
<TD>请选择省份:

<SELECT name="state" id="state" onChange="Change_Select()">
<OPTION value="0">未选择</OPTION>
<OPTION value="1">湖南</OPTION>
<OPTION value="2">湖北</OPTION>
</SELECT>

   请选择城市:
<SELECT name="city" id="city">
<OPTION value="0">未选择</OPTION>
</SELECT>
</TD>
</TR>
<TR><td> </td></TR>
</TABLE>
</form>
</div>
</body>
</html>
三、SelectServlet 类
package drownmenu;
import javax.servlet.*;
                     import javax.servlet.http.*;
                     import java.io.*;
                     import java.util.*;
                     import javax.xml.parsers.*;
                     import org.w3c.dom.*;
                     import javax.xml.transform.*;
                     import javax.xml.transform.stream.*;
                     import javax.xml.transform.dom.*;
                  
public class SelectServlet extends HttpServlet {
//Initialize global variables
   public void init() throws ServletException {
   }
//Process the HTTP Get request
   public void doGet(HttpServletRequest request, HttpServletResponse response) throws   ServletException, IOException {
   String targetId = request.getParameter("id").toString();
   response.setCharacterEncoding("UTF-8");
   response.setContentType("application/xml");
   try {
   DocumentBuilderFactory factory = DocumentBuilderFactory.   newInstance();
   DocumentBuilder builder = factory.newDocumentBuilder();
   Document doc = builder.newDocument();

   Element root = doc.createElement("selects");
   doc.appendChild(root);   
/*
   String xml_start="<selects>";
   String xml_end="</selects>";
   String xml="";
   */

   if (targetId.equalsIgnoreCase("0")) {
   makeElement(doc, root, new String[] {"未选择"});
   // xml = "<select><value>0</value><text>Unbounded</text></select>";
   }
   if (targetId.equalsIgnoreCase("1")) {
   makeElement(doc, root, new String[] {"长沙","岳阳"});

   /* xml ="<select><value>1</value><text>Mana Burn</text></select>";
   xml +="<select><value>2</value><text>Death Coil</text></select>";
   xml +="<select><value>3</value><text>Unholy Aura</text></select>";
   xml +="<select><value>4</value><text>Unholy Fire</text></select>";
   */
   }

   if (targetId.equalsIgnoreCase("2")) {
   makeElement(doc, root, new String[] {"武汉","石堰","襄樊","孝感"});
   /*
   xml ="<select><value>1</value><text>Corprxplode</text></select>";
   xml +="<select><value>2</value><text>Raise Dead</text></select>";
   xml +="<select><value>3</value><text>Brilliance Aura</text></select>";
   xml +="<select><value>4</value><text>Aim Aura</text></select>";
   */
   } //else {
   // makeElement(doc, root, new String[] {"何畅1", "何畅2", "何畅3"});
   /*
   xml ="<select><value>1</value><text>Rain of Chaos</text></select>";
   xml +="<select><value>2</value><text>Finger of Death</text></select>";
xml += "<select><value>3</value><text>Bash</text></select>";
   xml +="<select><value>4</value><text>Summon Doom</text></select>";
   */
   // }

   Transformer t = TransformerFactory.newInstance().newTransformer();
   t.transform(new DOMSource(doc),   new StreamResult(response.getWriter()));            
} catch (Exception ex) {
   throw new ServletException(ex.toString());
   }
   // String last_xml = xml_start + xml + xml_end;
   // response.getWriter().write(last_xml);
   }
private void makeElement(Document doc, Element root, String[] name) throws    DOMException {
   if (name == null) {
   return;
   }
for (int i = 0; i < name.length; i++) {
   Element selectElement = doc.createElement("select");
   root.appendChild(selectElement);
Element valueElement = doc.createElement("value");
   Element textElement = doc.createElement("text");
   int t=i+1;
   Text valueText = doc.createTextNode(""+t);
   Text textText = doc.createTextNode(name);
   valueElement.appendChild(valueText);
   textElement.appendChild(textText);
   selectElement.appendChild(valueElement);
   selectElement.appendChild(textElement);
    }
}
//Process the HTTP Post request
   public void doPost(HttpServletRequest request, HttpServletResponse response) throws   ServletException, IOException {
   doGet(request, response);
   }
//Clean up resources
   public void destroy() {
   }
   }
运行图:
http://www.java3z.com/cwbwebhome/article/article5/images/menuajax.gif
页: [1]
查看完整版本: 利用jaxp、dom实现ajax xml 响应