2009-08-25 4 views
5

JSFアプリケーションでブラウザにXMLを送信する必要があります。このXMLは、アプリケーションによって生成されます。 私はそれを作成しようとしますが、JSFアプリケーションは毎回HTMLを送信します。JSFでXMLを作成する

xmlを送信するコンテンツタイプを変更するにはどうすればよいですか?

ありがとうございました。

答えて

7

これを行うにはいくつかの方法があります。 JSPでそれを行うのはちょっと面倒です。

既に言及したように、サーブレットを使用して、そこに変数を挿入/ロードすることができます。セッションコンテキストにアクセスして、例えば:あなたのバッキングBeanのメソッドからHTTPレスポンス

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

それとも出力でき、それを。例:

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

それとも、あなたが<f:view>タグで応答タイプを設定することができのFaceletsを使用している場合。

+0

なぜJSPタグは "厄介"ですか? XMLを提供するページをお持ちの場合、これは論理的な処理のようですか? 私はあなたの例のようにXMLストリームを出力したいのか、JSPでXML構造を定義したいのか、彼のバッキングBeanを使ってデータ要素を埋めたいのかどうかということになります。 –

+0

真。ページ上でのレンダリングが「便利」であるかもしれないが、通常はIMOというのは厄介なことがあります。 Faceletsや他の "view"フレームワークでも同じことができます。 – Damo

0

私はサーブレットがJSFのものではなくXMLを返すようにします。私は、JSF(およびJSPやその他のUIレイヤー)を「人間が読める」コンテンツとして返すようにします。 XMLは機械可読である。

RE:セッションデータ - 私はこれをやったことがない、JSFを使用していないだけでUI層としてそれを知っているが、簡単にGoogleが戻る:http://blogs.oracle.com/chrisf/entry/retrieving_jsf_session_variables_in

0

あなたがcontent-typeを指定する必要があります(秒14.17。)の戻るページはtext/xmlです。現在はtext/htmlと設定されています。

ブラウザは、返されるデータの種類を判断するためにさまざまなメカニズムを使用していますが、HTTP Content-typeヘッダーを設定するのが適切で最も信頼性の高い方法です。

申し訳ありません - 私はJSFに精通していないので、これを修正する方法についてはアドバイスできませんが、今すぐ探してみましょう!

+0

はいこのコンテンツタイプを設定したいと思いますが、JSFページでこれを行うことはわかりません。 – Kiva

3

JSP内でコンテンツタイプを設定できます。私はあなたがJSPを使用しており、バッキングビーンから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

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タグをレンダリングするとき、それがない方法のように彼らです。

関連する問題