我在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();
用户名为null。(提交的值仅在IE浏览器中出现,但在剩余的浏览器中,我将作为提交的值获得null)。 请务必做。
答案 0 :(得分:2)
动作侦听器在调用应用程序阶段期间运行。此时,UIInput#getSubmittedValue()
可用的输入组件提交值仅在输入组件本身转换或验证失败时才可用。在验证阶段,如果输入组件已成功完成转换和验证,则将清除提交的值并设置组件的(本地)值。这可以通过UIInput#getValue()
获得。
所以,你应该实际使用:
String userName = (String) input.getValue();
无关,动作侦听器是执行验证的错误工具(至少,动作侦听器的类名称暗示您的具体功能要求是验证用户名)。您应该使用正常的验证器。摆脱整个actionListener
,并以通常的方式注册<h:inputText validator>
或<f:validator>
。提交的(并转换的,如果适用的话)值可以通过validate()
接口立即作为Validator
方法的第三个参数使用。
E.g。
<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."));
}
}
}