2011-12-25 15 views
10

¿Es posible llamar a los métodos bean & directamente pasarles los parámetros de la vista en lugar de tener que establecer primero las propiedades del bean y llamar a los métodos sin argumentos usando el comandoBotón o similar?Métodos del bean de llamada con argumentos de JSF páginas

Tengo una lista de elementos con cada elemento que tiene una lista de acciones. Para reducir el estado, estoy usando un solo primo remoteCommand, en lugar de varios commandButton (s). Al obtener un activador de acción de la vista, llamaría al remoteCommand desde javascript, pero dado que el remoteCommand es uno pero se usa para varios elementos, también necesito pasar el id del elemento. Me pregunto si hay una manera de pasar la identificación del artículo al método de bean directamente como argumento en lugar de establecerlo primero como una propiedad de bean. Hay alguna manera de hacerlo ?

En realidad, estoy buscando una mejor manera de tratar con múltiples CommandButtons en una página cuando hay una larga lista de elementos en la página.

Sugerencias? Gracias.


Usando JSF 2.1.6 Mojarra con Primefaces 3.0RC1

Respuesta

18

Pasando argumentos del método está soportado desde EL 2.2 que es parte de Servlet 3.0. Por lo tanto, si su aplicación web se ejecuta en un contenedor compatible con Servlet 3.0 (Tomcat 7, Glassfish 3, etc.) con una especificación de Servlet 3.0 declarada conforme a web.xml (que es probable porque está utilizando JSF 2.1 que a su vez requiere Servlet 3.0), usted será capaz de pasar del método argumentos a los métodos de acción de frijol en la siguiente forma:

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

con

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

incluso puede pasar objetos a lo largo de fullworthy como como:

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

con

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

Si que se ha orientado un contenedor Servlet 2.5, entonces se podría lograr el mismo mediante la sustitución de la aplicación EL por ejemplo JBoss EL que soporta el mismo constructo. Vea también Invoke direct methods or methods with arguments/variables/parameters in EL.

+0

¿Esto también es posible dentro de las etiquetas o componentes?Cuando paso un bean al componente/etiqueta, llamo al método en el atributo que contiene el bean, p. 'action =" # {myBean ['actionToCall']} ''. Desde lo más alto de mi cabeza, no sabría cómo pasar un parámetro entre paréntesis sin configurarlo con un 'f: setPropertyActionListener', y necesitamos corchetes sobre puntos en este caso, ¿no? – Louise

+1

@Louise: simplemente use 'action =" # {myBean ['actionToCall'] (someParam)} "'. Tenga en cuenta que esta sintaxis tenía un error en versiones anteriores de Tomcat y Glassfish. Solo desde Tomcat 7.0.22 y Glassfish 3.1.2 debería funcionar correctamente. – BalusC

+0

¿De dónde viene este "elemento" (o "elemento.id")? ¿Puede ser algo así como la identificación de la pestaña p: seleccionada en una p: tabView (primefaces)? –

7

Usted puede llamar a los métodos ManagedBean con argumentos como éste.

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

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

El ManagedBean correspondiente sería así.

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

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

También puede establecer directamente el valor de las propiedades ManagedBean utilizando <f:setPropertyActionListener></f:setPropertyActionListener> como este.

<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 es la mejor manera para mí – jpganz18

Cuestiones relacionadas