Passer un paramètre à une méthode d'un Managed Bean

Il existe plusieurs méthodes pour passer un paramètre d’une page JSFF ou JSPX à un Managed Bean comme  par exemple :
f:setPropertyActionListener
Utilisé dans un af:commandLink ou af:commandButton, ce tag permet de mettre à jour la propriété dans le Managed Bean.

 
Exemple :
JSFF

 <af:commandLink text="commandLink 1" id="cl1">
<f:setPropertyActionListener value="value pass by commandLink"
 target="#{viewScope.managedBean1.parameter}"/>
</af:commandLink>

Managed Bean

...
private String parameter;
...
public void setParameter(String parameter) {
this.parameter = parameter;
}

f:attribute
Utilisé dans un af:commandButton, ce tag permet de récupérer la valeur de l’attribut dans la méthode du Managed Bean définie dans la propriété actionListener du commandButton
Exemple :
JSFF

 <af:commandButton text="commandButton 1" id="cb2"
actionListener="#{viewScope.managedBean1.buttonActionListener}">
<f:attribute name="attributeParameter" value="value pass by f:attribute (commandButton)" />
</af:commandButton>
}

Managed Bean

public void buttonActionListener(ActionEvent actionEvent) {
...
String parameter = (String) actionEvent.getComponent().getAttributes().get("attributeParameter");
...
}

Par contre, Il n’est pas possible de passer un paramètre lors d’un appel à une méthode d’un Managed Bean via les commandes EL. Il  existe heureusement un contournement que je vais exposer dans l’exemple ci-dessous.
L’objectif consiste à afficher dans un OutputText une valeur de clef de bundle non pas en utilisant le mécanisme classique :

...
<c:set var="viewcontrollerBundle"  value="#{adfBundle['view.ViewControllerBundle']}"/>
...
<af:outputText value="#{viewcontrollerBundle.BUNDLE_KEY}" id="ot2"/>
...

mais en faisant appel à une méthode du Managed Bean (getTranslatedTitle) qui effectuera la recherche dans le fichier ViewControllerBundle.properties (ResourceBundle.getBundle().getString()) avec la clef passée en paramètre de la méthode (‘BUNDLE_KEY’).

  • ViewControllerBundle.properties
BUNDLE_KEY=Valeur clef de bundle
  • JSFF
<af:outputText value="#{viewScope.managedBean1.translatedTitle['BUNDLE_KEY']}" id="ot1"/>
  • Managed Bean
public ParameterMap getTranslatedTitle() {
return new ParameterMap() {
String ret(Object key) {
if (key != null) {
FacesContext messageContext = FacesContext.getCurrentInstance();
ResourceBundle messageBundle = ResourceBundle.getBundle("view.ViewControllerBundle", messageContext.getViewRoot().getLocale());
return messageBundle.getString(key.toString());
} else {
return null;
}
}
};
}
private abstract class ParameterMap extends HashMap<String, String> {
@Override
public String get(Object key) {
return ret(key);
}
abstract String ret(Object key);
}