2009-08-25 9 views
5

J'ai besoin d'envoyer du XML au navigateur avec mon application JSF. Ce code XML est généré par l'application. J'essaye de le créer mais mon application JSF envoie du HTML à chaque fois.Créer un fichier XML avec JSF

Comment puis-je changer le type de contenu pour envoyer xml?

Merci pour votre aide.

Répondre

7

Il existe plusieurs façons de procéder. Le faire dans JSP est un peu méchant.

Comme déjà mentionné, vous pouvez utiliser un Servlet et y injecter/charger vos variables. Par exemple, en accédant au contexte de la session:

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

Ou vous pouvez produire à la réponse HTTP à partir d'une méthode dans votre Bean Sauvegarde. Par exemple:

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

Ou si vous utilisez Facelets vous pouvez définir le type de réponse dans la balise <f:view>.

+0

Pourquoi la balise JSP est "méchante"? Si vous avez une page qui fournit du XML, alors cela semble logique? Je suppose que cela se résume à savoir s'il veut sortir un flux XML comme dans votre exemple ou s'il veut définir la structure XML dans le JSP et utiliser son backing-bean pour remplir les éléments de données. –

+0

True. Il peut y avoir quelques situations où le rendre sur la page pourrait être "utile" mais OMI c'est habituellement méchant. Idem pour le faire via Facelets ou tout autre cadre "vue". – Damo

0

Je voudrais avoir un servlet de retour XML plutôt que le truc JSF. Je prends JSF (et JSPs et toute autre couche d'interface utilisateur) comme le retour de contenu "lisible par l'homme". XML est lisible par une machine.

RE: Les données de session - Je ne l'ai jamais fait cela, non utilisé JSF sais juste comme une couche d'interface utilisateur, mais un rendement de rapide Google: http://blogs.oracle.com/chrisf/entry/retrieving_jsf_session_variables_in

0

Vous devez spécifier le content-type (14,17 sec.) De la page de retour en tant que text/xml. Il sera actuellement défini comme text/html.

Les navigateurs ont utilisé une variété de mécanismes pour déterminer le type de données renvoyées, mais la méthode correcte et la plus fiable consiste à définir l'en-tête HTTP Content-type. Je suis désolé - je ne connais pas JSF, donc je ne peux pas vous conseiller sur la façon de résoudre ce problème, mais cela vous donne quelque chose à chercher maintenant!

+0

Oui Je voudrais définir ce type de contenu mais je ne sais pas le faire dans la page JSF. – Kiva

3

Vous pouvez définir le type de contenu dans votre JSP. Je suppose que vous utilisez une JSP et que vous créez le contenu xml à partir d'un bean backing? Un JSP comme celui-ci serait sortie 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> 

Vous pouvez ensuite modifier facilement ces valeurs hardcoded être des valeurs de haricots de votre soutien-haricot de la manière que vous le feriez normalement pour JSPs-sortie HTML.

+0

Ok, je vais essayer ça;) – Kiva

0

Ici vous avez quelques exemples de code pour le faire dans 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> 

Comme la façon dont il le fait lors du rendu HTML, JSF évalue ses propres balises et rend vos balises XML à utiliser comme elles sont.

Questions connexes