2011-12-25 17 views
10

È possibile chiamare i metodi di bean & direttamente i parametri dalla vista anziché richiedere prima di impostare le proprietà bean e quindi chiamare metodi senza argomenti utilizzando il comando command o simile?Chiamare metodi bean con argomenti da pagine JSF

Ho un elenco di elementi con ciascun elemento con un elenco di azioni. Per ridurre lo stato, sto usando un singolo primefaces remoteCommand, al posto di diversi commandButton (s). Per ottenere un trigger di attivazione dalla vista, chiamerei lo remoteCommand da javascript, ma dal momento che lo remoteCommand è uno ma utilizzato per più elementi, quindi ho bisogno di passare anche l'id dell'elemento. Mi chiedo se esiste un modo per passare l'id dell'elemento al metodo bean direttamente come argomento invece di impostarlo prima come proprietà bean? C'è un modo per farlo?

Attualmente sto cercando un modo migliore per gestire più pulsanti di comando su una pagina quando c'è un lungo elenco di elementi sulla pagina.

Suggerimenti? Grazie.


Utilizzando JSF 2.1.6 Mojarra con primefaces 3.0RC1

risposta

18

Passaggio di argomenti metodo è supportato dal EL 2.2, che fa parte del Servlet 3.0. Quindi, se la tua webapp funziona su un contenitore compatibile con Servlet 3.0 (Tomcat 7, Glassfish 3, ecc.) Con una specifica Servlet 3.0 conforme allo standard web.xml (che è probabilmente vera quando utilizzi JSF 2.1 che a sua volta richiede implicitamente Servlet 3.0), quindi si sarà in grado di passare metodo argomenti ai metodi di azione di fagioli nella forma seguente:

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

con

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

È anche possibile passare oggetti fullworthy lungo come come:

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

con

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

Se stavate mira un contenitore di servlet 2.5, allora si potrebbe ottenere lo stesso, sostituendo l'attuazione EL, ad esempio JBoss EL, che supporta lo stesso costrutto. Vedi anche Invoke direct methods or methods with arguments/variables/parameters in EL.

+0

è anche possibile all'interno di tag o componenti?Quando passo un bean al componente/tag, chiamo il metodo sull'attributo che contiene il bean, ad es. 'Action = "# {MyBean [ 'actionToCall']}"'. Dall'alto della mia testa non saprei come passare un parametro nella sintassi delle parentesi se non impostandolo con un 'f: setPropertyActionListener', e in questo caso abbiamo bisogno di parentesi sui punti, giusto? – Louise

+1

@Louise: basta usare 'action =" # {myBean ['actionToCall'] (someParam)} "'. Nota che questa sintassi ha un bug nelle versioni precedenti di Tomcat e Glassfish. Solo dal momento che Tomcat 7.0.22 e Glassfish 3.1.2 dovrebbero funzionare correttamente. – BalusC

+0

Da dove viene questo "oggetto" (o "item.id")? Può essere qualcosa come l'id della p: tab selezionata in p: tabView (primefaces)? –

7

È possibile chiamare i metodi ManagedBean con argomenti come questo.

Il ManagedBean corrispondente sarebbe come questo.

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

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

È possibile anche impostare direttamente il valore della proprietà ManagedBean utilizzando <f:setPropertyActionListener></f:setPropertyActionListener> come questo.

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

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

+1 thee propertyActionListener è il modo migliore per me – jpganz18

Problemi correlati