我正在寻找创建一个JSF应用程序,其中有多个xhtml页面显示在浏览器的不同区域。我可以使用iframe执行此操作但是它们会增加额外的内存并且在iframe中访问对象并不是那么简单。
我正在考虑使用ajax在主页面中加载不同的xhtml页面的方法。问题是主页面中将有许多元素具有相同的ID,因为ID仅在其各自的视图根中是唯一的。
我知道有一个解决方案是实现一些处理这些重复ID的自定义客户端逻辑,但最好不要有重复的ID。
我该怎么做才能解决问题?
一个附带问题:是否有更好的处理此类要求的框架,即在同一浏览器窗口中显示多个页面?
答案 0 :(得分:3)
您可以将视图根替换为实现NamingContainer
的视图根:
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<component>
<component-type>javax.faces.ViewRoot</component-type>
<component-class>components.ReplacementRoot</component-class>
</component>
</faces-config>
此示例实现基于clientId
:
viewId
public class ReplacementRoot extends UIViewRoot implements NamingContainer {
@Override
public String getClientId(FacesContext context) {
return "jsf" + getViewId().replaceAll("[^\\p{Alnum}]", "_");
}
}
这将生成jsf_index_xhtml:foo
形式的客户端标识符。
答案 1 :(得分:1)
查看Portlet技术,因为这可能就是您想要的。问题是我还没有看到真正好的portlet实现,而且你需要一个JSF portlet桥来处理JSF生命周期 - 也不知道它的状态。
另一种选择是创建自己的facelets提供程序,动态添加所需的任何组件,因此当您重建组件树时,它们会突然出现。我也无法告诉你更多相关内容,但我已经看到它完成了并且正在为一些类似wiki的软件工作,这些软件正在将页面编辑为facelets xhtml。