我们现在可以将这个bean注册到faces-config.xml中:
<managed-bean> <managed-bean-name>userBean</managed-bean-name> <managed-bean-class>com.primeton.jsf.test.User</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> |
我现在可以随时在我的JSF应用中使用这个叫做“userBean”的bean。这个是通过JSF EL表达式来完成的。例如,将一个JSF UI组件绑定到userBean的一个属性上,我可以使用表达式#{userBean.name}作为一个JSF UI组件的参数值。现在,我将userBean的name属性绑定到一个JSF inputText UI组件上:
<h:inputText value="#{userBean.name}"/> |
现在,当组件的值改变时,userBean.name属性也跟着改变。如果userBean.name先改变也是一样。两者将自动保持同步,这是JSF的关键特性。
JSF托管bean的另外一个很重要的特性是它可以通过配置文件来初始化属性。比如说我现在可以通过在配置文件中增加额外的受管属性来为我的userBean定义一些初始的属性值。因此要为我的bean属性设置一些初始值,可以这样做:
<managed-bean> <managed-bean-name>userBean</managed-bean-name> <managed-bean-class> com.primeton.jsf.test.User</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>name</property-name> <value>jack</value> </managed-property> <managed-property> <property-name>phone</property-name> <value>13918888888</value> </managed-property> <managed-property> <property-name>email</property-name> <value>jack@primeton.com</value> </managed-property> </managed-bean> |
要看到这样做的效果,可以构建一个包含有几个被绑定到那些属性的文本框字段的JSF页面,在首次运行这个页面的时候,可以看到从配置文件中设置的一些初始值。
这是JSF的源代码,在一个表单中有几个被关联到userBean属性的输入框:
<h:panelGrid columns="2" > <h:outputLabel value="Name"/><h:inputText value="#{userBean.name}"/> <h:outputLabel value="Phone"/><h:inputText value="#{userBean.phone}"/> <h:outputLabel value="Email"/><h:inputText value="#{userBean.email}"/> </h:panelGrid> |
如果我们之前没有在faces-config.xml配置文件中设置email属性的初始值,表单中的Email字段值将为空。
关于受管属性的特性,另一个值得指出的是除了管理简单类型的属性,JSF的托管Bean功具还可以处理List和Map这样的属性。比如我可以添加一个”tasks”List到我的userBean中:List tasks;再添加一个setter和getter方法。然后我可以将其作为一个受管属性来初始化这个List。
<managed-property> <property-name>tasks</property-name> <list-entries> <value>Finish Module A Designing</value> <value>Finish Coding of Module A</value> <value>Finish Testing Module A </value> </list-entries> </managed-property> |
要在运行的时候看到这些初始值,可以在JSP页面中添加一个dataTable组件:
<p>Current Tasks:</p> <h:dataTable value="#{userBean.tasks}" var="task" border="0"> <h:column> <h:outputText value="#{task}"/> </h:column> </h:dataTable> |
将Map定义为一个受管属性与管理一个List非常相似,除了是要指定map-entries而不是输入list值。如果Map属性在userBean对象被创建时为null,JSF将创建一个新的HashMap并组装它。否则,它会在现的的Map中直接添加条目。比如我现在在userBean中添加一个contactorsBlog的Map并增加setter和getter方法。
在faces-config.xml中这样来初始化我的contactors Map的属性:
<managed-property> <property-name>contactorsBlog</property-name> <map-entries> <map-entry> <key>Bill</key> <value>http://gocom.primeton.com/blog/Bill</value> </map-entry> <map-entry> <key>Kevin</key> <value>http://gocom.primeton.com/blog/kevin</value> </map-entry> <map-entry> <key>Alex</key> <value>http://gocom.primeton.com/blog/alex</value> </map-entry> </map-entries> </managed-property> |