2009-08-25 71 views
5

我需要使用JSF應用程序將XML發送到瀏覽器。該XML由應用程序生成。 我嘗試創建它,但是我的JSF應用程序每次都發送HTML。使用JSF創建XML

如何更改內容類型以發送xml?

感謝您的幫助。

回答

7

有幾種方法可以做到這一點。在JSP中執行它有點令人討厭。

如前所述,您可以使用Servlet並在其中注入/加載變量。例如,通過訪問會話的上下文:

MyBean myBean = (MyBean)FacesContext.getCurrentInstance() 
         .getExternalContext().getSessionMap().get("myBean"); 

或者您可以將其輸出到從支持bean的方法的HTTP響應。例如:

try { 
    String xml = "<person>damian</person>"; 
    FacesContext ctx = FacesContext.getCurrentInstance(); 
    final HttpServletResponse resp = (HttpServletResponse)ctx.getExternalContext().getResponse(); 

    resp.setContentType("text/xml"); 
    resp.setContentLength(xml.length()); 
    resp.getOutputStream().write(xml.getBytes()); 
    resp.getOutputStream().flush(); 
    resp.getOutputStream().close(); 

    ctx.responseComplete(); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

或者,如果你正在使用Facelets的可以設置在<f:view>標籤響應類型。

+0

爲什麼JSP標籤是「討厭的」?如果你有一個提供XML的頁面,那麼這似乎是合乎邏輯的事情? 我猜這是歸結爲他是否想要輸出一個XML流,或者他是否想要在JSP中定義XML結構並使用他的支持bean來填充數據元素。 – 2009-08-25 13:02:23

+0

是的。在某些情況下,在頁面上渲染它可能是「有用的」,但IMO通常是討厭的。通過Facelets或任何其他「視圖」框架來做同樣的事情。 – Damo 2009-08-25 13:42:34

0

你需要指定content-type的(14.17秒)。返回頁面爲text/xml。目前它將被設置爲text/html

瀏覽器使用了各種機制來確定返回的數據的類型,但正確,最可靠的方法是設置HTTP Content-type標頭。

對不起 - 我不是JSF知識淵博的人,所以我不能建議如何解決這個問題,但它現在給你一些東西來尋找!

+0

是的我想設置此內容類型,但我不知道在JSF頁面中執行此操作。 – Kiva 2009-08-25 11:18:37

3

您可以在JSP中設置內容類型。我假設你正在使用JSP並從支持bean創建xml內容?一個JSP像這樣將輸出XML:

<%@page contentType="text/xml"%><?xml version="1.0" encoding="UTF-8"?> 
<portfolio> 
    <stock> 
    <symbol>SUNW</symbol> 
    <name>Sun Microsystems</name> 
    <price>17.1</price> 
    </stock> 
    <stock> 
    <symbol>AOL</symbol> 
    <name>America Online</name> 
    <price>51.05</price> 
    </stock> 
    <stock> 
    <symbol>IBM</symbol> 
    <name>International Business 
    Machines</name> 
    <price>116.10</price> 
    </stock> 
    <stock> 
    <symbol>MOT</symbol> 
    <name>MOTOROLA</name> 
    <price>15.20</price> 
    </stock> 
</portfolio> 

你可以便輕易改變這些硬編碼值是從你通常會爲HTML的輸出的JSP的方式做你的後盾,豆豆值。

+0

好吧,我會試試這個;) – Kiva 2009-08-25 11:49:58

0

在這裏,你已經獲得了一些示例代碼,做一個的facelet

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 

    <ui:define name="metadata"> 
     <f:metadata> 
      <f:event type="preRenderView" 
       listener="#{clientManager.initialize}" /> 
     </f:metadata> 
    </ui:define> 

    <f:view contentType="text/xml"> 
     <ui:repeat var="client" value="#{clientManager.list}"> 
      <client>#{client.name}</client> 
     </ui:repeat> 
    </f:view> 
</ui:composition> 

像渲染HTML時它的方式,JSF評估其自己的標籤,並呈現你的XML標籤的使用他們是。