【问题标题】:Get empty strings from <h:inputText> go through validation从 <h:inputText> 获取空字符串通过验证
【发布时间】:2011-07-12 16:14:36
【问题描述】:

有没有办法让 jsf 验证器处理空字符串? 我有所有 inputTexts 的自定义验证器。 而不是必须实现“必需”标签,我想让客户处理程序处理空字符串并在支持 bean 中确定该字段是否是必需的。

<h:inputText id="SSID_STR" styleClass="propertyInput" value="#{wifiDM.SSIDStr}" validator="#{wifiDM.validate}" >
    <h:message for="SSID_STR" fatalClass="mandatoryFieldMissing" tooltip="true" />
</h:inputText>

如果我必须为我的应用程序中的每个输入文本添加所需的标签:

<h:inputText id="SSID_STR" styleClass="propertyInput" value="#{wifiDM.SSIDStr}" validator="#{wifiDM.validate}" required="#{wifiDM.isRequired} requiredMessage="*">
    <h:message for="SSID_STR" fatalClass="mandatoryFieldMissing" tooltip="true" />
    <f:attribute name="InputID" value="SSID_STR">
</h:inputText>

真是一团糟……


更新(澄清) 首先,使用 JSF 1.2。 每个字段在是否需要的意义上都是独立的,因此组件依赖性问题是无关紧要的。 我的目标是通过验证器传递空值,因此我不必将两个标签都添加到 inputText。

此外,Validator 处理程序获取“组件”作为参数,这意味着如果需要,我可以获取它的 ID 并实时查看。 (可能并不总是需要相同的组件)。

如果我使用required="#{bean.requireCheck}"(例如),我能以某种方式获取调用它的组件吗?

【问题讨论】:

  • Tnx。这实际上并没有解决我验证空字符串字段的问题。我找到了实现我自己的自定义输入字段的可能解决方案。我正在检查它,如果它有效,我会更新。
  • 我不明白为什么它对你不起作用/
  • 我遇到的问题是验证方法不会为空字符串执行。 @BalusC 解决方案也不能处理这种情况。
  • 我怎么强调都不过分,在所有 JSF 问题中,请提及使用的 impl/version。缺少jsf-2.0 标记不一定足以表明您确实在使用 JSF 1.x。

标签: validation jsf


【解决方案1】:

JSF 1.x 默认情况下不会在空字段上触发验证器。为此,必须使用 required 属性。如果您的具体问题是,无论何时填写第一个字段,都必须设置第二个字段required,那么您应该在required 属性中进行检查。

<h:inputText value="#{bean.input1}" binding="#{input1}" />
<h:inputText value="#{bean.input2}" required="#{not empty input1.value}" />

如果这不是功能要求,那么您应该在问题中阐明更多内容,以便给出更合适的答案。


更新:所以你想从模型开始控制需求?在 bean 中添加 Map&lt;String, Boolean&gt;,如下所示:

private Map<String, Boolean> required;

public Bean() {
    required = new HashMap<String, Boolean>();
    required.put("foo", true);
    required.put("bar", false); // false entries are by the way not necessary.
    // ...
}

public Map<String, Boolean> getRequired() {
    return required;
}

如下使用:

<h:inputText id="foo" required="#{bean.required['foo']}" />
<h:inputText id="bar" required="#{bean.required['bar']}" />

如果你使用的是 JSF 2.0,你可以这样做

<h:inputText id="foo" required="#{bean.required[component.id]}" />
<h:inputText id="bar" required="#{bean.required[component.id]}" />

与具体问题无关,将&lt;h:message&gt; 作为&lt;h:inputText&gt; 的子级是非法的。把它们放在一起。

【讨论】:

  • @BalusC 谢谢。我添加了说明。
  • 你需要#{bean.requireCheck}中的组件做什么?
  • 对于每个组件,在任何给定时间,如果组件是否需要,都有一个函数返回 true 或 false。为此,我必须知道哪个组件运行该方法(或者为每个组件编写不同的方法,这似乎是错误的,因为我有很多字段)尽管我最终可能会这样做,因为我没有看到其他问题的解决方案而不是编写自定义组件(这将覆盖 validate() 方法)
  • 是的,但是您到底需要从组件中得到什么?你在用component 做什么?只是component.getClientId(context)?还是component.getId()?或者其他什么。
  • component.getId()component.getAttributes().get(..) 就足够了
猜你喜欢
  • 1970-01-01
  • 2019-11-03
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多