从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"; } }
这是我的问题:
-
当我从一个支持bean调用一个方法时,我什么时候需要使用方括号(),当我不需要时? 示例:如果我从
#{bba.salute()}
删除括号,则会出现错误,表示(找不到名为’salute’的属性) -
我还想学习如何从注入的bean调用方法。 我在BackBeanA中注入了BackBeanB,但是当我在页面中说
#{bba.salute()}
时,我没有在BackBeanB
看到来自该方法的BackBeanB
。 这是为什么? 注入的bean不需要在@PostConstruct
初始化吗? 注入豆的吸气剂和固定剂是否足够? -
注意我说
,它可以工作,但是eclipse会显示如下警告:
这是为什么?
当你写#{myBean.salute}
,JSF正在寻找属性 salute
。 在Java代码中,它被“翻译”为myBean.getSalute();
。 换句话说,你必须为这个属性提供getter(如果在JSF中修改了这个属性,那么最终可以提供setter,例如在输入字段中使用它)。
当您编写#{myBean.salute()}
您指的是方法 salute()
。
规则很简单:当您想要执行操作时使用方法(即通常将在action
或actionListener
属性中定义)。 在其他情况下,使用属性。 在您的示例中,您希望在页面中显示一些文本,因此调用#{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语法。