Java Seamframework - Restful URLs - Как? - PullRequest
2 голосов
/ 21 июля 2009

Я планирую запустить веб-проект, и я искал лучший вариант. В конечном итоге я предпочитаю придерживаться Java + Seam + J Boss AS + JPA Hibernate.

Но что касается перезаписи URL, это был действительно долгий путь без многих достижений.

У меня будет иерархическая структура, напр. Категория -> Подкатегория -> Подкатегория.

В основном я хочу, чтобы они отображались как foo.com/category/sub-category/sub-sub-category

  • Что помогает мне достичь этого?
  • Какие есть другие возможности?
  • Насколько гибким является перезапись URL?
  • Могу ли я добавить неиерархические данные в мой URL? Пример .. ... / категория / подкатегория / тип / подкатегория

Мои вопросы, касающиеся гибкости, связаны главным образом с тем, что RESTFUL должен быть основным. Поэтому, если перезапись URL-адресов не такая гибкая, мне придется тщательно подумать о своем дизайне.

Привет.

Ответы [ 5 ]

2 голосов
/ 31 июля 2009

Вы можете использовать встроенную перезапись URL Seam, или, если вы хотите большей гибкости в правилах перезаписи, вы можете использовать UrlRewriteFilter из http://tuckey.org/urlrewrite/. Примеры обоих ниже:

Встроенное переписывание шва (в любом случае этот пробник использует фильтр под тент)

Сначала включите перезапись URL в components.xml файле

<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 в свой проект, которую вы можете взять отсюда

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? Категория = (. ) и подкатегорию = (. ) и суб-суб-категории = (. *) $ / Главная / $ 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>

Здесь находится документация по шву - Документация по шву

Tucky UrlRewriteFilter doco здесь - Tuckey RewriteFilter doco

1 голос
/ 21 июля 2009

Конструкция URI ортогональна REST. Смотри: http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

1 голос
/ 21 июля 2009

А как насчет других вариантов перезаписи URL?

Prettyfaces

1 голос
/ 21 июля 2009

Я использую Restlet для обработки сопоставления ресурсов. Я не пробовал это с Seam, но я понимаю, что они хорошо сочетаются друг с другом.

Обновление: кто-то создал пример проекта , показывающий, как их интегрировать, и связанное с ним сообщение на форуме .

В руководстве Restlet 2.0 описывается, как обрабатывать переписывание и перенаправление URL.

0 голосов
/ 06 августа 2009

Я использую те же фреймворки, которые вы планируете использовать (Java + Seam + J Boss AS + JPA Hibernate), а также веб-сервисы RestFul - мое ядро.

Я выбираю resteasy в качестве остальных фреймворков, и он работает просто отлично и легко (как для перезаписи, так и для тестирования, так же, как easymock). Также это продукт jboss, отлично работает со швом, легко интегрируется.

В качестве примера кода:

@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 от отдыха
  • ProduceMime или ConsumeMime - это мим, который вы должны потреблять или производить
  • @QueryParam - это параметры URL, а @PathParam параметры, которые вы должны получить

Таким образом, этот get получит вызов от /webservice/web?param=lalala и вернет строку в формате application/xml.

...