Witam, robię sobie formularz rejestracji i chciałbym rozwiązać problem podwójnych wiadomości. Pierwszy rodzaj to wiadomości, które wysyłane są po przez FacesMessage po wysłaniu zapytania (klinięcie submit w form'ie), a drugi rodzaj to ajax'owe wiadomości - gdzie sprawdzam na bieżąco czy dana nazwa użytkownika jest zajęta czy też wolna. Chodzi o to, że chciałbym te wiadomości scalić do jednego znacznika JSF'owego <h:message> (dla FacesMessage) lub <h:outputText> (dla ajaxa).
<h:form id="registerForm">
<h:panelGrid columns="4" rendered="#{!login.loggedIn}">
<h:outputLabel>Username:</h:outputLabel>
<h:inputText value="#{registerCredential.username}">
<f:ajax event="blur" render="userName" listener="#{register.checkRegistered}"/>
</h:inputText>
<h:outputText id="userName" value="#{register.info}"/>
<h:message for="userName" style="color: red"/>
</h:panelGrid>
</h:form>
Wiadomość pochodząca z form'a (poprzez kliknięcie submit):
@ManagedBean(name = "register")
@RequestScoped
....
FacesContext fc = FacesContext.getCurrentInstance();
UserDAO dao = new UserDAO();
User user = dao.getByUsername(this.registerCredential.getUsername());
if(user != null) { // Nazwa uzytkownika jest zajeta
checkRegister = false;
fc.addMessage("registerForm:userName", new FacesMessage("Nazwa użytkownika jest już zajęta (FacesMessage)"));
}
Wiadomość pochodząca z AJAX'a:
@ManagedBean(name = "register")
@RequestScoped
...
public void checkRegistered() {
UserDAO dao = new UserDAO();
User user = dao.getByUsername(this.registerCredential.getUsername());
if(user != null) {
this.info = "Ta nazwa uzytkownika jest zajeta (AJAX)";
System.out.println(this.info);
}
}
W rezultacie gdy wpisuje w inputText'a nazwę użytkownika, która znajduje się już w bazie otrzymuje i kliknę submit to dostaję pierwszą wiadomość:
Nazwa użytkownika jest już zajęta (FacesMessage)
ta wiadomość oczywiście pozostaje dalej na ekranie i gdy wpiszę znowu te samą nazwę użytkownika to swoją robotę robi AJAX i dorzuca tę samą wiadomość, ale jako zdouble'owaną.
Powstaje taki efekt:
[URL=http://iv.pl/][IMG]http://iv.pl/images/87264066563395777034.png[/IMG][/URL]
http://iv.pl/images/87264066563395777034.png
A więc chciałbym te wiadomości scalić, a dokładniej wyświetlać tylko jedną. Myślałem o tym, żeby wiadomość AJAX'a przekierowywać do znacznika <h:message> i jednocześnie usunąc znacznik <h:outputText>, ale nie zatrybiło bo chyba nie ma prawa działać taka kombinacja. A jeżeli ma, to jak to zrobić, albo w inny sposób to rozwiązać ?