Вызов методов из страниц JSF сомневается - PullRequest
6 голосов
/ 06 июля 2011

У меня есть пара вопросов о том, как я называю методы в EL. Может быть, кто-то может объяснить, как это на самом деле работает.

Я сделал этот очень простой пример:

index.xhtml

<h:body>
<!-- Using a method -->
#{bba.salute()}
<br/>
<h:outputText value="#{bba.salute()}"/>
<br/>
<!-- Using a method from an injected bean-->
 #{bba.b.doSomething()} 
</h:body>

BackBeanA.java

@Named("bba")
@SessionScoped
public class BackBeanA implements Serializable {

    private static final long serialVersionUID = 5671761649767605303L;
    @Inject
    private BackBeanB b;

    public String salute() {
        return "Hi! I am 'A'";
    }

    public BackBeanB getB() {
        return b;
    }

    public void setB(BackBeanB b) {
        this.b = b;
    }   
}

BackBeanB.java

@Named("bbb")
@SessionScoped
public class BackBeanB implements Serializable {

    private static final long serialVersionUID = -4786092545430477941L;

    public String doSomething() {
        System.out.println("Hello!!!");
        return "I am a SessionScopped Backing Bean, my name is 'B' and i am doing something";
    }
}

У меня есть следующие вопросы:

  1. Когда я вызываю метод из базового компонента, когда мне нужно использовать скобки (), а когда мне не нужно? Пример: если я удаляю скобки из #{bba.salute()}, я получаю сообщение об ошибке (Не удается найти свойство с именем 'salute')

  2. Я также хочу узнать, как вызывать метод из внедренного компонента. Я ввел BackBeanB внутрь BackBeanA, но когда я говорю «1029 *» на странице, я не вижу сообщения I от метода в BackBeanB. Это почему? Введенные бобы не нужно инициализировать в @PostConstruct верно? Достаточны ли геттеры и сеттеры для введенного компонента?

  3. Обратите внимание на строку, где я говорю <h:outputText value="#{bba.salute()}"/>, она работает, но затмение отображает предупреждение, как это:

    enter image description here

    Почему это?

1 Ответ

25 голосов
/ 06 июля 2011

Когда вы пишете #{myBean.salute}, JSF ищет свойство salute. В коде Java он «переводится» на myBean.getSalute();. Другими словами, вы должны предоставить средство получения для этого свойства (и, в конечном счете, средство установки, если это свойство может быть изменено JSF, когда оно используется, например, в поле ввода).

Когда вы пишете #{myBean.salute()}, вы имеете в виду метод salute().

Правило довольно простое: используйте метод, когда вы хотите выполнить действие (то есть, как правило, оно будет определено внутри атрибута action или actionListener). В остальных случаях используйте собственность. В вашем примере вы хотите отобразить некоторый текст на своей странице, поэтому вместо вызова #{myBean.salute()} просто позвоните #{myBean.salute}.

Во втором пункте попробуйте изменить свой код для доступа к свойству something вместо метода:

<!-- Using a method from an injected bean-->
#{bba.b.something} 

и BeanB код:

public String getSomething() {
    System.out.println("Hello!!!");
    return "I am a SessionScopped Backing Bean, my name is 'B' and i am doing something";
}

Что касается вашего последнего замечания, я думаю, что ваш Eclipse просто не поддерживает синтаксис EL 2.0.

...