2011-12-07 6 views
5

Ho bisogno di assistenza per far funzionare il mio componente composito. Sto ancora imparando le corde in JSF, quindi scusate qualsiasi ignoranza che potrebbe essere visualizzata in questo post.JSF2.0 Azione componente compositoListener

Quindi, sto lavorando con JSF 2.0 e ho deciso di creare un componente composito per rendere riutilizzabile questo particolare snippet di codice. Il componente visualizza tutto perfettamente, ma non si comporta affatto quando si tenta di aggiungere actionListener.

Ecco il codice per il mio 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> 

Ecco il codice nella mia pagina che utilizza il 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> 

e qui è il mio codice a backing bean:

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

} 

Non ricevo errori o non prendo alcun punto di interruzione impostato sul bean di supporto. Sarebbe gradito qualsiasi aiuto o indicazioni nella giusta direzione.

saluti,

Mike

risposta

9

ho trovato la risposta dopo aver suonato in giro un po 'e più cercando.

Modifiche al componente composito: da:

<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> 

modifiche alla pagina utilizzando il componente composito:

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

Il grande cambiamento è stato definendo la firma del metodo nell'attributo composito.

saluti,

Mike

0

ho trovato una soluzione alternativa al tuo. Un inconveniente della soluzione è che è possibile registrare un solo listener: l'attributo actionListener può solo indicare un metodo.

Il modo per aggiungere ascoltatori è la seguente (quasi aveva ragione nel primo pezzo di codice che hai scritto):

<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> 

Notate come il metodo a cui punta binding prende un parametro ActionEvent. Questo è un requisito per l'utilizzo di <f:actionlistener/>.

Utilizzando questo metodo, è possibile registrare più ascoltatori sulla sorgente di azioni resa disponibile dal componente composito.