从<h:inputtext>获取空字符串通过验证</h:inputtext>

时间:2011-03-10 12:08:04

标签: validation jsf

有没有办法让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。 每个字段在需要或不需要的意义上是独立的,因此组件依赖性的问题是无关紧要的。 我的目标是通过验证器传递null值,因此我不必将两个标记添加到inputText。

此外,Validator处理程序将'component'作为参数,这意味着我可以获取其ID并在实时中查看是否需要。 (可能并不总是需要相同的组件)。

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

1 个答案:

答案 0 :(得分:6)

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<String, Boolean>

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]}" />

与具体问题无关,将<h:message>作为<h:inputText>的孩子是违法的。把它们放在一起。