关于在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";
    }
}

这是我的问题:
  • 从备用bean调用方法时,什么时候需要使用方括号(),什么时候不需要?示例:如果我从#{bba.salute()}中删除括号,则会收到错误消息,提示(找不到名为“salute”的属性)
  • 我也想学习如何从注入(inject)的bean调用方法。我将BackBeanB注入(inject)了BackBeanA内,但是当我在页面中说#{bba.salute()}时,在BackBeanB中看不到来自该方法的消息。这是为什么?注入(inject)的bean不需要在@PostConstruct中初始化吗?注入(inject)的bean的 setter和getter 是否足够?
  • 注意我说<h:outputText value="#{bba.salute()}"/>的行,它可以工作,但是eclipse显示如下警告:

    这是为什么?
  • 最佳答案

    当您编写#{myBean.salute}时,JSF正在寻找salute属性。在Java代码中,它被“翻译”为myBean.getSalute();。换句话说,您必须为此属性提供getter(例如,如果此属性可以在输入字段中使用,则JSF可以修改该属性,最后是setter)。

    编写#{myBean.salute()}时,是指方法salute()

    规则很简单:要执行操作时使用一种方法(即通常将在actionactionListener属性内定义)。在其他情况下,请使用属性。
    在您的示例中,您想在页面中显示一些文本,因此调用#{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语法。

    10-06 06:08