URLs amigáveis com URL_Filter_Rewrite e Struts2

Este artigo tem como objetivo servir como primeiros passos para implementação de URLs amigáveis em um sistema web desenvolvido em JAVA. A ideia do artigo é ser o mais prático possível no sentido de ser uma referência para um desenvolvedor que está com dificuldades em colocar para funcionar pela primeira vez URLs amigáveis utilizando Struts2.

[ Hits: 13.325 ]

Por: Marcio Fernandes Rebello em 02/02/2011


Introdução



Primeiramente, o que é url_Filter_Rewrite? Basicamente é uma biblioteca Java (J2EE compliant) que funciona em servidores web do tipo Tomcat (e outros) que permite a reescrita da URL antes que a mesma chegue no seu código Java.

Isto permite, entre outras coisas, o redirecionamento de páginas, restrições de acesso e a prática de URLs amigáveis, que é o que trataremos aqui.

O nosso objetivo é: utilizando o Struts 2.1.7 queremos chamar um endereço como /Alezzia/Ambientes/Sala-de-Jantar e que isto seja entendido como /ambientes.action?id=1000255.

Esta biblioteca é posterior ao famoso mod_rewrite do Apache e foi desenvolvida baseada fortemente no mesmo. Os desenvolvedores da URL_Filter_Rewrite garantem que faz tudo o que o mod_rewrite faz e muito mais.

É importante também explicitar o que usei para instalar e fazer funcionar este pacote:
  • JBoss 5.0 (usei o web server nativo do JBoss)
  • Java JDK 1.6
  • Struts 2.1.7
  • Linux Ubuntu 10.04

Antes de mais nada (Troubleshooting)

Todas estas informações que colocarei aqui nestas próximas linhas estão espalhadas pela Web e em geral são omitidas, o que faz com que seja um trabalho árduo fazer com que sua primeira aplicação com URL_Filter_Rewrite funcione, especialmente se você estiver usando Struts2, sendo assim, antes de mais nada quero adverti-los:

1. O URL_Filter_Rewrite só funciona no Struts a partir da versão 2.1.7.

2. O URL_Filter_Rewrite usa expressões regulares (também pode usar outros mecanismos como wildcards, etc) para fazer o match da URL acessada e aplicar a mudança estabelecida. Aprenda a usar expressões regulares. Um bom site para isto:
3. Como o Struts e o URL_Filter_Rewrite fazem uso de filtro, no seu web.xml você precisará configurar dispatcher para request e para forward em ambos os filtros (do Struts2 e do UrlRewriter), segue o exemplo:

<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>

<filter>

        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping>

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

</filter-mapping>

É neste ponto que as versões do Struts 2 inferiores a 2.1.7 não funcionam! Essa configuração causa um estouro de pilha (stackoverflow). Também é importante colocar os filtros nesta ordem em que estão no exemplo.

4. No arquivo urlrewrite.xml você configura as regras, segue um pequeno exemplo:

<rule>

        <from>/Alezzia/Ambientes</from>
        <to>/ambiente.action</to>

</rule>

Preste atenção ao seguinte: ambas as urls começam com o caractere "/", isto faz com que em ambos os casos sejam interpretadas a partir da raiz do site. Se omitirmos o "/" e esta chamada vier de uma página que está em http://meusite.com.br/produtos, a URL será interpretada como http://meusite.com.br/produtos/ambiente.action.

Então esteja atento pois o "<to>" pode estar apontando para um caminho errado e nem sempre é fácil perceber isto.

5. Suas páginas, classes e javascripts vão chamar as urls no formato amigável e o URL_Filter_Rewrite vai converter para o "feio" e não o contrário. Veja a ordem em um exemplo:

Você coloca na sua página o link com a URL amigável (<a href="/Produto/Cadeira">), a chamada é capturada pelo filtro e o URL_Filter_Rewrite vai tentar fazer o match com alguma das rules que você criou no urlrewrite.xml, se o match acontecer, o URL_Filter_Rewrite vai encaminhar para a "URL feia" (<to>/produto.action?id=10004</to>) de acordo com a regra que você especificou.

6. Tome cuidado com a ordem que você dispõe suas rules no urlrewrite.xml. Veja o exemplo abaixo:

<rule>

   <from>/Teste/([a-zA-Z\-]+)</from>
   <to>/teste.action?origem=$1</to>

</rule>

<rule>

   <from>/Teste/([a-zA-Z\-]+)/([a-zA-Z\-]+)</from>
   <to>/teste.action?origem=$1&id=$2</to>

</rule>

Neste caso a primeira rule sempre será executada antes da segunda. Aprenda a fazer uso do <to last="true"> e esteja atento, pois alguma de suas rules podem nunca ser executadas em função de haver uma mais genérica na frente.

7. Se o filtro do URL_Filter_Rewrite não encontrar algum match para a URL, pode ser que ocorra algum comportamento estranho por parte do Struts em função do funcionamento do próprio Struts. Um comportamento estranho que notei foram alguns actions sendo chamados várias vezes como se o filtro do URL_Filter_Rewrite estivesse fazendo matches em URLs que não foram chamadas pela minha aplicação. Sinceramente não sei o motivo disto, mas sei que isto não acontece se houver um match para toda a URL que sua aplicação chamar.

Preferi começar com este "troubleshooting" pois sei que a maioria dos desenvolvedores busca uma referencia rápida para os seus problemas, espero que alguma destas 7 regras possa lançar uma luz rapidamente em algum problema que você esteja enfrentando.

    Próxima página

Páginas do artigo
   1. Introdução
   2. Baixando e instalando URL_Filter_Rewrite
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Configurando TomCat

JSP - Parte 2

JSP acessando MySQL usando JSTL e EL

GWT - Google Web Toolkit

Eclipse - Instalando o plugin do Jetty WTP

  
Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts