JSF a hezká URL

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.

2 thoughts on “JSF a hezká URL”

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *