如何在页面呈现期间测试是不是存在 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 的导航案例未解决

如何在 JSF 2.0 中使用表单重新呈现页面的一部分?

jsf中的后退命令按钮

如何通过导航菜单 ajax-refresh 动态包含内容? (JSF SPA)

如何在 Ajax 请求期间在 JSF2 中动态添加组件