渲染JSF 2,Facelets和通过代理调用的内容的问题

时间:2012-04-18 15:46:09

标签: jsf jsf-2 facelets

我们有一个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。感觉我错过了渲染步骤,但我不确定如何轻松解决这个问题。

我确定这是一个初学者的问题 - 如果是的话我道歉 - 我会很感激有关如何解决此问题的任何建议或想法。

感谢。 梅尔

1 个答案:

答案 0 :(得分: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);
        }
    }

}

如果您在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" />