Использование атрибута f: внутри составного компонента - PullRequest
4 голосов
/ 27 января 2012

у нас (по нашему мнению) очень простой сценарий здесь. Но мы как-то застряли на составных компонентах и ​​тегах f: attribute. Я постараюсь сделать код максимально простым.

Композитный компонент:

<cc:interface name="button">
    ...
    <cc:attribute
        name="actionListener"
        required="true"
        method-signature="void f(javax.faces.event.ActionEvent)"
        target="button"
        shortDescription="The action listener for this button." />
    ...
</cc:interface>

<cc:implementation>
    <ice:commandButton
        ...
        actionListener="#{cc.attrs.actionListener}"
        ...>

        <cc:insertChildren />
    </ice:commandButton>
</cc:implementation>

... теперь мы используем такой компонент:

<ctrl:button
    ...
    actionListener="#{bean.method}"
    ...>
    <f:attribute name="objectId" value="#{someObject.id}" />
</ctrl:button>

Теперь нам нужно получить доступ к атрибуту «objectId» внутри метода слушателя действия. Мы уже пробовали что-то вроде этого:

public void method(ActionEvent event)
{
    ...
    event.getComponent().getAttributes().get("objectId");
    ...
}

Но карта атрибутов не содержит objectId. Что-то не так в этом подходе? Каков рекомендуемый способ решения этой проблемы?

Было бы неплохо, если бы кто-то мог помочь нам.

Спасибо! SlimShady

Ответы [ 2 ]

5 голосов
/ 27 января 2012

Этот хак <f:attribute> является пережитком JSF 1.0 / 1.1, когда было невозможно передать объекты в качестве дополнительных аргументов командным кнопкам / ссылкам.Начиная с JSF 1.2 вы должны использовать <f:setPropertyActionListener> для этого.

<ctrl:button action="#{bean.method}">
    <f:setPropertyActionListener target="#{bean.objectId}" value="#{someObject.id}" />
</ctrl:button>

Поскольку EL 2.2 (который является стандартной частью Servlet 3.0, но для Servlet 2.5 реализуется с помощью JBoss EL ), вы можете вместо этого даже передать весь объект просто как аргумент метода:

<ctrl:button action="#{bean.method(someObject.id)}" />
3 голосов
/ 27 января 2012

Мне удалось прочитать атрибут, переданный в копию в следующей настройке.

<test:inner>
    <f:attribute name="fAttribute" value="myAttributeValue" />
</test:inner>

<cc:implementation>
    <h:commandButton value="button" actionListener="#{testBean.actionListener}" >
        <f:attribute name="innerAttribute" value="innerAttributeValue" />
            <cc:insertChildren /> <!-- not necessary, I hoped it would pass the outer attribute --->
    </h:commandButton>
</cc:implementation>

public void actionListener(ActionEvent event) {
    event.getComponent().getNamingContainer().getAttributes().get("fAttribute") 
    // > myAttributeValue
    event.getComponent().getAttributes().get("innerAttribute") 
    // > innerAttributeValue
}

Хитрость заключалась в том, чтобы искать в контейнере именованиякнопка.Таким образом, cc всегда является контейнером именования, поэтому вы можете быть уверены, что попали во внутренний компонент.

Я не уверен, что это так, как было задумано, но насколько я понял,Naming Container собирает такие атрибуты для своих дочерних элементов.

Q: Кто-нибудь знает, считается ли отсутствие передачи атрибутов в кнопку ошибкой в ​​Mojarra / JSF?

...