ADF Parameter toevoegen aan POST url

Stel je hebt een parameter die altijd mee moet op het request, omdat bijvoorbeeld de look en feel of het gedrag van de ui afhankelijk is van deze parameter.

Bij een GET is dit makkelijk te doen door deze toe te voegen aan de URL bijvoorbeeld:


http://www.mijnsite.nl/mijnpagina.jspx?styleParameter=stijloos in de destination van een goLink tag.


Deze parameter kan dan netjes opgepakt worden door een phaselistener (soort van Interceptor) en de waarde vervolgens gebruiken in je applicatie.


public final class Interceptor implements PhaseListener { /** * Bepaal welke phase(s) deze listener voor uitgevoerd moet worden. * @return PhaseId.RESTORE_VIEW */ @Override public PhaseId getPhaseId() { return PhaseId.RESTORE_VIEW; }/** * Lees de parameters uit het request en zet ze in een bean. * * @param phaseEvent phase event */ @Override public void beforePhase(final PhaseEvent phaseEvent) { final Map<String, String> requestParameterMap = phaseEvent.getFacesContext().getExternalContext().getRequestParameterMap(); if (requestParameterMap.get(?styleParameter?) != null) { someBean.setStyleParameter(requestParameterMap.get(?styleParameter?)); } } /** * Doet niets. * @param phaseEvent phase event */ @Override public void afterPhase(final PhaseEvent phaseEvent) { // Nothing }


Deze phaseListner voeg je toe aan de faces-config.xml


<phase-listener>foo.bar.app.bean.Interceptor</phase-listener>


Maar wat als je nu in ADF een navigatie doet via een commandlink of na een FORM submit navigeert en dus dezelfde paramter wilt hebben? Je werkt hier met een POST dus je kan niet zomaar iets toevoegen aan de url.
Als je kijkt via firebug zie je dat de url van je form submit er als volgt uitziet:


<form id="myForm" name="myForm" class="af_form" method="POST" action="/application/faces/secure/mijnPagina.jspx?_adf.ctrl-state=putrx5phw_17>


Hierbij ben je dus je styleParameter kwijt. Om deze paramter dus ook toe te kunnen voegen moeten we een custom viewhandler maken. Hierbij moeten we de getActionURL methode overriden om zo deze parameter altijd toe te voegen aan de url. Dit ziet er als volgt uit.


/** * Custom viewHandler om parameter toe te voegen aan een action url zodat deze ook onthouden wordt bij een POST. */ public final class CustomViewHandler extends ViewHandlerWrapper{ private final ViewHandler wrappedHandler;/** * Constructor. * @param handler ViewHandler */ public CustomViewHandler(final ViewHandler handler){ super(); this.wrappedHandler = handler; }
/** * {@inheritDoc} */ @Override protected ViewHandler getWrapped() { return wrappedHandler; } /** * {@inheritDoc} */ @Override public String getActionURL(final FacesContext facesContext, final String viewId) { return URLUtil.addParameter(super.getActionURL(facesContext, viewId), "styleParameter", someBean.resolveStyleParameter()); } }


URLUtil.addParameter doet uiteindelijk het volgende


/** * Add a parameter to an URL. * @param requestUrl url to add parameter to * @param parameterName parameter name * @param parameterValue parameter value * @return url with added parameter */ public static String addParameter(final String requestUrl, final String parameterName, final Object parameterValue) { final StringBuilder url = new StringBuilder().append(requestUrl); addParameter(url, parameterName, parameterValue); return url.toString(); }/** * Add a parameter to an URL StringBuilder. * @param url url to add parameter to * @param parameterName parameter name * @param parameterValue parameter value */ public static void addParameter(final StringBuilder url, final String parameterName, final Object parameterValue) { if (url.indexOf("?")> -1) { url.append('&'); } else { url.append('?'); }try { url.append(URLEncoder.encode(parameterName, "UTF-8")).append('=').append(URLEncoder.encode(String.valueOf(parameterValue), "UTF-8")); } catch (UnsupportedEncodingException e) { throw new ApplicationError("Onverwachte fout", e); } }


Deze navigation handler toevoegen aan de faces config tussen de application tags;


<application> <view-handler>nl.rsg.jsf.adf.viewhandler.CustomViewHandler</view-handler> ? </application>


Als je nu in firebug kijkt zie je dat de parameter is meegegeven aan de post url.


<form id="myForm" name="myForm" class="af_form" method="POST" action="/application/faces/secure/mijnPagina.jspx?_adf.ctrl-state=pfhwrx7phw_19&styleParameter=stijlvol>


Op deze manier zal de parameter altijd aanwezig zijn.

Comments are closed.

  • 071 - 82 000 82
  • Rijndijk 137 | 2394 AG Hazerswoude-Rijndijk
DEMO
Oracle Specialized
Java
GlassFish
WSO2
i-bridge
Rabobank
Greencat
Reuma Revalidatie Rotterdam
Robeco
VU Medisch Centrum
CHS
LUMC
TomTom
TKP
NCCW
Erasmus MC
UMCG
VIR
ANWB
BVA Auctions
D-Reizen
STEDIN