gpt4 book ai didi

jsf-2 - 带有素面的动态面包屑

转载 作者:行者123 更新时间:2023-12-01 02:28:46 24 4
gpt4 key购买 nike

我想使用 Primefaces 组件向我的 Web 应用程序添加动态面包屑。我创建了一个模型来推送面包屑上的项目,以便在跟踪其中一个链接时,删除尾随链接。这在大多数情况下都有效,但有时bradcrumb 的行为并不像我期望的那样。基本上,为了跟踪登陆页面,我添加了一个 preRenderView每个可导航页面上的监听器,并在 session 范围的 bean 中实现模型更新逻辑。

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

监听器接收页面名称作为属性,并从外部上下文中获取完整的 URL(包括查询字符串);这些信息,以及从 UIViewRoot 创建的唯一 ID , 用于构建 BreadCrumbItem被推到模型上:
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);
}

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

最佳答案

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

基本上,我有一个 @SessionScoped bean 包含一个堆栈(导航堆栈),存储您在面包屑中拥有的所有 url 以及每个 URL 的参数。 View (xhtml) 部分由 p:button 组成元素,具有 outcome堆栈存储的 url。

当您导航到一个 url 时,对应 bean 的 f:event type="preRenderView"被调用(就像你这样做的方式)并且 bean 从 url 中获取参数,之后它将自己建立到堆栈中(不是 bean 本身,因为它是 @ViewScoped 并且将被销毁,只是 url和参数)。

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

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

编辑

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

关于jsf-2 - 带有素面的动态面包屑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14460021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com