瘋狂

          STANDING ON THE SHOULDERS OF GIANTS
          posts - 481, comments - 486, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          stuts2 返回xml

          Posted on 2010-09-17 11:13 瘋狂 閱讀(3667) 評論(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
          主站蜘蛛池模板: 永清县| 吉安市| 文成县| 修武县| 临泉县| 拉萨市| 莫力| 灵璧县| 连江县| 东阳市| 济宁市| 梧州市| 施甸县| 桃源县| 雅江县| 江门市| 丰台区| 紫云| 石柱| 行唐县| 兴业县| 苍南县| 正宁县| 梧州市| 辛集市| 恩平市| 普洱| 桐城市| 潮州市| 涿鹿县| 伊川县| 延川县| 尤溪县| 庆云县| 锦屏县| 稻城县| 南木林县| 札达县| 吉隆县| 得荣县| 绥宁县|