В моей версии JSF/facelets в приложение, здесь'ы упрощенный вариант часть моей форме:
<h:form id="myform">
<h:inputSecret value="#{createNewPassword.newPassword1}" id="newPassword1" />
<h:message class="error" for="newPassword1" />
<h:inputSecret value="#{createNewPassword.newPassword2}" id="newPassword2" />
<h:message class="error" for="newPassword2" />
<h:commandButton value="Continue" action="#{createNewPassword.continueButton}" />
</h:form>
Я'd как, чтобы иметь возможность назначать ошибка на конкретный час:сообщение тег основанная на том, что происходит в continueButton() метод. Различные ошибки должны отображаться для новый_пароль и newPassword2. Валидатор выиграл'т действительно работать, потому что метод, который будет давать результаты (из БД) выполняется в continueButton() метод, и это слишком дорого, чтобы запустить два раза.
Я могу'т использовать H:тег сообщения, потому что на странице есть несколько мест, которые мне нужны для отображения различных сообщений об ошибках. Когда я попытался это, страницы отображаются дубликаты каждого сообщения.
Я попытался это как предположение, но не повезло:
public Navigation continueButton() {
...
expensiveMethod();
if(...) {
FacesContext.getCurrentInstance().addMessage("newPassword", new FacesMessage("Error: Your password is NOT strong enough."));
}
}
Что я упускаю? Любая помощь будет оценили!
FacesContext.метод addmessage(строки, FacesMessage) требуется компонент'ов ИД клиента, не он'ов ИД. Если вы'вновь задавался вопросом почему, думаешь о том, чтобы контролировать, как ребенок из объекта DataTable, штамповка из различных значений с элементами управления для каждой строки - можно было бы иметь другое сообщение, напечатанное для каждой строки. В ИД всегда одинакова; параметр ClientID является уникальным для каждой строки.
Так что "ссылки:объект mybutton" это правильное значение, но жестко это неразумно. Поиск создавало бы меньше сцепление между представлением и бизнес-логикой и будет подход, который работает в более ограничительных условиях, таких как портлеты.
<f:view>
<h:form>
<h:commandButton id="mybutton" value="click"
binding="#{showMessageAction.mybutton}"
action="#{showMessageAction.validatePassword}" />
<h:message for="mybutton" />
</h:form>
</f:view>
Управляемые логикой фасоли:
/** Must be request scope for binding */
public class ShowMessageAction {
private UIComponent mybutton;
private boolean isOK = false;
public String validatePassword() {
if (isOK) {
return "ok";
}
else {
// invalid
FacesMessage message = new FacesMessage("Invalid password length");
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(mybutton.getClientId(context), message);
}
return null;
}
public void setMybutton(UIComponent mybutton) {
this.mybutton = mybutton;
}
public UIComponent getMybutton() {
return mybutton;
}
}
В случае, если кому любопытно, я был в состоянии понять это, основываясь на всех ваших ответах сочетается!
Это в facelet, приведенный:
<h:form id="myform">
<h:inputSecret value="#{createNewPassword.newPassword1}" id="newPassword1" />
<h:message class="error" for="newPassword1" id="newPassword1Error" />
<h:inputSecret value="#{createNewPassword.newPassword2}" id="newPassword2" />
<h:message class="error" for="newPassword2" id="newPassword2Error" />
<h:commandButton value="Continue" action="#{createNewPassword.continueButton}" />
</h:form>
Это в continueButton() метод:
FacesContext.getCurrentInstance().addMessage("myForm:newPassword1", new FacesMessage(PASSWORDS_DONT_MATCH, PASSWORDS_DONT_MATCH));
И это работает! Спасибо за помощь!
Вы также должны включить Код_формы в вызове метод addmessage().
FacesContext.getCurrentInstance().addMessage("myform:newPassword1", new FacesMessage("Error: Your password is NOT strong enough."));
Это должно сделать трюк.
Привет.
Помните, что:
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage( null, new FacesMessage( "The message to display in client" ));
также является допустимым, ведь когда нуль указывается в качестве первого параметра, он наносится на всю форму.
Подробнее: coreservlets.com //устаревших
JSF-это зверь. Может я что-то упускаю, но я привык решать подобные проблемы, сохранив нужные сообщения на имущество в зернах и вывода имущества через outputText:
<h:outputText
value="#{CreateNewPasswordBean.errorMessage}"
render="#{CreateNewPasswordBean.errorMessage != null}" />
Нашел это а погуглить. Второй пост делает точку о различных этапах в JSF, что может быть причиной сообщения об ошибке, чтобы затеряться. Кроме того, попробуйте нуль на месте на "новый_пароль и" потому что вы не имеете какого-либо объекта с идентификатором новый_пароль.
Я попытался это как предположение, но не повезло:
Он смотрит прямо на меня. Вы пробовали настройки явно серьезность сообщение? Также я считаю, что идентификатор должен быть таким же, как компонента (т. е., вы'd нужен для использования newPassword1 или newPassword2, если это ваши документы, и не новый_пароль как у вас в Примере).
FacesContext.getCurrentInstance().addMessage("newPassword1",
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error Message"));
Затем используйте <H:сообщения для=на"newPassword1-то" />
чтобы отобразить сообщение об ошибке на странице JSF.
Простой ответ, если вы не'т нужна, чтобы привязать его к определенному компоненту...
Ява:
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Authentication failed", null);
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, message);
В XHTML:
<h:messages></h:messages>