在JSF2中填充隐藏字段的更好方法

时间:2013-04-09 08:19:04

标签: jquery jsf-2

我一直在和Jquery一起研究JSF2。我有一个使用JSF2填充隐藏字段的问题。我知道可以这样做

<h:inputHidden id="a" value="#{backingBean.a} />

这很好用,但唯一需要的是我需要在我的支持bean中为'a'创建getter和setter。但我想通过传递另一个参数调用一个支持bean方法,这将返回一个必须在'inputHidden'中设置的输出值。我试过像这样使用

<h:inputHidden id="a" value="#{backingBean.populateA(b)} />

但是,这段代码在我的浏览器控制台上发出警告说用法不正确。我理解带有参数的支持bean方法应该在{action'属性中调用,如<h:commandButton>。如何使用JSF2甚至Jquery为隐藏字段使用某些内容?

请注意,我需要在页面加载时填充此输入隐藏字段。不确定是否可以完成。

感谢您的提前时间。

2 个答案:

答案 0 :(得分:1)

使用隐藏的命令按钮将值传递给方法

<h:commandButton value="Print" id="someButton" style="visibility: hidden;"
                    action="#{backingBean.populateA(b)}">
  <f:ajax execute="@this" render="a"/>
</h:commandButton>

和一个用于接收输出的隐藏输入

<h:inputHidden id="a" value="#{backingBean.a} />

在触发所需事件时使用jQuery单击按钮。

答案 1 :(得分:1)

关于这个主题的详细说明

所有旨在充当“价值持有者”的标记,即<h:inputText><h:selectOneMenu>等标记,都由实现{{3}的UIInput类备份接口。在应用请求值阶段期间,用户提交的值将从请求参数中提取,并按UIInput#setSubmittedValue设置为相应组件类的提交值。如有必要,可以使用Converter#getAsObject预先转换值。

接下来,每个“值持有者”组件都提供value属性,该属性将组件的值与辅助bean的属性双向绑定。例如,当绑定的格式为value="#{bean.prop}"时,当需要从bean属性更新组件值并且bean.getProp()bean.setProp(value)派生时调用value更新模型值阶段期间更新模型值时从UIInput#getValue()开始。

总而言之,UIInput组件需要通过相应JSF标记的value属性与bean属性进行双向绑定,并且此绑定提供对数据的访问权限。通过值表达式建模。这为我们留下了value="#{bean.prop}"类型的值绑定。

基于某种方法的物业种群

如果您想要使用直接的用户提交的值填充bean属性,但是通过某种方法修改了值,您基本上会留下以下内容:

  1. 提供EditableValueHolder并在Converter#getAsObjectConverter#getAsString中的bean属性和组件值之间进行一对一映射。不要忘记在转换器中指定转换器,例如标签的converter属性。作为通常的参考点,您可以参考Converter;
  2. 在getter / setter对中执行转换器类型转换,例如public String getProp(String s) { return modifyPropValue(this.prop); }public void setProp(String s) { this.prop = modifyCompValue(s); }。我会强烈反对这样做;
  3. 在表单提交期间执行动作(侦听器)方法中的转换。为此,您可以使用dummyProp bean属性进行虚拟绑定,并在您的action(侦听器)方法中执行this.prop = modifyCompValue(dummyProp)。您还可以注意到,具有虚拟属性是多余的,您可以通过FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")访问必要的请求参数。实际上,在另一个答案中提出的解决方案是这种转变的一个特例,其中行动方法中唯一的事情是转换价值的人口。