从JSF页面调用方法疑惑

关于我在EL中调用方法的方式,我有几个问题。 也许有人可以解释它是如何运作的。

我做了这个非常简单的例子:

的index.xhtml

  #{bba.salute()} 

#{bba.b.doSomething()}

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()}删除括号,则会出现错误,表示(找不到名为’salute’的属性)

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

  3. 注意我说 ,它可以工作,但是eclipse会显示如下警告:

    在此处输入图像描述

    这是为什么?

当你写#{myBean.salute} ,JSF正在寻找属性 salute 。 在Java代码中,它被“翻译”为myBean.getSalute(); 。 换句话说,你必须为这个属性提供getter(如果在JSF中修改了这个属性,那么最终可以提供setter,例如在输入字段中使用它)。

当您编写#{myBean.salute()}您指的是方法 salute()

规则很简单:当您想要执行操作时使用方法(即通常将在actionactionListener属性中定义)。 在其他情况下,使用属性。 在您的示例中,您希望在页面中显示一些文本,因此调用#{myBean.salute()} ,只需调用#{myBean.salute}

对于第二点,尝试更改代码以访问属性而不是方法:

  #{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语法。