4

我一直在用 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' 属性中调用,例如 in <h:commandButton>。如何使用 JSF2 甚至 Jquery 将某些东西用于隐藏字段?

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

提前感谢您的时间。

4

2 回答 2

1

对主题的阐述

所有被设计用作“值持有者”的标签,即像<h:inputText>or之类的标签<h:selectOneMenu>,都由UIInput实现EditableValueHolder接口的类支持。在应用请求值阶段,用户提交的值是从请求参数中提取的,并被设置为适当组件类的提交值UIInput#setSubmittedValue。如有必要,可使用 预先转换这些值Converter#getAsObject

接下来,每个“值持有者”组件都提供一个value属性,该属性将组件的值与支持 bean 的属性双向绑定。例如,当绑定的形式为 时,当需要从 bean 属性更新组件值时调用 then ,并在value="#{bean.prop}"更新模型阶段更新模型值时调用。bean.getProp()bean.setProp(value)valueUIInput#getValue()

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

基于某种方法的属性填充

当您不想使用直接的用户提交的值而是使用通过某种方法修改的值来填充 bean 属性时,您基本上剩下以下内容:

  1. 在 和 中提供一个并在 bean 属性和Converter组件值之间进行一对一的映射。不要忘记在标签的属性中指定您的转换器。作为一个通常的参考点,您可以参考JSF 2.0 中的通信Converter#getAsObjectConverter#getAsStringconverter
  2. 在 getter/setter 对中进行转换器类型的转换,例如 inpublic String getProp(String s) { return modifyPropValue(this.prop); }public void setProp(String s) { this.prop = modifyCompValue(s); }. 我强烈反对这样做;
  3. 在表单提交期间在 action(listener) 方法中进行转换。为此,您可以使用dummyPropbean 属性进行虚拟绑定,并this.prop = modifyCompValue(dummyProp)在您的 action(listener) 方法中执行此操作。您还可以注意到,拥有一个虚拟的roperty 是多余的,您可以通过访问必要的请求参数FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")。实际上,另一个答案中提出的解决方案是这种转换的一个特例,其中唯一有效的方法是转换值的填充。
于 2013-04-09T15:36:38.827 回答
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 单击按钮。

于 2013-04-09T09:51:18.783 回答