您可以使用自定义正则表达式来执行此类操作,但如果缺少斜杠,我建议使用 url-rewrite 规则附加斜杠。您应该选择一个 URL(末尾带有或不带有“/”),否则您实际上是在提供具有两个不同地址的相同资源,并且您将受到搜索引擎和其他爬虫的惩罚。
为此,我将使用如下重写规则:
<rewrite match="/questions/approved/[^/]+" trailingSlash="append" />
这将导致服务器检测到 URL 末尾何时缺少“/”,并将请求重定向到正确的位置,末尾带有“/”。
为了解决您的枚举问题,这有点复杂。我们通常不建议将值直接绑定到枚举中。在这种情况下,您实际上并没有绑定到枚举(我猜),而是实际上将文字字符串 URL 值绑定到请求范围的 EL 上下文中。然后在应用程序的其他地方提取此值,这就是转换为 ENUM 的地方。
在 PrettyFaces 4 出现之前,我建议改为将值绑定到 String 位置,然后使用操作方法自己加载正确的值,如下所示:
<url-mapping id="approvedQuestions">
<pattern>/questions/approved/#{params.viewOption}/</pattern>
<view-id>/approved.xhtml</view-id>
<action>#{params.loadViewOption}</action>
</url-mapping>
如果您想尝试同样来自 OCPsoft 的更高级的 URL 重写工具,您可以使用“Rewrite”(http://ocpsoft.com/rewrite/),这是一个基于 Java 的 URL 重写工具,但不支持与 JSF 有尽可能多的集成。
PrettyFaces 4 将基于 rewrite 作为核心,此时,您当前使用的所有功能也将具有执行更多类似功能的功能,如果我没记错的话,这就是您想要的:
.addRule(Join.path("/questions/approved/{viewOption}").to("/approved.xhtml")
.where("viewOption")
.matches("[^/]+/?")
.transformedBy(TrailingSlash.append())
.transformedBy(To.upperCase())
您需要创建自己的转换器,因为它们尚未在库中定义,但这是一般的想法。它比目前使用 PrettyFaces 可能的功能强大得多,但不提供相同的 JSF 导航集成,并且配置起来有点棘手。
我希望这会有所帮助,〜林肯