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

Ash*_*ava 1 getter jsf el

我真的不理解吸气剂和塞特剂的工作原理,尽管这是一个基本概念。我有以下代码,该属性如何id发送到Managed Bean?用getter方法捕获了吗?

我的面

<p:inputText id="id" value="#{bean.id}">
Run Code Online (Sandbox Code Playgroud)

我的托管豆

private String id;

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

public String getId() {
      return id;
}
Run Code Online (Sandbox Code Playgroud)

Lui*_*oza 5

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

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

例如,您有一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

而这2 Facelets页(因为它是一个例子,我可以避免声明<html><h:head><h:body>等元素,只是专注于相关代码)

Page1.xhtml:

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Page2.xhtml:

<h:form>
    Please tell me your name
    <h:inputText value="#{loginBean.name}" />
    <h:commandButton action="page2" />
</h:form>
Run Code Online (Sandbox Code Playgroud)

这是幕后发生的事情:

  1. 加载Page1.xhtml时,JSF将创建一个新的实例(LoginBean我们称为)loginBean,并将其注册到JSP请求范围中。由于的值<h:inputText />绑定到LoginBean#name(这被读作字段nameLoginBean),则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并替换它的值。

此处说明的步骤仅是JSF生命周期的很小的解释(很多元素未说明),以及JSF如何使用getter和setters。

更多信息:


附加说明:由于您正在学习JSF,请避免将任何业务逻辑代码放入getter / setter中。这在这里得到了很大的解释:为什么JSF多次调用getters