2012-04-18 11 views
1

エンタープライズ全体のアプリケーションにHTML「ラッパー」を提供するJSF2 Faceletsテンプレート実装があります。アプリケーションはWAS 7にデプロイされ、共有ライブラリーを介してFaceletsテンプレートを呼び出します。JSF 2のレンダリングの問題、プロキシ経由で呼び出されるFaceletsとコンテンツ

私たちは外部ウェブサーバーからxhtmlファイルを介して左のナビゲーションをプルするリクエストを持っています。これは私たちのプロキシを通過する必要があります。インクルードされたxhtmlファイルはWebプロジェクトには含まれないので(別に管理してWebサーバー上に置く)、プロキシを介してコードを取得して正しくレンダリングする方法を見つけようとしています。を使用して、プロキシのために動作しません。

私は、プロキシ設定を設定し、ファイルの内容をプルする単純なBeanを作成しました。私は出力にコードをResponseWriterを使用している場合 - タグは、HTML出力でレンダリングされていません。<mycom:tpaLeftNav/>

メイン:

<div class="aligncenter"> <a href="#"> <img src="/allweb/images/corporate/pcom/logout.gif" alt="Logout" width="138" height="30" /></a> </div> 
<mycom:navBlockHeader type="custom" title="TPA Nav Pilot" /> 
<mycom:divStart expandableNav="true"/> 
<mycom:navLink href="url" text="Link 1" /> 
<mycom:navSubLinkStart text="Link 2" href="#" expandable="true" expand_onload="true"/> 
<mycom:navLink href="url" text="Link a"/> 
<mycom:navLink href="url" text="Link b"/> 
<mycom:navLink href="url" text="Link c"/> 
<mycom:navSubLinkEnd/> 
<mycom:navLink href="url" text="Link 3"/> 
<mycom:divEnd /> 

は、私は、カスタムタグを経由して管理対象Beanを呼び出していますマネージドBeanコードである:

public class LeftNavIncludeProxy extends UIComponentBase { 
public void encodeBegin(FacesContext context) throws IOException{ 
    ResponseWriter writer = context.getResponseWriter(); 
    String include = ""; 
    System.setProperty("https.proxyHost", "proxy.mycompany.com"); 
    System.setProperty("https.proxyPort", "80"); 
    try{ 
     URL url = new URL("https://secure.mycompany.com/navigation/tpa/leftnav/leftnav-define.xhtml"); 
     BufferedReader bin = new BufferedReader(new InputStreamReader(url.openStream())); 
     String line; 
     while ((line = bin.readLine()) !=null){ 
      include += line; 
     } 
     include=include.toString(); 
     writer.write((String) include); 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

}

leftnav.xhtmlファイルのコンテンツを簡単に取得できますが、Faceletsテンプレートに書き戻そうとするとFaceletsタグがHTMLとしてレンダリングされません。私はレンダリングステップを逃しているように感じますが、これを簡単に解決する方法がわかりません。

私はこれが初心者の質問であると確信しています - 私の謝罪です - 私はこれを解決するための提案や考えに感謝します。

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

答えて

0

あなたはレスポンスにプレーンテキストとしてFaceletsファイルの内容を書いています。これは確かに動作しません。

代わりにResourceResolverを使用する必要があります。ここにあなたの特定のケースのためのキックオフの例です:

public class ProxyFaceletsResourceResolver extends ResourceResolver { 

    private ResourceResolver parent; 

    public FaceletsResourceResolver(ResourceResolver parent) { 
     this.parent = parent; 
    } 

    @Override 
    public URL resolveUrl(String path) { 
     if (path.startsWith("/proxy/")) { 
      return new URL("https://secure.mycompany.com/" + path.split("/proxy/")[1]); 
     } 
     else { 
      return parent.resolveUrl(path); 
     } 
    } 

} 

<context-param> 
    <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name> 
    <param-value>com.example.ProxyFaceletsResourceResolver</param-value> 
</context-param> 

を次のようにweb.xmlでそれを設定した場合、あなたは、例えば

<ui:include src="/proxy/navigation/tpa/leftnav/leftnav-define.xhtml" /> 
+0

によってそれを得ることができるようになります私はすでにコンポーネントファイル用のリソースリゾルバを持っています。 2つのリソースリゾルバを持つことができますか? – snowgirl

関連する問題