如何在 Java EE 中美化路由?

How to prettify routes in Java EE?

互联网上关于如何在 Java EE/Jakarta EE(版本 7 或 8)中美化路由的文档和指南很差。想问问大家有什么推荐的。

我目前正在使用 OCPsoft Rewrite,但他们的文档、指南和他们的社区看起来非常轻松或安静。

您如何将基本的 XHTML JSF 路由转换为像 views/mypage.xhtml 这样的视图,变成像 /path/to/mypage 这样漂亮的 URL?

或者 Java EE/Jakarta EE 中的很多人不关心美化路线?

重写滤镜 (PrettyFaces) 是最常用的滤镜之一。事实上,它是如此常见以至于我们实际上在几年前就在 Chalmers 的 Web 应用程序课程中简要介绍了它。要使用它,您首先需要将以下依赖项添加到您的 POM 文件中;

<dependency>
    <groupId>org.ocpsoft.rewrite</groupId>
    <artifactId>rewrite-servlet</artifactId>
    <version>3.4.2.Final</version>
</dependency>
<dependency>
    <groupId>org.ocpsoft.rewrite</groupId>
    <artifactId>rewrite-config-prettyfaces</artifactId>
    <version>3.4.2.Final</version>
</dependency>

PrettyFaces 完全使用 JavaEE 运行时注释 - 因此添加后应该可以使用。接下来,您定义配置 - 默认情况下,它将在您的 WEB-INF/ 目录中查找 pretty-config.xml 文件。基本设置可能如下所示;

<?xml version="1.0" encoding="UTF-8"?>
<pretty-config xmlns="http://ocpsoft.org/schema/rewrite-config-prettyfaces" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xsi:schemaLocation="http://ocpsoft.org/schema/rewrite-config-prettyfaces
               http://ocpsoft.org/xml/ns/prettyfaces/rewrite-config-prettyfaces.xsd">         
    <url-mapping id="home"> 
        <pattern value="/" /> 
        <view-id value="/index.xhtml" />
    </url-mapping> 
    <url-mapping id="view-authors">
        <pattern value="/authors" />
        <view-id value="/author/list.xhtml" />
    </url-mapping>
    <url-mapping id="delete-author">
        <pattern value="/authors/delete/#{id}"/> 
        <view-id value="/author/delete.xhtml?id=#{id}" />
    </url-mapping>
    <url-mapping id="edit-author">
        <pattern value="/authors/edit/#{id}"/> 
        <view-id value="/author/edit.xhtml?id=#{id}" />
    </url-mapping>    
</pretty-config>    

本质上,您可以将上面的内容理解为 使 view-id 可访问,如 pattern 中指定的那样。要读取 id 值,您在页面上指定以下内容(就像您通常那样);

<f:metadata>
    <f:viewParam name="id" value="#{bean.id}" />
</f:metadata>

从前一段时间以来,PrettyFaces 还支持注释 - 允许您跳过 `pretty-config.xml" 文件并直接在支持 bean [=46] 之上指定备用 URL 模式=]。允许您直接在支持 bean 中执行类似的操作;

@URLMapping(pattern = "/authors/edit/#{id}", viewId = "/author/edit.xhtml?id=#{id}")

您可以在此处找到有关这些注释的更多信息; https://www.ocpsoft.org/prettyfaces/annotations-support-is-coming-to-prettyfaces-url-rewriting/

虽然 PrettyFaces 允许您控制 URL 的完整结构(包括参数),但如果您只需要去除扩展名,则可以使用 OmniFaces ExtensionlessURL 过滤器(http://showcase.omnifaces.org/facesviews/ExtensionlessURLs) - 就是这样控制的;

<context-param>
    <param-name>org.omnifaces.FACES_VIEWS_SCAN_PATHS</param-name>
    <param-value>/*.xhtml</param-value>
</context-param>

这样可以在没有 xhtml 扩展名的情况下直接访问视图。要将 OmniFaces 添加到您的项目中,只需在您的 POM 中指定以下内容;

<dependency>
    <groupId>org.omnifaces</groupId>
    <artifactId>omnifaces</artifactId>
    <version>3.2</version>
</dependency>

我还想提一下,在该领域(在实施中),应用程序推出自己的解决方案并自行实施 "prettification" 并不少见 - 当应用程序需要 "generate" 他们自己的 URL 基于一些随机 ID。这可以通过实现一个在请求调度程序上调用 forward() 的自定义过滤器来完成。这显然可以让你走得更远,几乎可以做任何你想做的事。当然,您真的可以只使用 PrettyFaces - 但我猜有些人只是喜欢多走一步。

抱歉拖延了 post,但我无法在网站上找到关于此的良好、全面的报道 - 所以我想我还是写一篇吧。