从JSF页面调用方法疑惑

时间:2011-07-06 10:27:03

标签: java jsf java-ee jsf-2 el

关于我在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. 当我从支持bean调用方法时,何时需要使用方括号(),何时不需要?示例:如果我从#{bba.salute()}中移除括号,则会收到错误消息,指出(找不到称为“敬礼”的属性)

  2. 我还想学习如何从注入的bean中调用方法。我在BackBeanA中注入了BackBeanB,但是当我在页面中说#{bba.salute()}时,我没有在BackBeanB中看到来自方法的消息。这是为什么?注入的bean不需要在@PostConstruct中初始化吗?注入豆的吸气剂和固定剂是否足够?

  3. 注意我说<h:outputText value="#{bba.salute()}"/>的行,它有效,但是eclipse会显示如下警告:

    enter image description here

    为什么?

1 个答案:

答案 0 :(得分:24)

当您编写#{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语法。