4

我想使用 Primefaces 组件向我的网络应用程序添加动态面包屑。我创建了一个模型来推送面包屑上的项目,这样当它的一个链接被点击时,尾随链接就会被删除。这在大多数情况下都有效,但有时 bradcrumb 的行为并不符合我的预期。基本上,为了跟踪登录页面,我preRenderView在每个可导航页面上添加了一个侦听器,并在会话范围的 bean 中实现了模型更新逻辑。

  <f:event type="preRenderView" listener="#{bcb.onRenderView}" />
  <f:attribute name="pageName" value="ThisPage" />

侦听器接收页面名称作为属性,并从外部上下文中获取完整的 URL(包括查询字符串);这些信息以及从 中创建的唯一 idUIViewRoot用于构建BreadCrumbItem推送到模型上的 id:

public void onRenderView(ComponentSystemEvent evt) {
  UIViewRoot root = (UIViewRoot)evt.getSource();
  final String reqUrl = FacesUtils.getFullRequestURL();
  String pageName = (String) evt.getComponent().getAttributes().get("pageName");
  if(pageName != null) {
    model.push(new BreadCrumbItem(root.createUniqueId(), pageName, reqUrl));
  } else {
    model.reset();
  }
}

模型的push()reset()方法实现如下:

/**
 * When a link is pushed on the bread crumb, the existing items are analyzed
 * and if one is found to be equal to the pushed one, the link is not added
 * and all the subsequent links are removed from the list.
 * 
 * @param link
 *            the link to be added to the bread crumb
 */
public void push(BreadCrumbItem link) {
    boolean found = removeTrailing(link);
    if(!found) {
        addMenuItem(link);
    }
}

/**
 * Reset the model to its initial state. Only the home link is retained.
 */
public void reset() {
    BreadCrumbItem home = new BreadCrumbItem();
    removeTrailing(home);
}

这种方法可行吗?您能否建议一些更好的方法来跟踪页面导航而无需利用生命周期侦听器?非常感谢你的帮助。

4

1 回答 1

3

我已经为我的网络应用程序实现了自己的一个,在我的情况下我没有使用该p:breadCrumb组件,因为它是使用按钮实现的。

基本上,我有一个@SessionScopedbean,它包含一个堆栈(导航堆栈),存储你在面包屑中拥有的所有 url 和每个参数的参数。视图 ( xhtml ) 部分由p:button元素组成,这些元素具有outcome堆栈存储的 url。

当您导航到url时,会调用相应的 bean f:event type="preRenderView"(按照您的操作方式),并且 bean 从 url 获取参数,之后它将自己建立到堆栈中(而不是 bean 本身,因为它@ViewScoped会被销毁,只有 url 和 params)。

如果您单击面包屑中的后退按钮,则会发送一个额外的参数来指示按钮的索引。基于该索引,目标 bean 知道您正在尝试恢复此类视图,因此向导航堆栈询问该视图参数,并且导航堆栈删除它之后的导航。

我花了一段时间,但它功能齐全。祝你好运。

编辑

使用会话范围保存当前导航状态时要小心。它会影响所有打开的选项卡,因此可能不是您想要的,除非您希望最终用户仅在一个选项卡中使用您的应用程序。无论如何,一般可用性指南说您应该为面包屑使用类别而不是导航路径(HTTP 是无状态的,历史记录本身由浏览器保存)。因此,动态面包屑不再有意义,至少如果您为视图使用不同的 url。

于 2013-01-22T15:34:03.103 回答