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.