如何在页面呈现期间测试是不是存在 JSF 导航案例
Posted
技术标签:
【中文标题】如何在页面呈现期间测试是不是存在 JSF 导航案例【英文标题】:How to test if a JSF navigation case exists during rendering of a page如何在页面呈现期间测试是否存在 JSF 导航案例 【发布时间】:2019-05-23 18:56:58 【问题描述】:我基本上有一个模板,我想为我的几个页面重复使用。他们都有一个共同的外观和感觉,他们共享一个允许他们登录和导航到主页的菜单。问题出在主页上:
-
如果存在当前页面(不是模板)本地的
index
(index.xhtml
),则将其用作默认值。当从/tools/page
(/tools/page.xhtml
) 调用我的模板时,它将指向/tools/index
(/tools/index.xthml
)。使用相对路径,我可以删除/tools
。
回退到/index
(/index.xhtml
)。
例子:
<p:menubar>
<p:menuitem icon="fa fa-home" outcome="/index" value="Home"
rendered="#not outcomeExists('index')" />
<p:menuitem icon="fa fa-home" outcome="index" value="Home"
rendered="#outcomeExists('index')" />
<p:menuitem icon="fa fa-user" value="#login.name"/>
</p:menubar>
当然,我想翻译真正的JSF Navigation规则来测试它是否存在,所以它会自动查找index.xhtml、index.jsf等。
【问题讨论】:
【参考方案1】:我一直在尝试 - 并来到了这个解决方案,必须在我的 JSF 页面中使用的 CDI Bean 上公开以下方法:
public boolean outcomeExists(String outcome)
FacesContext ctx = FacesContext.getCurrentInstance();
ConfigurableNavigationHandler configNavHandler = (ConfigurableNavigationHandler)ctx.getApplication().getNavigationHandler();
NavigationCase navCase = configNavHandler.getNavigationCase(ctx,null,outcome);
return navCase != null && navCase.getToViewId(ctx) != null; // the <to-view-id>
改编自 - Programmatically get navigation case <to-view-id> from faces-config.xml by outcome
【讨论】:
以上是关于如何在页面呈现期间测试是不是存在 JSF 导航案例的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JSF 中导航?如何使 URL 反映当前页面(而不是上一个页面)
警告 JSF1090:组件 j_idt51 的导航案例未解决