0

我正在尝试编写一个简单的创建用户页面。我希望用户能够输入所需的用户名,如果用户名已被使用,则会显示输出文本并显示“用户名已在使用中”。

这是我的 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>

这是我的托管 bean

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 事件的消息都没有更新。正在调用服务,但元素没有根据方法结果更改是否显示。

4

1 回答 1

2

使用rendered属性绝对不是验证输入组件的正确方法。您应该使用真正的Validator实现。在这种情况下,您可以在失效的情况下将 aValidatorException与 a 一起抛出FacesMessage。然后,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));
        }
    }

}

也可以看看:


请注意,验证器是 a@ManagedBean而不是 a,@FacesValidator因为@EJB否则无法注入。但是,如果您不使用 EJB 并且手动创建服务类并自己摆弄事务,那么您可能只是保持它是真实的@FacesValidator

@FacesValidator("uniqueUsernameValidator")
public class UniqueUsernameValidator implements Validator {

然后将其引用如下:

<f:validator validatorId="uniqueUsernameValidator" />

也可以看看:

于 2013-09-05T11:32:20.637 回答