关于我在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()}
中移除括号,则会收到错误消息,指出(找不到称为“敬礼”的属性)
我还想学习如何从注入的bean中调用方法。我在BackBeanA中注入了BackBeanB,但是当我在页面中说#{bba.salute()}
时,我没有在BackBeanB
中看到来自方法的消息。这是为什么?注入的bean不需要在@PostConstruct
中初始化吗?注入豆的吸气剂和固定剂是否足够?
注意我说<h:outputText value="#{bba.salute()}"/>
的行,它有效,但是eclipse会显示如下警告:
为什么?
答案 0 :(得分:24)
当您编写#{myBean.salute}
时,JSF正在寻找属性 salute
。在Java代码中,它被“翻译”为myBean.getSalute();
。换句话说,你必须为这个属性提供getter(如果在JSF中修改了这个属性,那么最终可以提供setter,例如在输入字段中使用它时)。
当您撰写#{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语法。