我想使用 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);
}
这种方法可行吗?您能否建议一些更好的方法来跟踪页面导航而无需利用生命周期侦听器?非常感谢你的帮助。