2009-08-25 17 views
5

Necesito enviar XML al navegador con mi aplicación JSF. Este XML es generado por la aplicación. Intento crearlo pero mi aplicación JSF envía HTML siempre.Crear XML con JSF

¿Cómo puedo cambiar el tipo de contenido para enviar xml?

Gracias por su ayuda.

Respuesta

7

Existen varias formas de hacerlo. Hacerlo en JSP es un poco desagradable.

Como ya se mencionó, puede usar un servlet e inyectar/cargar sus variables allí. Por ejemplo, mediante el acceso al contexto de sesión:

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

O se puede dar salida a la respuesta HTTP de un método en su Copia de Bean. Por ejemplo:

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

O si está utilizando Facelets que puede establecer el tipo de respuesta de la etiqueta <f:view>.

+0

¿Por qué la etiqueta JSP es "desagradable"? Si tiene una página que entrega XML, entonces parece lo lógico que hacer. Supongo que se reduce a si quiere generar un flujo XML como en su ejemplo o si quiere definir la estructura XML en el JSP y usar su respaldo para completar los datos. –

+0

Es cierto. Puede haber algunas situaciones en las que presentarla en la página podría ser "útil", pero la OMI suele ser desagradable. Lo mismo vale para hacerlo a través de Facelets o cualquier otro marco de "vista". – Damo

0

Tendría un XML de devolución de servlets en lugar de las cosas de JSF. Considero que JSF (y JSP y cualquier otra capa de UI) devuelve contenido "legible para humanos". XML es legible por máquina.

RE: Los datos de sesión - Nunca he hecho esto, no se utiliza JSF acaba de conocerla como una capa de interfaz de usuario, pero una rápida retornos de Google: http://blogs.oracle.com/chrisf/entry/retrieving_jsf_session_variables_in

0

Usted necesita especificar los content-type de (seg 14.17). la página de devolución como text/xml. En este momento se establecerá como text/html.

Los navegadores han utilizado una variedad de mecanismos para determinar el tipo de datos que se devuelven, pero la manera más adecuada y confiable es establecer el encabezado HTTP Content-type.

Disculpa, no tengo conocimientos de JSF, así que no puedo aconsejarte cómo solucionarlo, ¡pero te da algo que buscar ahora!

+0

Sí, me gustaría configurar este tipo de contenido, pero no sé hacer esto en la página JSF. – Kiva

3

Puede establecer el tipo de contenido dentro de su JSP. Supongo que está utilizando un JSP y está creando el contenido xml de un bean de respaldo. Un JSP como esto haría XML de salida:

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

entonces se podría cambiar fácilmente estos valores codificados como valores de frijol de su respaldo en grano de la manera que lo haría normalmente para JSP HTML-salida.

+0

Ok, intentaré esto;) – Kiva

0

Aquí tenemos algunos ejemplos de código para hacerlo en 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> 

De la manera que lo hace cuando se representa HTML, JSF evalúa sus propias etiquetas y hace que las etiquetas XML para utilizar como son.