Добавление методов действия в составной компонент - PullRequest
6 голосов
/ 18 октября 2011

Я изучаю составные компоненты с помощью JSF 2.0 и хочу, чтобы мой компонент мог вызывать методы из вспомогательных компонентов, поэтому я создал простой пример, но что-то не так.

Это компонент, который я создал:

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

<composite:interface>
        <composite:attribute name="attribute1"/>
        <composite:attribute name="attribute2"/>
        <composite:attribute name="actionBtnText"/>
        <composite:attribute name="actionMethod" method-signature="java.lang.String action()"/>
</composite:interface>

<composite:implementation>
    <h:form>
            <h:inputText value="#{cc.attrs.attribute1}"/>
            <br/>
            <h:inputText value="#{cc.attrs.attribute2}"/>
            <br/>
            <h:commandButton action="#{cc.attrs.actionMethod}" value="#{cc.attrs.actionBtnText}"/>          
    </h:form>

</composite:implementation> 

</html>

Вот как я использую его на странице JSF

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

...

    <h:body>
    <custom:demoCustomComponent attribute1="#{demoBB.value1 }" attribute2="#{demoBB.value2 }" actionBtnText="Button text!" actionBtn="#{demoBB.act}"/>
    </h:body>

И этот компонент поддержки поддерживает страницу, на которой компонент

@Named("demoBB")
@RequestScoped
public class DemoBB {

    private String value1;
    private String value2;
    public String getValue1() {
        return value1;
    }

    public String act() {
        System.out.println("Input 1: " + value1 + "\nInput 2: " + value2);
        return null;
    }

    //Getters and setters
    public void setValue1(String value1) {
        this.value1 = value1;
    }
    public String getValue2() {
        return value2;
    }
    public void setValue2(String value2) {
        this.value2 = value2;
    }   
}

Компонент выглядит нормально, но когда я нажимаю кнопку, я получаю исключение, которое говорит:

javax.faces.FacesException: невозможно разрешить составной компонент из использование страницы с использованием выражения EL '# {cc.attrs.actionMethod}'

Я допустил какую-либо ошибку в интерфейсе или реализации компонента? Почему не работает?

1 Ответ

11 голосов
/ 18 октября 2011

Вы определили метод действия, используя имя атрибута actionBtn:

<custom:demoCustomComponent ... actionBtn="#{demoBB.act}"/>

, но ожидаете, что это будет имя атрибута actionMethod:

<composite:attribute name="actionMethod" method-signature="java.lang.String action()"/>

Выровняйте его,Они должны быть одинаковыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...