Компонент JSF2.0 actionListener - PullRequest
       19

Компонент JSF2.0 actionListener

5 голосов
/ 08 декабря 2011

Мне нужна некоторая помощь, чтобы заставить мой Composite Component вести себя.Я все еще изучаю веревки в JSF, поэтому прошу прощения за любое невежество, которое может отображаться в этом посте.

Итак, я работаю с JSF 2.0 и решил создать составной компонент, чтобы этот фрагмент кода можно было повторно использовать,Компонент отображает все отлично, но не будет вести себя вообще при попытке добавить actionListener.

Вот код для моего компонента

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

Вот код на моей странице, который используеткомпонент:

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

и вот мой код на компоненте поддержки:

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

}

Я не получаю никаких ошибок или не достигаю точек останова, которые я установил на компоненте поддержки.Мы будем благодарны за любую помощь или указатели в правильном направлении.

С уважением,

Майк

Ответы [ 2 ]

9 голосов
/ 08 декабря 2011

Я нашел ответ после того, как немного поигрался и начал больше искать.

Изменения в составном компоненте: ОТ:

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

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

TO:

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

Изменения на странице с использованием составного компонента:

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

Большое изменение заключалось в определении сигнатуры метода в составном атрибуте.

С уважением,

Майк

0 голосов
/ 09 июля 2012

Я нашел альтернативное решение вашему. Недостатком вашего решения является то, что вы можете зарегистрировать только одного слушателя: атрибут actionListener может указывать только на один метод.

Способ добавления слушателей заключается в следующем (у вас почти все было правильно в первом фрагменте кода, который вы написали):

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

Обратите внимание, что метод, на который указывает binding, принимает параметр ActionEvent. Это требование использования <f:actionlistener/>.

Используя этот метод, несколько слушателей могут быть зарегистрированы для источника действия, доступного для композитного компонента.

...