我是否需要在PrettyFaces中为此制作自定义正则表达式模式

时间:2011-11-25 18:43:46

标签: java jsf url-rewriting prettyfaces

当我有以下映射时,是否需要制作自定义正则表达式模式以匹配URL(示例):

<url-mapping id="approvedQuestions">
    <pattern>/questions/approved/#{viewOption}/</pattern>
    <view-id>/approved.xhtml</view-id>
</url-mapping>

当用户没有用'/'结束URL时,viewoption-section也应匹配? 如果不添加viewOption部分,是否可以提供某种默认值?

如果我的viewOption是枚举,是否可以小写参数?现在我必须写大写以使其工作。

1 个答案:

答案 0 :(得分:3)

您可以使用自定义正则表达式来执行此类型,但我建议使用url-rewrite规则在缺少尾部斜杠的情况下附加尾部斜杠。你应该选择一个URL(最后带有或不带'/'),否则你实际上是用两个不同的地址提供相同的资源,你将受到搜索引擎和其他抓取工具的惩罚。

为此,我将使用重写规则,如下所示:

<rewrite match="/questions/approved/[^/]+" trailingSlash="append" />

这将导致服务器检测到URL末尾缺少'/',并将请求重定向到正确的位置,最后带有'/'。

为了解决你的枚举问题,这有点复杂。我们通常不建议将值直接绑定到枚举中。在这种情况下,您实际上并没有绑定到枚举(我猜),但实际上是将文字字符串URL值绑定到请求范围的EL上下文中。然后在应用程序的其他位置提取此值,这就是转换为ENUM的位置。

在PrettyFaces 4发布之前,我建议将值绑定到String位置,然后使用action方法自行加载正确的值,如下所示:

<url-mapping id="approvedQuestions">
    <pattern>/questions/approved/#{params.viewOption}/</pattern>
    <view-id>/approved.xhtml</view-id>
    <action>#{params.loadViewOption}</action>
</url-mapping>

如果您想尝试更高级的URL重写工具,也可以使用OCPsoft,您可以使用“重写”(http://ocpsoft.com/rewrite/),这是一个基于Java的URL重写工具,但没有与JSF集成很多。

PrettyFaces 4将基于重写作为核心,此时,您目前使用的所有功能也将能够执行更多类似的操作,如果我没有弄错,这就是您想要的:

.addRule(Join.path("/questions/approved/{viewOption}").to("/approved.xhtml")
.where("viewOption")
.matches("[^/]+/?")
.transformedBy(TrailingSlash.append())
.transformedBy(To.upperCase())

您需要创建自己的变换器,因为它们尚未在库中定义,但这是一般的想法。它比PrettyFaces目前的功能强大得多,但不提供相同的JSF导航集成,并且配置起来有点棘手。

我希望这有帮助, 〜林肯