EL#{bean.id}如何调用托管bean方法bean.getId()

时间:2014-11-20 16:11:40

标签: jsf el getter

我真的不明白getter和setter是如何工作的,尽管这是一个基本概念。我有以下代码,属性id如何发送到Managed Bean?它是通过getter方法捕获的吗?

我的小脸

<p:inputText id="id" value="#{bean.id}">

我的托管bean

private String id;

public void setId(String id) {
    this.id = id;
}

public String getId() {
      return id;
}

2 个答案:

答案 0 :(得分:4)

#{}表达式对getter和setter方法的调用不是JSF的一部分,而是Expression Language(大多数称为EL)。 JSF利用EL通过适当的getter和setter将HTML组件的数据绑定到bean的字段。这是:

  • 如果bean存在,Expression Language将在适当的范围内执行已注册bean的正确getter。
  • 如果客户端执行表单提交或ajax请求,那么发送到服务器的组件(通常是<h:form>中的所有组件,如果是ajax请求,您可以说明要发送给哪些组件server)将包含一个新值,该值将使用正确的setter方法设置为该字段。

例如,您有SayHelloBean属于请求范围:

@RequestScoped
@ManagedBean
public class LoginBean {
    private String name;
    //proper getter
    public String getName() {
        return this.name;
    }
    //proper setter
    public void setName(String name) {
        this.name = name;
    }
}

这两个facelets页面(因为这是一个例子,我避免声明<html><h:head><h:body>和其他元素,只关注相关代码)

Page1.xhtml:

<h:form>
    Please tell me your name
    <h:inputText value="#{loginBean.name}" />
    <h:commandButton action="page2" />
</h:form>

Page2.xhtml:

Hello #{loginBean.name}

这是幕后发生的事情:

  1. 当加载Page1.xhtml时,JSF将创建一个LoginBean的新实例,我们称之为loginBean,并将其注册到JSP请求范围。由于<h:inputText />的值绑定到LoginBean#name(读作 name的字段LoginBean),因此EL将显示值loginBean#name(读作实例name 的字段loginBean),由于未初始化,EL将显示null ,作为一个空字符串。

  2. 当您提交Page1.xhtml表单时,由于LoginBean@RequestScoped,因此JSF将创建LoginBean的新实例,我们可以将其称为loginBean2 (最后添加2因为这个实例与之前创建的loginBean完全不同,并且会在JSP请求范围内注册它。由于<h:inputText />的值绑定到LoginBean#name,因此JSF将通过调用正确的setter来验证和设置数据。这将使loginBean2#name具有<input type="text">呈现的<h:inputText/>的值。

  3. 最后,JSF将确保通过转发导航到Page2.xhtml,在处理它时,它将找到#{loginBean.name}并且EL将检查loginBean2#name的值并替换它

  4. 这里解释的步骤是JSF生命周期的一个非常小的解释(以及许多未解释的元素)以及JSF如何使用getter和setter。

    更多信息:


    补充说明:既然您正在学习JSF,请避免在getter / setter中添加任何业务逻辑代码。这在这里有很大的解释:Why JSF calls getters multiple times

答案 1 :(得分:0)

每当你使用

之类的东西时
#{someBean.someField}

EL查找someBean.getSomeField()或someBean.setSomeField(...)方法,具体取决于您是否正在读取该字段或在其中写入(可以从上下文中轻松推断)。 JSF从不直接访问字段(即不使用其getter或setter)。尝试删除给定字段的getter和setter,您将看到它无法正常工作。