我真的不明白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;
}
答案 0 :(得分:4)
#{}
表达式对getter和setter方法的调用不是JSF的一部分,而是Expression Language(大多数称为EL)。 JSF利用EL通过适当的getter和setter将HTML组件的数据绑定到bean的字段。这是:
<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}
这是幕后发生的事情:
当加载Page1.xhtml时,JSF将创建一个LoginBean
的新实例,我们称之为loginBean
,并将其注册到JSP请求范围。由于<h:inputText />
的值绑定到LoginBean#name
(读作 name
类的字段LoginBean
),因此EL将显示值loginBean#name
(读作实例name
的字段loginBean
),由于未初始化,EL将显示null
,作为一个空字符串。
当您提交Page1.xhtml表单时,由于LoginBean
为@RequestScoped
,因此JSF将创建LoginBean
的新实例,我们可以将其称为loginBean2
(最后添加2
因为这个实例与之前创建的loginBean
完全不同,并且会在JSP请求范围内注册它。由于<h:inputText />
的值绑定到LoginBean#name
,因此JSF将通过调用正确的setter来验证和设置数据。这将使loginBean2#name
具有<input type="text">
呈现的<h:inputText/>
的值。
最后,JSF将确保通过转发导航到Page2.xhtml,在处理它时,它将找到#{loginBean.name}
并且EL将检查loginBean2#name
的值并替换它
这里解释的步骤是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,您将看到它无法正常工作。