java - 我需要在 PrettyFaces 中为此制作自定义正则表达式模式吗

标签 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-portion 也应该匹配在哪里? 如果根本不添加 viewOption 部分,是否可以提供某种默认值?

如果我的 viewOption 是一个枚举,是否可以将参数小写?现在我必须写入大写字母才能使其正常工作。

最佳答案

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

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

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

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

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

在 PrettyFaces 4 出来之前,我建议改为将值绑定(bind)到字符串位置,然后使用操作方法自己加载正确的值,如下所示:

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

如果您想尝试更高级的 URL 重写工具,也来自 OCPsoft,您可以使用“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 导航集成,并且配置起来有点棘手。

希望对你有帮助 ~林肯

关于java - 我需要在 PrettyFaces 中为此制作自定义正则表达式模式吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8273126/

相关文章:

java - JPA 和 Spring 的手动事务服务和 DAO 层

jsf - 在时间间隔后使特定的托管 bean 实例过期

PHP 干净的 url 无需访问 apache 配置

java - Jackson - @JsonValue 注释字段无法反序列化

Java 2D 数组 : Multiplication Table

java - 如何在 JSF 2x 中使用结果并在地址栏中保留相同的 url?

jsf - 使用 "Please select"f :selectItem with null/empty value inside a p:selectOneMenu

php - 在 nginx 中对 .php 扩展使用重写和 php-fpm

c# - asp.net mvc 遗留路由映射

java - LoginButton 中的 setFragment 无法应用于 MainFragment