2011-12-07 21 views
5

Necesito ayuda para hacer que mi Componente Compuesto se comporte. Todavía estoy aprendiendo las cuerdas en JSF, así que disculpen cualquier ignorancia que pueda mostrarse en esta publicación.JSF2.0 Componente Componente actionListener

Por lo tanto, estoy trabajando con JSF 2.0 y decidí crear un componente compuesto para hacer que este fragmento de código en particular sea reutilizable. El componente muestra todo perfectamente, pero no se comportará en absoluto cuando intente agregar ActionListener.

Este es el código para mi componente

<ui:composition 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

    <composite:interface displayName="columnUpdate"> 
     <composite:attribute name="id" 
      required="true" 
      displayName="id" 
      shortDescription="Id to apply to this control and its child components"> 
     </composite:attribute> 
     <composite:attribute 
      name="value" 
      displayName="value" 
      required="true" 
      shortDescription="Field that will hold the new updated value."> 
     </composite:attribute> 

     <composite:attribute 
      name="columnName" 
      displayName="columnName" 
      required="true" 
      shortDescription="Value that will be applied as the column header"> 
     </composite:attribute> 
     <composite:attribute 
      name="text" 
      displayName="text" 
      shortDescription="Text to be displayed above the field"> 
     </composite:attribute> 

     <composite:actionSource name="actionEvent" targets="saveEvent"></composite:actionSource> 
    </composite:interface> 

    <composite:implementation> 
     <h:outputLabel value="#{cc.attrs.columnName}" onclick="showWindow('#{cc.attrs.id}')"></h:outputLabel> 

     <div id="#{cc.attrs.id}" class="ccColumnUpdate"> 
     <div id="windowClose" onclick="closeWindow('#{cc.attrs.id}');" style="top: -10px;" title="Close this window">CLOSE</div> 
      <div> 
       <h:outputLabel id="lblTitle" value="#{cc.attrs.text}"></h:outputLabel> 
      </div> 
      <div> 
       <h:inputText id="txtValue" value="#{cc.attrs.value}"></h:inputText> 
      </div> 
      <div style="text-align:right;"> 
       <h:commandButton id="saveEvent" value="Save"></h:commandButton> 
      </div> 
     </div> 
    </composite:implementation> 
</ui:composition> 

Este es el código en mi página que utiliza el componente:

<al:columnUpdate id="cuExpenseAmount" value="#{expense.columnValue}" columnName="Expense Amount" text="Set Expense Amount to:"> 
    <f:actionListener for="actionEvent" binding="#{expense.updateColumnValue}"> 
    <f:ajax execute="@form"></f:ajax> 
    </f:actionListener> 
</al:columnUpdate> 

y aquí está mi código en el bean de respaldo:

public void updateColumnValue(ActionEvent event) throws ParseException{ 
    //Got HERE 

} 

No recibo ningún error ni toco los puntos de corte que configuré en el bean de respaldo. Cualquier ayuda, o sugerencias en la dirección correcta sería apreciada.

Saludos,

Mike

Respuesta

9

he encontrado la respuesta después de jugar un poco más la búsqueda.

Los cambios en el componente compuesto: DE:

<composite:actionSource name="actionEvent" targets="saveEvent"></composite:actionSource> 

<h:commandButton id="saveEvent" value="Save"></h:commandButton> 

A:

<composite:attribute name="registerButtonActionListener" method-signature="void actionListener(javax.faces.event.ActionEvent)" /> 

<h:commandButton id="saveEvent" value="Save" actionListener="#{cc.attrs.registerButtonActionListener}"> 
        <f:ajax execute="@this" event="click"></f:ajax> 
       </h:commandButton> 

cambios en la página utilizando el componente compuesto:

<al:columnUpdate id="cuExpenseAmount" value="#{expense.columnValue}" registerButtonActionListener="#{expense.updateColumnValue}" columnName="Expense Amount"> 
          </al:columnUpdate> 

El gran cambio fue definir la firma del método en el atributo compuesto.

Saludos,

Mike

0

he encontrado una solución alternativa a la suya. Un inconveniente de su solución es que solo puede registrar un oyente: el atributo actionListener solo puede apuntar a un método.

La manera de añadir detectores es la siguiente (que casi lo tenía justo en la primera pieza de código que escribió):

<al:columnUpdate id="cuExpenseAmount" value="#{expense.columnValue}" columnName="Expense Amount" text="Set Expense Amount to:"> 
<f:actionListener for="actionEvent" binding="#{expense.updateColumnValue(ActionEvent)}"> 
    <f:ajax execute="@form"></f:ajax> 
</f:actionListener> </al:columnUpdate> 

Aviso cómo el método apuntado por binding toma un parámetro ActionEvent. Este es un requisito de usar <f:actionlistener/>.

Al utilizar este método, se pueden registrar múltiples oyentes en la fuente de acción disponible por el componente compuesto.