[英]JSF Primefaces ajax rendered not updating
我正在尝试编写一个简单的创建用户页面。 我希望用户能够键入所需的用户名,如果用户名已被使用,则会显示输出文本,并显示“用户名已在使用中”。
这是我的xhtml页面
<tr>
<td>Username: </td>
<td>
<p:inputText id="username" value="#{createUserManagedBean.username}" required="true" requiredMessage="Username is required.">
<p:ajax event="keyup" update="uniqueUsernameMessage"/>
</p:inputText>
</td>
<td>
<h:outputText id="uniqueUsernameMessage" value="Username already in use" rendered="#{!createUserManagedBean.checkUniqueUsername()}" />
</td>
</tr>
这是我的托管豆
public boolean checkUniqueUsername()
{
if(!StringUtils.isBlank(getUsername()))
{
UserDTO userDTO = new UserDTO();
userDTO.setUsername(username);
boolean result = getUserService().validateUniqueUsername(userDTO);
return result;
}
else
return false;
}
我的问题是该消息不会针对每个keyup事件更新。 正在调用该服务,但是该元素没有根据方法结果更改是否显示。
使用rendered
属性绝对不是验证输入组件的正确方法。 您应该使用真实的Validator
实现。 在这种情况下,您可以在无效的情况下,仅将带有FacesMessage
的ValidatorException
抛出。 然后,JSF将确保FacesMessage
最终出现在与输入组件关联的正确的<h:message>
中。
总而言之,这应该做到:
<p:inputText id="username" value="#{createUserManagedBean.username}" ...>
<f:validator binding="#{uniqueUsernameValidator}" />
<p:ajax event="keyup" update="usernameMessage" />
</p:inputText>
<h:message id="usernameMessage" for="username" />
同
@ManagedBean
@RequestScoped
public class UniqueUsernameValidator implements Validator {
@EJB
private UserService userService;
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (value == null || value.isEmpty()) {
return; // Let required="true" handle.
}
String username = (String) value;
if (userService.findByUsername(username) != null) {
throw new ValidatorException(new FacesMessage(
FacesMessage.SEVERITY_ERROR, "Username already in use. Please choose another", null));
}
}
}
请注意,验证器是@ManagedBean
而不是@FacesValidator
因为否则无法注入@EJB
。 但是,如果您不使用EJB,而是手动创建服务类并亲自处理事务,那么您可以将其保留为真正的@FacesValidator
:
@FacesValidator("uniqueUsernameValidator")
public class UniqueUsernameValidator implements Validator {
然后改为引用如下:
<f:validator validatorId="uniqueUsernameValidator" />
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.