我有以下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页面。
答案 0 :(得分:1)
如果JSF无法找到匹配的导航规则,就会发生这种情况。然后它会切换到隐式导航。即结果将用作相对于当前上下文的实际视图ID。
显然当前的视图ID位于/protected/personal
的某个位置。 searchingResults
与任何导航规则不匹配的结果将触发隐式导航至/protected/personal/searchingResults.xhtml
。
您有2个选项:
修复当前视图ID。 <from-view-id>/Components/TopBar.xhtml</from-view-id>
显然是错误的。您可以按如下方式找到正确的:
System.out.println(FacesContext.getCurrentInstance().getViewRoot().getViewId());
它通常是与浏览器地址栏中的上下文相关URI匹配的那个,只要您不使用POST进行页面到页面的导航即可。在<from-view-id>
。
完全摆脱导航案例并依赖隐式导航。从<navigation-case>
完全删除faces-config.xml
并更改结果值和操作方法,如下所示:
private final String resultsOutcome = "/protected/SearchResults.xhtml";
public String search() {
return resultsOutcome;
}
NavigationHandler
方法也非常笨拙。即使有导航案例,也只需直接返回结果,而不是摆弄NavigationHandler
。