[英]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.