0

请帮助我理解,

<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 时,它如何评估要调用 setter 的 bean。它是否从输入区域内使用的 bean 中获得重新访问?

谢谢

4

1 回答 1

8

命令按钮不这样做。命令按钮仅自行确定是否必须调用某个操作,如果是,它是哪种方法。每个输入组件都设置自己的值。实际工作是在与组件关联的decode()方法中完成的。在应用请求值阶段,RendererJSF 遍历所有UIForm和组件。他们每个人首先通过自己的客户端ID作为请求参数名称获取请求参数值:UIInputUICommand

String value = request.getParameter(input.getClientId(context));

(在request这里HttpServletRequestinput在这里UIInput

然后,经过必要的转换和验证过程,最终将其设置为由其自身属性引用的 beanvalue属性。

input.getValueExpression("value").setValue(context.getElContext(), value);

如果 bean 尚不存在于作用域中,则将评估 bean 并自动创建它,然后使用传入的值调用其上ValueExpression#setValue()的方法。#{userBean.age}setAge()

这在JSF 规范中有详细描述。

于 2012-05-29T05:59:42.323 回答