疯狂

STANDING ON THE SHOULDERS OF GIANTS
posts - 481, comments - 486, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

stuts2 返回xml

Posted on 2010-09-17 11:13 疯狂 阅读(1726) 评论(0)  编辑  收藏 所属分类: java strutsapache项目

关于Struts2 返回XML的问题


1. Action其实是一个POJO,所以我们可以直接把Action生成一个XML.只要把Result Type设为xslt就可以了:
      <action name="XmlModel" class="cpu.XmlModelAction">
            <result name="success" type="xslt" />
      </action>
里面包含了Action的所有属性,还有Locale等信息. 可以在浏览器里输入http://localhost:8080/XXX/XXX/XmlModel.action来看.

2. 为了定制自己想要的XML,我们可以输入参数来输出自己想要的Action的某个属性(属性可以是一个List).
      <action name="XmlModel" class="cpu.XmlModelAction">
            <result name="success" type="xslt">
                  <param name=”exposedValue”>modelList</param>
            </result>
      </action>

3. 如果有多于一个属性呢.加个大括号围起来
      <action name="XmlModel" class="cpu.XmlModelAction">
            <result name="success" type="xslt">
                  <param name=”exposedValue”>{modelList, type}</param>
            </result>
      </action>

4. 以上三个方法都是由Action 来控制生成格式.那么对于我们这种控制欲很强的人来说并不满足,最好是由我们自己来定义生成样子.那么这时我们就要做的就是在属性里生成一个 org.w3c.dom.Document属性.注意:不要用org.dom4j.Document类.要不会出现转化错误,死得很惨.
      <action name="XmlModel" class="cpu.XmlModelAction">
      <result name="success" type="xslt">
            <param name="exposedValue">xmlDoc</param>
      </result>
      </action>
上面的xmlDoc就是 Action里的org.w3c.dom.Document类型.

5. 我只会用并且非要用org.dom4j.Document类怎么办? 那就在最后转化成 org.w3c.dom.Document:
Java代码 复制代码
  1. import java.io.ByteArrayInputStream;     
  2. import java.io.IOException;     
  3.       
  4. import javax.xml.parsers.DocumentBuilderFactory;     
  5. import javax.xml.parsers.ParserConfigurationException;     
  6.       
  7. import org.xml.sax.SAXException;     
  8.       
  9. public class XmlUtil {     
  10.      
  11.       private XmlUtil() {     
  12.       }     
  13.       
  14.       public static org.w3c.dom.Document XmlString2W3cDom(String xml)     
  15.                   throws SAXException, IOException, ParserConfigurationException {     
  16.             byte[] byteArray = xml.getBytes("UTF-8");     
  17.             ByteArrayInputStream baos = new ByteArrayInputStream(byteArray);     
  18.             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();     
  19.             org.w3c.dom.Document doc = factory.newDocumentBuilder().parse(baos);     
  20.             return doc;     
  21.       }     
  22.       
  23.       public static org.dom4j.Document W3c2Dom4j(org.w3c.dom.Document doc) {     
  24.             if (doc == null) {     
  25.                  return (null);     
  26.             }     
  27.             org.dom4j.io.DOMReader xmlReader = new org.dom4j.io.DOMReader();     
  28.             return (xmlReader.read(doc));     
  29.       }     
  30.       
  31. }     

Action里加上一句: xmlDoc = Xmlutil.XmlString2W3cDom(dom4jDoc.asXML());
上面的xmlDoc就是 Action里的org.w3c.dom.Document类型.

6. 用org.dom4j.dom.DOMDocumentFactory()来建立 Document.而不要用DocumentHelper.createDocument()来产生.最后直接cast一下.
 
public String execute() throws UnsupportedEncodingException, ParserConfigurationException, SAXException, IOException {     
  1.   InfoCpuService cpuSvc = null;     
  2.   cpuSvc = (InfoCpuService) ServiceLocator.getInstance().getService(InfoCpuService.class);     
  3.       
  4.   modelList = cpuSvc.getModels(prodBrand);     
  5.       
  6.   log.info(ReflectionToStringBuilder.toString(this));     
  7.      
  8.  org.dom4j.Document dom4jDoc = new org.dom4j.dom.DOMDocumentFactory().createDocument();     
  9.     
  10.                Element root = dom4jDoc.addElement("root");     
  11.  root.addAttribute("prodType""CPU");     
  12.     
  13. for (Object o : modelList) {     
  14.   root.addElement("model").addAttribute("name", (String) o);     
  15.  }     
  16.      
  17. //xmlDoc = XmlUtil.XmlString2W3cDom(doc.asXML());     
  18.  xmlDoc = (Document) dom4jDoc;     
  19.      
  20.   HttpServletResponse response = ServletActionContext.getResponse();     
  21.   response.setContentType("text/xml;charset=UTF-8");     
  22.   response.setHeader("Cache-Control""no-cache");     
  23.        
  24.  return SUCCESS;     
  25.     

其中三句代码是为了防止生成中文乱码
   HttpServletResponse response = ServletActionContext.getResponse();
   response.setContentType("text/xml;charset=UTF-8");
   response.setHeader("Cache-Control", "no-cache");

7. 在action中返回类型最好设置为import org.w3c.dom.Document;
private Document retXML;  

配置格式为:
Java代码
  1. <action name="XmlModel" class="com.XmlModelAction">   
  2.            <result name="success" type="xslt">   
  3.                  <param name=”exposedValue”>retXML</param>   
  4.            </result>   
  5.  </action>  
转自:http://skyful.javaeye.com/blog/505775

只有注册用户登录后才能发表评论。


网站导航: