2

当我附加到我的 jsf 时,我遇到了一个问题,如下所示

<h:inputText id="" value="" binding="">
  <a4j:support 
        actionListener="Action_Class.validateUserName" 
        event="onblur" />
</h:inputText>

如上所示,当我从字段中跳出时,validateUserName 必须调用。它正在调用,但是当我试图获取我提交的值时,如下所示,null 即将到来。

UIInput input = actionEvent.getParent();
String userName = input.getSubmittedValue();

用户名作为空值出现。(提交的值仅在 IE 浏览器中出现,但在其余浏览器中,我得到空值作为提交值)。请做需要。

4

1 回答 1

3

动作侦听器在调用应用程序阶段运行。此时,输入组件提交的可用值UIInput#getSubmittedValue()仅在输入组件本身转换或验证失败时才可用。在验证阶段,如果输入组件已经成功转换和验证,则提交的值将被清除并设置组件的(本地)值。这是可用的UIInput#getValue()

所以,你实际上应该使用:

String userName = (String) input.getValue();

与具体问题无关,动作侦听器是执行验证的错误工具(至少,动作侦听器的类名暗示您的具体功能要求是验证用户名)。您应该为此使用普通的验证器。摆脱整体actionListener并注册一个<h:inputText validator><f:validator>代替通常的方式。通过这种方式,提交的(和转换的,如果适用的话)值可以立即作为接口中validate()方法的第三个参数使用。Validator

例如

<h:inputText ... validator="usernameValidator">
   <a4j:support event="onblur" />
</h:inputText>

有类似的东西

public class UsernameValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        String username = (String) value;
        // ...

        if (!valid) {
            throw new ValidatorException(new FacesMessage("Invalid username."));
        }
    }
}
于 2013-10-02T11:09:40.037 回答