【问题标题】:Java Seamframework - Restful URLs - How to?Java Seamframework - Restful URLs - 如何?
【发布时间】:2010-11-12 11:15:23
【问题描述】:

我正计划开始一个网络项目,并且一直在寻找最佳选择。最终我选择坚持使用 Java + Seam + J Boss AS + JPA Hibernate。

但是关于 URL 重写,这是一个非常漫长的过程,没有很多成就。

我将有一个层次结构,例如。类别 -> 子类别 -> 子子类别。

基本上我希望这些映射像 foo.com/category/sub-category/sub-sub-category

  • 什么可以帮助我完成这项工作?
  • 还有哪些其他可能性?
  • URL 重写有多灵活?
  • 我可以将非分层数据附加到我的网址中吗?例如.. .../category/sub-category/type/sub-sub-category

我关于灵活性的问题主要是因为 RESTFUL 应该是核心。因此,如果 URL 重写不是那么灵活,我将不得不仔细考虑我的设计。

问候。

【问题讨论】:

  • 你有什么运气吗?

标签: java seam url-rewriting


【解决方案1】:

您可以使用 Seam 的内置 URL 重写,或者如果您希望重写规则更加灵活,您可以使用来自 http://tuckey.org/urlrewrite/ 的 UrlRewriteFilter。以下两者的示例:

Seam 的内置重写(很可能在幕后使用 tukey 过滤器)

首先在components.xml文件中开启url重写

<web:rewrite-filter view-mapping="*.seam"/>

接下来,将重写规则添加到 pages.xml 文件中

<page view-id="/home.xhtml">
    <rewrite pattern="/home/{category}/{sub-category}/{sub-sub-category}" />
</page>

在这种情况下,传入的 url 用作

/home/vehicles/cars/fords

将被视为请求

/home.seam?category=vehicles&sub-category=cars&sub-sub-category=fords

同样,如果页面有可用的命名请求参数,则出站 url 将被转换。

或者你可以使用Tucky UrlRewriteFilter如下

将 Tuckey UrlRewriteFilter jar 添加到您可以从这里获取的项目中

http://tuckey.org/urlrewrite/

接下来将过滤器添加到您的 web.xml 文件中

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

最后将一个名为 urlrewrite.xml 的文件添加到您的 WEB-INF 目录中。该文件将定义您的重写规则。您可能希望对正则表达式有所了解。该文件应如下所示

^/home.seam?category=(.)&sub-category=(.)&sub-sub-category=(.*)$ /家/$1/$2/$3

<rule match-type="wildcard">
   <from>/home\/$1\/$2\/$3</from>
   <to type="redirect">/home.seam?category=$1&sub-category=$2&sub-sub-category=$3</to>
</rule>

Seam doco 在这里 - Seam documentation

Tucky UrlRewriteFilter 文档在这里 - Tuckey RewriteFilter doco

【讨论】:

  • 看起来降价解析器不喜欢我的正则表达式;)事实上它去掉了一大堆文本。我会把它添加到另一个评论中
  • 应该在'文件应该如下所示'之后: ttp://tuckey.org/res/dtds/urlrewrite3.0.dtd" rel="nofollow" target="_blank">tuckey.org/res/dtds/urlrewrite3.0.dtd"> ^/home.seam?category=(.*)&sub-category=(.*)&sub-sub-category=( .*)$/home/$1/$2/$3 应该继续 '
【解决方案2】:

我使用Restlet 来处理资源的映射。我没有用 Seam 试过,但我知道它们很适合。

更新:有人创建了一个 example project,展示了如何将它们和关联的 forum post 集成。

Restlet 2.0 Tutorial 描述了如何处理 URL 重写和重定向。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 确实如此。与其将此类 URI 称为“RESTful”,不如将它们称为“酷 URI”(一个愚蠢的名称,但已确立、正确)。
    【解决方案4】:

    url 重写的其他选项呢?

    漂亮的面孔?

    【讨论】:

      【解决方案5】:

      我正在使用您计划使用的相同框架(Java + Seam + J Boss AS + JPA Hibernate),而且我的核心是 RestFul webservices。

      我选择 resteasy 作为其余框架,它工作得很好而且很容易(重写和测试,与 easymock 相同)。它也是一个 jboss 产品,与 seam 配合良好,易于集成。

      作为示例代码:

      @Path("/webservice")
      
      public class Web
      {
      
          @GET
          @Path("{web}")
          @ProduceMime("application/xml")
          public String test(@QueryParam("param") String param, @PathParam("web") String web) 
      {
      //  code here
      }
      }
      
      • @Path 是你的类的“根路径”(你真正的“根”将在components.xml 上配置)
      • @GET 来自 Rest
      • ProduceMimeConsumeMime 是你应该消费或制作的哑剧
      • @QueryParam 是 URL 的参数,@PathParam 是你应该得到的参数

      所以这个get会收到来自/webservice/web?param=lalala的调用并返回application/xml格式的字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-02
        • 2011-07-29
        • 1970-01-01
        • 2016-06-23
        • 2014-10-06
        • 1970-01-01
        • 2011-01-22
        • 2021-02-26
        相关资源
        最近更新 更多