【问题标题】:JSF 2 - Unique ids across multiple pagesJSF 2 - 跨多个页面的唯一 ID
【发布时间】:2011-09-28 11:35:30
【问题描述】:

我希望创建一个 JSF 应用程序,其中有多个 xhtml 页面显示在浏览器的不同区域。我可以使用 iframe 来做到这一点,但它们会增加额外的内存,并且跨 iframe 访问对象并不是那么简单。

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

我知道一种解决方案是实现一些自定义客户端逻辑来处理这些重复的 id,但最好根本没有重复的 id。

我能做些什么来解决这个问题?

一个附带问题:是否有一个框架可以更好地处理这种需求,即在同一个浏览器窗口中显示多个页面?

【问题讨论】:

  • 当您说“使用 ajax”时,您是指 JSF 的 <f:ajax> 还是像 jQuery.load() 这样的普通 JS?我的印象是后者是这种情况,因为前者会为此引发重复的 ID 异常。如果后者是真的,是否有任何特定的功能或技术原因让您更喜欢纯 JS 而不是<f:ajax>?无论如何,这里有一些值得深思的地方:stackoverflow.com/questions/4421839
  • 是的。我的意思是 Jquery ajax。从一开始,我就使用了一些自定义客户端代码,这些代码与 f:ajax 所做的事情几乎相同,只是它使我能够决定从 js 执行和重新渲染什么。它还可以帮助我更好地控制在 ajax 请求之前和之后要做什么。而且,它允许我将 ajax 行为附加到浏览器事件之外的事物上,例如 jquery 自定义事件。

标签: ajax jsf iframe jsf-2


【解决方案1】:

您可以将视图根替换为实现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>

此示例实现基于viewId 创建一个clientId

public class ReplacementRoot extends UIViewRoot implements NamingContainer {
  @Override
  public String getClientId(FacesContext context) {
    return "jsf" + getViewId().replaceAll("[^\\p{Alnum}]", "_");
  }
}

这将生成jsf_index_xhtml:foo 形式的客户端标识符。

【讨论】:

  • 酷!我想知道如何拥有自定义视图根,但不知道这种方式是可能的。在此之前,我正在考虑实现一个自定义表单并做一些类似于你上面写的事情。
【解决方案2】:

看看Portlet 技术,因为这可能就是您想要的。问题是我还没有看到真正好的 portlet 实现,而且您需要一个 JSF portlet 桥来处理 JSF 生命周期 - 也不知道它的状态。

另一种选择是创建您自己的 facelets 提供程序,它会动态添加您需要的任何组件,因此当您重建组件树时,它们会突然出现。我也不能告诉你更多关于这方面的信息,但我已经看到它已经完成并适用于一些类似 wiki 的软件,这些软件将页面编辑为 facelets xhtml。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2012-09-21
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多