簡體   English   中英

JSF Primefaces Ajax呈現未更新

[英]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實現。 在這種情況下,您可以在無效的情況下,僅將帶有FacesMessageValidatorException拋出。 然后,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM