【问题标题】:Better way to populate hidden fields in JSF2 [duplicate]在 JSF2 中填充隐藏字段的更好方法 [重复]
【发布时间】:2013-03-31 13:53:01
【问题描述】:

我用 Jquery 研究 JSF2 已经有一段时间了。我在使用 JSF2 填充隐藏字段时遇到问题。我知道可以这样做

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

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

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

但是,这段代码在我的浏览器控制台上给了我一个警告,说用法不正确。我知道应该在&lt;h:commandButton&gt; 中的“动作”属性中调用带有参数的支持bean 方法。如何使用 JSF2 甚至 Jquery 将某些东西用于隐藏字段?

请注意,我需要在页面加载时填充此输入隐藏字段。不知道能不能搞定。

提前感谢您的宝贵时间。

【问题讨论】:

  • 当您将某些内容绑定到某个输入的值时,JSF 将为该字段调用 getter 和 setter。如果这可能是您尝试做的事情,您认为 JSF 在提交表单时将如何设置值?
  • 感谢您的回复。我了解 JSF 的工作原理。我在问如何在 JSF2 中完成我所描述的事情。

标签: jquery jsf-2


【解决方案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 将其视为另一种选择。
【解决方案2】:

阐述主题

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

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

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

基于某种方法的属性填充

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

  1. 提供Converter 并在Converter#getAsObjectConverter#getAsString 中的bean 属性和组件值之间进行一对一的映射。不要忘记在标签的 converter 属性中指定您的转换器。作为平时的参考,大家可以咨询Communication in JSF 2.0
  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(listener) 方法中执行 this.prop = modifyCompValue(dummyProp)。您还可以注意到,拥有一个虚拟的roperty 是多余的,您可以通过FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id") 访问必要的请求参数。实际上,另一个答案中提出的解决方案是这种转换的一个特例,其中唯一有效的方法是转换值的填充。

【讨论】:

  • 如果这些真的是猜测,您应该将它们作为问题发布,而不是答案。如果它们是事实,则不应将它们标记为推测。
  • @EJP 你说得很好,但我的意思是讨论或阐述,而不是基于有争议的前提进行理论化,当然。不过,如果我是你,我会立即编辑该行而不是评论。还是谢谢!
猜你喜欢
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
相关资源
最近更新 更多