2009-08-25 11 views
5

Devo inviare XML al browser con la mia applicazione JSF. Questo XML è generato dall'applicazione. Provo a crearlo ma la mia applicazione JSF invia HTML ogni volta.Creare XML con JSF

Come posso modificare il tipo di contenuto per inviare xml?

Grazie per il vostro aiuto.

risposta

7

Ci sono diversi modi per farlo. Farlo in JSP è un po 'brutto.

Come già accennato è possibile utilizzare un servlet e inserire/caricare le variabili in tale posizione. Ad esempio, accedendo al contesto di sessione:

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

Oppure si può uscita alla risposta HTTP da un metodo in Backing Bean. Ad esempio:

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(); 
} 

Oppure, se si utilizza Facelets è possibile impostare il tipo di risposta nel tag <f:view>.

+0

Perché il tag JSP è "brutto"? Se hai una pagina che fornisce XML allora sembra la cosa più logica da fare? Immagino che si riduca a voler generare un flusso XML come nell'esempio o se vuole definire la struttura XML nel JSP e usare il suo backing-bean per riempire gli elementi dei dati. –

+0

Vero. Ci possono essere alcune situazioni in cui il rendering sulla pagina potrebbe essere "utile" ma IMO di solito è brutto. Lo stesso vale per farlo tramite Facelets o qualsiasi altra struttura "vista". – Damo

0

Avrei un XML di ritorno servlet anziché il materiale JSF. Prendo JSF (e JSPs e qualsiasi altro livello dell'interfaccia utente) come contenuto "leggibile" di ritorno. XML è leggibile dalla macchina.

RE: I dati di sessione - Non ho mai fatto questo, non utilizzato JSF è sufficiente sapere che come uno strato di interfaccia utente, ma a Google Quick rendimenti: http://blogs.oracle.com/chrisf/entry/retrieving_jsf_session_variables_in

0

è necessario specificare il content-type di (sec 14.17.) la pagina di risposta come text/xml. Al momento sarà impostato come text/html.

I browser hanno utilizzato una varietà di meccanismi per determinare il tipo di dati restituiti, ma il modo corretto e più affidabile consiste nell'impostare l'intestazione HTTP Content-type.

Mi dispiace, non sono esperto di JSF, quindi non posso consigliarti su come sistemarlo, ma ora ti dà qualcosa da cercare!

+0

Sì, mi piacerebbe impostare questo tipo di contenuto, ma non so farlo nella pagina JSF. – Kiva

3

È possibile impostare il tipo di contenuto all'interno del proprio JSP. Presumo che tu stia utilizzando un JSP e creando il contenuto xml da un backing bean? Un JSP come questo sarebbe XML uscita:

<%@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> 

Si potrebbe quindi facilmente cambiare questi valori fissi per essere valori di fagioli dal supporto-fagiolo nel modo in cui si farebbe normalmente per JSP HTML-output.

+0

Ok ci proverò;) – Kiva

0

Qui hai qualche codice di esempio per farlo in un 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> 

Come il modo in cui funziona durante il rendering HTML, JSF valuta i propri tag e rende i tag XML da utilizzare come loro sono.