我真的不理解吸气剂和塞特剂的工作原理,尽管这是一个基本概念。我有以下代码,该属性如何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)
#{}表达式对getter和setter方法的调用不是JSF的一部分,而是Expression Language(最著名的EL)。JSF利用EL的优势通过适当的getter和setter将HTML组件的数据绑定到bean的字段。这是:
<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)
这是幕后发生的事情:
加载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和setters。
更多信息:
附加说明:由于您正在学习JSF,请避免将任何业务逻辑代码放入getter / setter中。这在这里得到了很大的解释:为什么JSF多次调用getters
| 归档时间: |
|
| 查看次数: |
6446 次 |
| 最近记录: |