Mnoho z vás jistě zná modul do apache mod_rewrite, který umožňuje pomocí regulárních výrazů transformovat URL.
Lze tak přepsat URL /index.jsf?typ=clanek&id=1 na krásnější /clanky/1/. Lze jej také použít pro přesměrování uživatele z již nepoužívané adresy (např. při restrukturalizaci stránek).
U webové aplikace by měli být URL dlouhodobě stabilní tak, aby odkazy na ně fungovaly i za 10 let. Proto je dobré o nich přemýšlet. Navrhnete si strukturu aplikace a k tomu odpovídající URL. Tato přepisování umožňují oddělit adresy od použité technologie (lze ji tedy později snáze vyměnit).
Bohužel pro použití v Javě existuje velmi málo takovýchto modulů. A když už existují, jsou šířeny pod licencí GPL. Pokud je použijete, musíte pod touto licencí uveřejnit i vaši celou aplikaci (a to konkrétně pod GPL, nelze tak použít ani jiné licence). To bylo pro nás neakceptovatelné. Proto jsme před časem vytvořili vlastní implementaci – URL Rewriter. Teď ji uveřejňujeme pod LGPL licencí. Lze jej bez starostí použít.
Knihovna je implementována jako Servlet Filter. Pomocí souboru /WEB-INF/rewriter-config.xml jej můžete konfigurovat:
<rewriter-config xmlns:b="http://rewriter.softeu.cz/basic/"> <b:regex> <from>^/clanky/(.*)$</from> <to>/clanky.jsf?id=$1</to> </b:regex> </rewriter-config>
Program umožňuje také určit, že má být uživatel přesměrován:
<b:regex type="redirect">
Lze také určit, zda se jedná o trvalé (permanent-redirect) nebo dočasné (temporary-redirect) přesměrování.
Modul lze snadno rozšiřovat o vlastní pravidla (např. dotaz do databáze na název článku).
V současné době podporuje tyto tři pravidla:
- b:regex – regulární výraz.
- b:fixed – fixní přesměrování. Není nutné ošetřovat zvláštní znaky jako pro regulární výraz. XML znaky je nutné ošetřovat i nadále.
- b:facelets – sada příkazů, která zjednodušuje práci s JSF a Facelets.
Tento modul lze také snadno použít pro nahrazení přesměrovávajícího index.jsp při použití JSF/Struts apod. Lze jím také zabránit přímému přístupu na index.xhtml.
Instalace
Pokud používáte Maven, stačí přidat do pom.xml závislost:
<!-- url rewriter --> <dependency> <groupId>cz.softeu</groupId> <artifactId>softeu-rewriter</artifactId> <version>1.1</version> <scope>runtime</scope> </dependency>
Pokud Maven nepoužíváte, umístěte soubory softeu-rewriter-1.1.jar a xom-1.1.jar do adresáře WEB-INF/lib/.
Dále upravte web.xml:
<!-- url rewriter --> <filter> <filter-name>RewriterFilter</filter-name> <filter-class>cz.softeu.rewriter.RewriterFilter</filter-class> </filter> <filter-mapping> <filter-name>RewriterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
A vytvořte soubor s pravidly WEB-INF/rewriter-config.xml:
<rewriter-config xmlns:b="http://rewriter.softeu.cz/basic/"> <b:regex> <from>^/clanky/(.*)$</from> <to>/clanky.jsf?id=$1</to> </b:regex> </rewriter-config>
Přeji mnoho úspěchů při používání.
Aktualizace: tak už je tento balík i v hlavním Maven repository. Není tedy nutné používat repository SoftEU
Toto řešení začne být zajímavé, pokud potřebuješ např. provádět dotaz do databáze na název článku (tak je třeba implementován tento blog).
Je možnost vidět praktický příkad?