PrimeFaces 6+Java8项目配置faces-config.xml实现显式导航
解决Java 8 + PrimeFaces 6的显式导航配置问题(无需
?faces-redirect=true后缀) 嘿,我完全懂你不想在后台返回语句里硬加?faces-redirect=true的心情——通过faces-config.xml配置确实能更优雅地实现这个需求,还能给页面设置友好的URL名称。下面一步步来帮你搞定:
1. 核心思路
默认JSF导航是服务器端转发(URL不会更新),加?faces-redirect=true是触发客户端重定向来更新URL。我们可以通过faces-config.xml的导航规则和视图映射,把这两个逻辑统一配置,不用在代码里写后缀。
2. 配置faces-config.xml
首先,我们要做两件事:一是把实际的xhtml页面映射成友好的URL名称,二是配置导航规则让后台返回逻辑结果时自动重定向到这个友好URL。
单页面配置示例
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd" version="2.2"> <!-- 视图映射:把友好URL(比如/test)绑定到实际的test.xhtml页面 --> <view-mapping> <view-id>/test.xhtml</view-id> <url-pattern>/test</url-pattern> </view-mapping> <!-- 导航规则:后台返回逻辑结果时,自动重定向到对应页面的友好URL --> <navigation-rule> <!-- 匹配所有来源页面,你也可以指定特定页面比如/foo.xhtml --> <from-view-id>*</from-view-id> <navigation-case> <!-- 后台方法返回的逻辑名称(比如你返回"test") --> <from-outcome>test</from-outcome> <!-- 实际的页面路径 --> <to-view-id>/test.xhtml</to-view-id> <!-- 开启重定向,自动用友好URL更新地址栏 --> <redirect/> </navigation-case> </navigation-rule> </faces-config>
多页面通用配置
如果你有很多页面,不想每个都写单独的导航规则,可以用EL表达式简化:
<navigation-rule> <from-view-id>*</from-view-id> <navigation-case> <!-- 匹配所有逻辑结果 --> <from-outcome>*</from-outcome> <!-- 自动映射到对应名称的xhtml页面 --> <to-view-id>/#{fromOutcome}.xhtml</to-view-id> <redirect/> </navigation-case> </navigation-rule>
这样后台返回"user"就会自动重定向到/user(对应user.xhtml),非常高效!
3. 后台Bean代码调整
现在你只需要在后台方法里直接返回逻辑名称就行,不用加任何后缀:
import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; @ManagedBean @ViewScoped public class TestBean { public String test() { // 你的业务逻辑处理... // 无错误时直接返回逻辑名称 return "test"; } }
4. 确保web.xml配置正确
为了让友好URL能被JSF处理,需要给FacesServlet添加/的映射:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> <url-pattern>/faces/*</url-pattern> <!-- 必须添加这个,让友好URL被FacesServlet处理 --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
5. 注意事项
- 确保你的JSF版本是2.2或以上(Java 8搭配的JSF通常是2.2,PrimeFaces 6也支持这个版本),因为
<view-mapping>是JSF 2.2引入的特性。 - 如果遇到URL访问404,检查
web.xml的FacesServlet映射是否包含/,以及<view-mapping>的url-pattern是否正确。 - PrimeFaces组件不会受这些配置影响,因为这是JSF核心的导航机制。
内容的提问来源于stack exchange,提问作者Diaboliko
相关产品推荐
相关产品推荐

