从JSF页面调用方法疑惑

sfr*_*frj 6 java jsf el java-ee jsf-2

关于我在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>
Run Code Online (Sandbox Code Playgroud)

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;
    }   
}
Run Code Online (Sandbox Code Playgroud)

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

  1. 当我从一个支持bean调用一个方法时,我什么时候需要使用方括号(),当我不需要时?示例:如果我从中删除括号#{bba.salute()},我会收到一条错误,说明(找不到名为'敬礼'的属性)

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

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

    在此输入图像描述

    这是为什么?

Rom*_*las 25

当你写作时#{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} 
Run Code Online (Sandbox Code Playgroud)

并在BeanB代码中:

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

关于你的最后一点,我认为你的Eclipse根本不处理EL 2.0语法.

  • 1)`#{bean.getSalute()}`2)如果你没有使用Glassfish插件/ JBoss工具,只需在Eclipse中关闭EL验证. (2认同)