我们有一个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。感觉我错过了渲染步骤,但我不确定如何轻松解决这个问题。
我确定这是一个初学者的问题 - 如果是的话我道歉 - 我会很感激有关如何解决此问题的任何建议或想法。
感谢。 梅尔
答案 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" />