请帮助我理解,
<h:form>
<h:panelGrid columns="3">
<h:outputText value="Age:"/>
<h:inputText value="#{userBean.age}" size="4"/>
<a4j:commandButton value="Enter Age" reRender="age"/>
</h:panelGrid>
<h:panelGrid>
<h:outputText id="age" value="Your age: #{userBean.age}"/>
</h:panelGrid>
</h:form>
当单击commandButton时,它如何评估bean以调用setter。它是否从输入区域内使用的bean中得到了补偿?
感谢
答案 0 :(得分:8)
命令按钮不会这样做。命令按钮仅确定是否必须调用操作,如果需要,则调用它是哪种方法。每个输入组件都设置自己的值。实际作业是在与组件关联的decode()
的{{1}}方法中完成的。在应用请求值阶段,JSF会遍历所有Renderer
,UIForm
和UIInput
组件。它们中的每一个首先通过自己的客户端ID获取请求参数值作为请求参数名称:
UICommand
(String value = request.getParameter(input.getClientId(context));
在这里HttpServletRequest
而request
在这里UIInput
)
然后,在必要的转换和验证过程之后,它最终被设置为由其自己的input
属性引用的bean属性。
value
ValueExpression#setValue()
将评估input.getValueExpression("value").setValue(context.getElContext(), value);
,如果bean尚不存在,则自动创建bean,然后使用传入的方法调用其上的#{userBean.age}
方法值。