web-dev-qa-db-fra.com

Appel de méthodes de bean avec des arguments à partir de pages JSF

Est-il possible d'appeler des méthodes de bean et de leur passer directement des paramètres à partir de la vue au lieu d'exiger de définir d'abord les propriétés du bean puis d'appeler des méthodes sans arguments en utilisant le bouton de commande ou similaire?

J'ai une liste d'articles avec chaque article ayant une liste d'actions. Pour réduire l'état, j'utilise une seule primefaces remoteCommand, à la place de plusieurs commandButton (s). En obtenant un déclencheur d'action de la vue, j'appellerais le remoteCommand de javascript mais puisque le remoteCommand est un mais utilisé pour plusieurs éléments, j'ai donc besoin de transmettre l'id de l'élément également. Je me demande s'il existe un moyen de passer l'ID de l'élément à la méthode du bean directement en tant qu'argument au lieu de le définir d'abord en tant que propriété du bean? Existe-t-il un moyen de le faire?

En fait, je cherche une meilleure façon de gérer plusieurs boutons de commande sur une page quand il y a une longue liste d'éléments sur la page.

Suggestions ? Merci.


Utilisation de JSF 2.1.6 Mojarra avec Primefaces 3.0RC1

14
Rajat Gupta

La transmission d'arguments de méthode est prise en charge depuis EL 2.2 qui fait partie de Servlet 3.0. Donc, si votre application Web s'exécute sur un conteneur compatible Servlet 3.0 (Tomcat 7, Glassfish 3, etc.) avec un web.xml déclaré conforme à la spécification Servlet 3.0 (ce qui est probablement vrai lorsque vous utilisez JSF 2.1 qui nécessite à son tour implicitement Servlet 3.0), vous pourrez alors passer des arguments de méthode aux méthodes d'action du bean sous la forme suivante:

<h:commandButton value="Submit" action="#{bean.submit(item.id)}" />

avec

public void submit(Long id) {
    // ...
}

Vous pouvez même passer des objets valables comme:

<h:commandButton value="Submit" action="#{bean.submit(item)}" />

avec

public void submit(Item item) {
    // ...
}

Si vous visiez un conteneur Servlet 2.5, vous pourriez obtenir le même résultat en remplaçant l'implémentation EL par exemple JBoss EL qui prend en charge la même construction. Voir aussi Invoquer des méthodes directes ou des méthodes avec des arguments/variables/paramètres dans EL .

21
BalusC

Oui, ça l'est.

<h:commandButton action="#{bean.method(object)}" />

Voir ceci http://www.mkyong.com/jsf2/4-ways-to-pass-parameter-from-jsf-page-to-backing-bean/

10
user219882

Vous pouvez appeler des méthodes ManagedBean avec des arguments comme celui-ci.

<h:commandButton actionListener="#{stateBean.delete(row.stateID)}" 
 value="Delete" id="btnDeleteS">

   <f:ajax event="action" execute="@form" render="@form"/>
</h:commandButton>

Le ManagedBean correspondant serait comme ceci.

@ManagedBean
@RequestScoped
public class StateBean
{
    @EJB
    private RemoteInterface obj=null;

    public void delete(String stateID)
    {
        //Code stuff here.
    }
}

Vous pouvez également définir directement la valeur des propriétés ManagedBean à l'aide de <f:setPropertyActionListener></f:setPropertyActionListener> comme ça.

<h:commandButton value="Delete" id="btnDeleteS">

     <f:setPropertyActionListener target="#{stateBean.someProperty}"
       value="#{someValue}"/>
     <f:ajax event="action" execute="@form" render="@form"/>
</h:commandButton>
8
Lion