Pokud stejně jako my používáte JSF a jsou pro Vás důležitá hezká URL, můžete použít Tuckey’s URL rewrite nebo SoftEU URL Rewriter, kteří zařídí přepsání hezkého URL na skutečné URL v JSF stránce.
Pravidla mohou přespat URL např. takto:
/objednavka/ -> /objednavka/list.jsf
/objednavka/100/ -> /objednavka/view.jsf?id=100
Pokud přepisování URL použijete, brzy narazíte na problém, že při použití <h:form/> se do stránky zapíše původní přepsaná stránka (/objednavka/view.jsf?id=100) a nikoliv hezké URL pro uživatele.
Pro tento problém existuje snadné řešení – napsat si vlastní ViewHandler
a upravit především jeho metodu getActionURL(FacesContext context, String viewId)
, která vrací pro zadané viewId jeho URL.
Tato třída umožňuje modifikaci chování při obsluze fáze render response a restore view. Třídu uvedete ve faces-config.xml, který lze umístit i v classpath do META-INF a prostým připojením jaru tak lze modifikovat chování aplikace (odpadá tedy složitá integrace knihoven). Těchto tříd lze skládat dohromady více (např. z různých knihoven) – parametrem konstruktoru je vždy původní (nadřazená) implementace této třídy. Tento mechanizmus se v JSF používá i na další části (NavigationHandler, …) a je jedním z důvodů snadné rozšiřitelnosti JSF.
Naši třídu tedy můžeme implementovat například takto:
public class MyViewHandler extends ViewHandlerWrapper { ViewHandler handler; public MyViewHandler(ViewHandler parent) { this.handler = parent; } @Override protected ViewHandler getWrapped() { return handler; } @Override public String getActionURL(FacesContext context, String viewId) { String currentView = context.getViewRoot().getViewId(); if (currentView.equals(viewId)) { HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest(); String originalUrl = Rewriter.getOriginalUrl(request); if (originalUrl != null) { return originalUrl; } } return super.getActionURL(context, viewId); } }
Funkce Rewriter.getOriginalUrl(request);
vrací původní nepřepsané URL v knihovně SoftEU URL Rewriter. V případě knihovny z tuckey.org musíte buď vytvořít ekvivalent této metody a nebo použít reverzní přepis URL (tj. při volání HttpServletResponse.encodeURL).
Pomocí tohoto jednoduchého triku můžete používat hezká URL i v JSF.
Dokonale! Jsi moje spasa :-).
Diky moc.
Našel jsem drobnou chybu. Správné vyzvednutí original url je z requestu. Metoda getActionURL :
public String getActionURL(FacesContext context, String viewId) {
String currentView = context.getViewRoot().getViewId();
if (currentView.equals(viewId)) {
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
String originalUrl = (String) request.getAttribute(RewriterFilter.ORIGINAL_URL_ATTR);
if (originalUrl != null) {
return originalUrl;
}
}
return super.getActionURL(context, viewId);
}
scope v pomu pro softeu-rewriter je nutné smazat.