JSF 2 - 跨多个页面的唯一ID

时间:2011-09-28 11:35:30

标签: ajax jsf iframe jsf-2

我正在寻找创建一个JSF应用程序,其中有多个xhtml页面显示在浏览器的不同区域。我可以使用iframe执行此操作但是它们会增加额外的内存并且在iframe中访问对象并不是那么简单。

我正在考虑使用ajax在主页面中加载不同的xhtml页面的方法。问题是主页面中将有许多元素具有相同的ID,因为ID仅在其各自的视图根中是唯一的。

我知道有一个解决方案是实现一些处理这些重复ID的自定义客户端逻辑,但最好不要有重复的ID。

我该怎么做才能解决问题?

一个附带问题:是否有更好的处理此类要求的框架,即在同一浏览器窗口中显示多个页面?

2 个答案:

答案 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。