关于在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";
}
}
这是我的问题:
#{bba.salute()}
中删除括号,则会收到错误消息,提示(找不到名为“salute”的属性)#{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()
。
规则很简单:要执行操作时使用一种方法(即通常将在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语法。