导航规则导致 JSF1064:无法找到或提供资源

2023-11-29

我有以下 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 找不到匹配的导航规则,就会发生这种情况。然后它将切换到隐式导航。 IE。结果将用作相对于当前上下文的实际视图 ID。

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

您有 2 个选择:

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

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

    只要您不使用 POST 进行页面到页面导航,它通常就是与浏览器地址栏中的上下文相关 URI 匹配的 URL。使用该值<from-view-id>.

  2. 完全摆脱导航情况并依赖隐式导航。去除<navigation-case>完全来自faces-config.xml并更改结果值和操作方法如下:

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

    The NavigationHandler做法也相当笨拙。即使有导航案例,也只需直接返回结果,而不是摆弄NavigationHandler.

也可以看看:

  • JSF 2 中的通信 - 隐式导航
  • 重定向和导航/转发之间有什么区别以及何时使用什么?
  • 动作和动作监听器之间的区别
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

导航规则导致 JSF1064:无法找到或提供资源 的相关文章

随机推荐