【问题标题】:navigation rule causes JSF1064: Unable to find or serve resource导航规则导致 JSF1064:无法找到或提供资源
【发布时间】:2015-01-22 17:01:40
【问题描述】:

我有以下 xhtml 页面,它包含在我项目中其他页面的主要部分中:

<ui:composition  xmlns="http://www.w3.org/1999/xhtml"
             xmlns:f="http://java.sun.com/jsf/core"
             xmlns:h="http://xmlns.jcp.org/jsf/html"
             xmlns:ui="http://java.sun.com/jsf/facelets"
             xmlns:p="http://primefaces.org/ui">
<h:head>
    <title></title>
</h:head>
<h:form>  
    <p:menubar>
        <p:menuitem value="Home" url="/protected/personal/HomeCalendar.xhtml" icon="ui-icon-home"/>
        <p:menuitem value="#{topbarBean.username}" url="#" style="text-decoration: underline" />
        <f:facet name="options">
            <p:inputText style="margin-right:20px" placeholder="Search"  value="#{searchBean.searched}"/>
            <p:commandButton action="#{searchBean.search()}" type="submit" icon="ui-icon-search" />
        </f:facet>
       </p:menubar>
</h:form>
</ui:composition>

这是我写的导航规则:

<navigation-rule>
    <from-view-id>/Components/TopBar.xhtml</from-view-id>
    <navigation-case>
        <from-action>#{searchBean.search()}</from-action>
        <from-outcome>searchingResults</from-outcome>   
        <to-view-id>/protected/SearchResults.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

这就是提到的 Bean:

@RequestScoped
@ManagedBean
public class SearchBean implements Serializable {

private String searched;
private final String resultsOutcome = "searchingResults";
private List<User> users;
private List<Event> events;

@EJB
UserFacade uf;

@EJB
UserManager um;

@EJB
EventFacade ev;

@PostConstruct
public void init(){
    try {
        setEvents(um.getEventsVisibilityMasked(um.getLoggedUser().getId()));
    }
    catch (NotFoundException ex) { 
        Logger.getLogger(SearchBean.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void setSearched(String searched) {
    this.searched = searched;
}

public String getSearched() {
    return searched;
}


public void search() {
    FacesContext fc = FacesContext.getCurrentInstance();
    fc.getApplication().getNavigationHandler().handleNavigation(fc, null, resultsOutcome);
}

public List<User> getUsers(){
    return users;
}
public void setUsers(List<User> users){
    for(User user:users)
    this.users.add(user);
}

public List<Event> getEvents(){
    return events;
}
public void setEvents(List<Event> events){
    for(Event event:events)
    this.events.add(event);
}    
}

错误如下: JSF1064:无法找到或提供资源,/protected/personal/searchingResults.xhtml。

此路径未在任何地方指定,如果有帮助,我有以下结构:

-Index,xhtml
-Web Pages { components , protected}
-components{TopBar.xhtml}
-protected {event,persona,user,SearchResults.xhtml}
-event{eventCreate,eventPage,eventEdit}
-personal{HomeCalendar,ManageSettings,ManageInvitations}

我不明白问题是关于导航规则还是下一个 xhtml 页面。

【问题讨论】:

    标签: jsf navigation faces-config


    【解决方案1】:

    如果 JSF 找不到匹配的导航规则,就会发生这种情况。然后它将切换到隐式导航。 IE。结果将用作相对于当前上下文的实际视图 ID。

    显然当前视图 ID 位于 /protected/personal 的某个位置。不匹配任何导航规则的searchingResults 结果将触发到/protected/personal/searchingResults.xhtml 的隐式导航。

    你有两个选择:

    1. 修复当前视图 ID。 &lt;from-view-id&gt;/Components/TopBar.xhtml&lt;/from-view-id&gt; 显然是错误的。您可以通过以下方式找到正确的:

      System.out.println(FacesContext.getCurrentInstance().getViewRoot().getViewId());
      

      只要您不使用 POST 进行页面到页面导航,它通常与浏览器地址栏中的上下文相关 URI 匹配。在&lt;from-view-id&gt; 中使用此值。

    2. 完全摆脱导航案例并依赖隐式导航。从faces-config.xml 中完全删除&lt;navigation-case&gt; 并更改结果值和操作方法如下:

      private final String resultsOutcome = "/protected/SearchResults.xhtml";
      
      public String search() {
          return resultsOutcome;
      }
      

      NavigationHandler 方法也很笨拙。即使使用导航案例,也只需直接返回结果,而不是摆弄NavigationHandler

    另见:

    【讨论】:

    • 好的我注意到有问题,在我的导航规则中,我根据registrationBean从索引到索引声明withOut:根据registrationBean从索引到错误withOut:根据loginBean从索引到HomeCalendar错误withOut:Success from Index to Error 根据 loginBean withOut:Error 和我之前发布的那些。问题是在登录的情况下,即使结果是 Success 它也不会加载 HomeCalendar 而是在 URI在浏览器上仍然有索引路径。
    • 我对上一个问题的疑惑是:哪个是ui:component 的viewId?因为它包含在 /protected/* 下的所有页面中,但我不知道我是否必须为特定组件或包含该组件的所有页面放置 URI。 (我项目中的组件是文件TopBar.xhtml)非常感谢您的支持!!
    • 你混合了几个概念和术语。导航案例与组件无关(也与包含/组合无关)。也许当前页面是通过 POST 导航打开的(这确实是一个不好的做法)。然后打印答案中显示的视图 ID 以获得正确的 ID。我建议暂停一下,仔细阅读答案底部的“另见”链接以及链接答案中的“另见”链接。最后但并非最不重要的一点是,我还建议在处理新的/现有的 JSF 应用程序之前阅读一本理智的 JSF 书籍并多练习一些。
    • 嘿,我解决了这个问题:FacesContext fc = FacesContext.getCurrentInstance(); fc.getApplication().getNavigationHandler().handleNavigation(fc, null, myCalendarOutcome);仅在过滤器中,我为这些过滤器制定导航规则,而且我一直使用隐式导航。感谢您的帮助。
    猜你喜欢
    • 2014-06-30
    • 1970-01-01
    • 2011-12-23
    • 2014-08-21
    • 2018-01-10
    • 1970-01-01
    • 2020-11-25
    • 2014-05-16
    • 1970-01-01
    相关资源
    最近更新 更多