一般来说,Ajax程序中,ResponseXml输出一般使用XML拼接,举例如下:
 PrintWriter out = response.getWriter();
PrintWriter out = response.getWriter();

 out.println("<response>");
out.println("<response>");        
 List<InOutType> types = service.search(predicate);
List<InOutType> types = service.search(predicate);
 out.println("<status>passed</status>");
out.println("<status>passed</status>");
 out.println("<message>查询出的记录数为:" + types.size() + "条</message>");
out.println("<message>查询出的记录数为:" + types.size() + "条</message>");

 for (InOutType typeTmp : types)
for (InOutType typeTmp : types)  {
{
 out.println("<type>");
    out.println("<type>");
 out.println("<name>" + typeTmp.getName() + "</name>");
    out.println("<name>" + typeTmp.getName() + "</name>");
 out.println("</type>");
    out.println("</type>");
 }
}
 out.println("</response>");
out.println("</response>");
个人认为这样的方式用在小规模(编辑器一屏之内)ResponseXml还行,大规模就容易出错了,它有以下缺点:
1.节点开始如<response>和节点结束</response>必须成对书写,容易遗忘出错.
2.节点和子节点关系不清晰.
我设想用dom4j来解决这个问题,具体就是把上述代码中的XML转化成一个Document的节点,这样成对书写问题和节点关系的问题都能解决了.
具体的类如下:
 package com.sitinspring.nnyy.util;
package com.sitinspring.nnyy.util;

 import org.dom4j.Document;
import org.dom4j.Document;
 import org.dom4j.DocumentHelper;
import org.dom4j.DocumentHelper;
 import org.dom4j.Element;
import org.dom4j.Element;


 public class XmlAssemble
public class XmlAssemble {
{
 private Document document;
    private Document document;
 private Element root;
    private Element root;
 
    

 public XmlAssemble(String rootName)
    public XmlAssemble(String rootName) {
{
 document=DocumentHelper.createDocument();
        document=DocumentHelper.createDocument();
 root = document.addElement(rootName);
        root = document.addElement(rootName);
 }
    }
 
    

 public String getXml()
    public String getXml() {
{
 return document.asXML();
        return document.asXML();
 }
    }
 
    

 public Element add(String elmName)
    public Element add(String elmName) {
{
 return root.addElement(elmName);
        return root.addElement(elmName);
 }
    }
 
    

 public Element add(String elmName,String elmTxt)
    public Element add(String elmName,String elmTxt) {
{
 Element elm=root.addElement(elmName);
        Element elm=root.addElement(elmName);
 elm.setText(elmTxt);
        elm.setText(elmTxt);
 return elm;
        return elm;
 }
    }


 public Element getRoot()
    public Element getRoot()  {
{
 return root;
        return root;
 }
    }
 }
}
在这个类的帮助下,原有代码改写为:
 List<InOutType> types = service.search(predicate);
List<InOutType> types = service.search(predicate);
 XmlAssemble xmlAssemble=new XmlAssemble("response");
XmlAssemble xmlAssemble=new XmlAssemble("response");
 xmlAssemble.add("status","passed");
xmlAssemble.add("status","passed");
 xmlAssemble.add("message","查询出的记录数为:"+ types.size() + "条");
xmlAssemble.add("message","查询出的记录数为:"+ types.size() + "条");

 for (InOutType typeTmp : types)
for (InOutType typeTmp : types)  {
{
 Element typeElm=xmlAssemble.add("type");
    Element typeElm=xmlAssemble.add("type");
 Element nameElm=typeElm.addElement("name");
    Element nameElm=typeElm.addElement("name");
 nameElm.setText(typeTmp.getName());
    nameElm.setText(typeTmp.getName());
 }
}
 PrintWriter out = response.getWriter();
PrintWriter out = response.getWriter();        
 out.println(xmlAssemble.getXml());
out.println(xmlAssemble.getXml());    
明显,上述代码没有书写问题和节点关系问题,它的书写过程是逐渐深入子节点的,代码连贯性好多了,即使代码超过一屏也能有效控制.
以上.