jsf message не отображается (делаю валидатор)
Есть страница (на которой я делаю тесты)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
lang="ru">
<h:head>
</h:head>
<h:body>
//всякая всячина
<h:form>
<h:inputText id="id1">
<f:validator validatorId="imageValidator" />
</h:inputText>
<h:message for="id1" rendered="true" />
<p:commandButton value="Сохранить" />
</h:form>
//всякая всячина
</h:body>
</html>
ее обслуживает бин
@ManagedBean(name="Events")
@SessionScoped
@FacesValidator("imageValidator")
public class Events implements Serializable, Validator {
//всякая всячина
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_WARN, "ахтунг", null);
throw new ValidatorException(facesMessage);
}
}
Сейчас хочу добиться что при нажатии на кнопку "сохранить" форма выдает сообщение о ошибки заполнения формы, а далее буду добавлять остальную логику.
В функцию validate программа заходит. Выполняет ее без ошибок. Но сообщение не отображается. т.е. <h:message for="id1" rendered="true" /> как будто не работает. Не пойму в чем дело, вроде все так же как и в примерах делаю.
Проблема в том, что primeFaces не дружит с обычным jsf. Т.е. если поменять <p:commandButton value="Сохранить" />
на <h:commandButton value="Сохранить" />
то все работает, но не красиво. Буду разбираться ка у primeFaces валидация работает
Ответы (1 шт):
Нажатие h:commandButton приводит выполнению POST-запроса и обновлению страницы целиком, в то время как p:commandButton по умолчанию выполняет AJAX-запрос, и по умолчанию не обновляет никакие элементы на странице. В p:commandButton следует добавить атрибут update="id1" для того, чтобы после завершения запроса обновить состояние h:message.
Другой вариант - указать атрибут ajax="false". Это приведёт к тому, что поведение p:commandButton станет таким же, как у h:commandButton.