1

企業全体のアプリケーションに HTML「ラッパー」を提供する JSF2 Facelets テンプレート実装があります。アプリケーションは WAS 7 にデプロイされ、共有ライブラリを介して Facelets テンプレートを呼び出します。

外部 Web サーバーから xhtml ファイルを介して左側のナビゲーションを取得する要求があります。これには、プロキシを経由する必要があります。含まれている xhtml ファイルは Web プロジェクトに含まれないため (個別に管理され、Web サーバー上に配置されます)、プロキシ経由でコードを取り込み、正しくレンダリングする方法を見つけようとしています。プロキシが原因で を使用しても機能しません。

プロキシ構成を設定し、ファイルのコンテンツをプルする単純な Bean を作成しました。ResponseWriter を使用してコードを出力すると、HTML 出力でタグがレンダリングされません。

<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 を呼び出しています。<mycom:tpaLeftNav/>

主なマネージド 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 としてレンダリングされません。レンダリングのステップが欠けているように感じますが、これを簡単に解決する方法がわかりません。

これは初心者の質問だと思います-そうであれば申し訳ありません-これを解決する方法についての提案や考えをいただければ幸いです。

ありがとう。メル

4

1 に答える 1

0

Facelets ファイルのコンテンツをプレーン テキストとして応答に書き込んでいます。これは実際には機能しません。

代わりにa を使用する必要があります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);
        }
    }

}

web.xml以下のように設定すると

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

次に、たとえば

<ui:include src="/proxy/navigation/tpa/leftnav/leftnav-define.xhtml" />
于 2012-04-18T16:53:48.733 に答える