1

我们有一个 JSF2 Facelets 模板实现,它为整个企业的应用程序提供 HTML“包装器”。应用程序部署在 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 文件的内容作为纯文本写入响应。这确实行不通。

你应该使用 aResourceResolver代替。这是您的特定案例的启动示例:

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 回答