我在浏览JSF页面时遇到问题。单击命令按钮时,大多数导航都会发生。命令按钮的操作返回一个字符串。
我的登录页面是我的欢迎页面。这是在我的web.xml中:
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>faces/pages/index.xhtml</welcome-file>
</welcome-file-list>
在我浏览器的地址栏中,该页面显示为:
http://localhost:8080/ui/faces/pages/index.xhtml
一旦身份验证发生,该函数将返回此字符串:
"/ui/faces/pages/home.xhtml"
我要导航到的文件位于:
pages/home.xhtml
然而,当导航发生时,我会收到此错误:
无法找到与from-view-id'/pages/index.xhtml'匹配的导航案例,以获取行动'#{indexPageController.login()}'与结果'/ui/faces/pages/home.xhtml'< / p>
有谁能帮我理解正确导航到页面所需的相对路径?
答案 0 :(得分:5)
您不应在导航案例结果中包含上下文路径/ui
或FacesServlet
映射/faces
。它应该只代表唯一的视图ID,它基本上只是物理视图文件到webcontent根目录或相对于当前视图ID的绝对路径。
所以,绝对(以/
开头)到webcontent root:
/pages/home.xhtml
或相对(不是以/
开头)到当前视图ID(假设您在/pages/index.xhtml
中):
home.xhtml
请注意,不支持点斜杠./
和双点斜杠../
表示法。
甚至没有文件扩展名; JSF将暗示Facelets默认后缀默认为.xhtml
,javax.faces.DEFAULT_SUFFIX
为/ui
上下文参数:
/pages/home
home
如果您意识到上传路径FacesServlet
和/faces/*
映射{{1}} 可以从webapp内部控制,这毕竟也是有意义的!如果他们从外部改变,那么理论上你需要改变整个代码库中的所有导航案例结果并重建webapp。这没有任何意义。因此,JSF已经为您照顾它们。