技巧 2:简化导航在 JSF 1 中,导航使用 XML 指定。比如,要从 login.xhtml 转到 places.xhtml,可能使用清单 8 所示的导航规则:
清单 8. JSF 1 中的导航配置规则和用例1
2
3
4
5
6
7
| <navigation-rule>
<navigation-case>
<from-view-id>/pages/login.xhtml</from-view-id>
<outcome>places</outcome>
<to-view-id>/pages/places.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
|
要去除 中的 XML,可以利用 JSF 2 的导航约定:JSF 将 .xhtml 添加到按钮操作的末尾并加载该文件。这意味着不需要使用注释或其他内容,只需要使用约定就可以完整地避免编写导航规则的需求。在清单 9 在,按钮的操作是 places,因此 JSF 加载 places.xhtml:
清单 9. 通过约定进行导航1
2
3
| <h:commandButton id="loginButton"
value="#{msgs.loginButtonText}"
action="places"/>
|
对于 来说,不需要任何导航 XML。清单 9 中的按钮加载 places.xhtml,但是前提是该文件和按钮所在的文件处于同一个目录中。如果操作并没有以斜杠(/)开头,那么 JSF 认为这是一个相对路径。如果需要更加明确一点,可以指定一个绝对路径,如清单 10 所示:
清单 10. 使用绝对路径的导航1
2
3
| <h:commandButton id="loginButton"
value="#{msgs.loginButtonText}"
action="/pages/places"/>
|
当用户激活 中的按钮时,JSF 将加载 /pages/places.xhtml 文件。
默认情况下,JSF 将从一个 XHTML 页面转至另一个 XHTML 页面,但是通过指定 faces-redirect 参数可以重定向,如清单 11 所示:
清单 11. 通过重定向进行导航1
2
3
| <h:commandButton id="loginButton"
value="#{msgs.loginButtonText}"
action="places?faces-redirect=true"/>
|
|