Я работаю с Primefaces 5.2, JSF 2.2.10 и Tomcat 7.0.
У меня есть страница пользователя с его личными данными и одна кнопка, которая позволяет этому пользователю изменить свой пароль через диалог.
На странице я использую компонент p:messages (с id="messages") и другой компонент p:messages (с id="messagesDialog") внутри диалогового окна.
Чтобы изменить свой пароль, пользователь должен ввести свой текущий пароль и новый.
Когда поля диалога не проходят проверку, я хотел бы показать ошибки внутри компонента диалоговых сообщений («messagesDialog»), но не в компоненте сообщений страницы («сообщения»).
Как я мог это получить?
Я пытался использовать поле внутри контроллера, которое истинно, когда диалоговое окно открыто, и ложно, когда оно закрыто. Сообщения страницы («сообщения») имеют атрибут rendered с этим полем. Но это не сработало.
Это код, который я использую:
XHTML-страница:
<p:messages id="messages" closable="true"
rendered="#{not userController.dialogChangePasswordOpened}" />
<h:form id="formUserData">
<p:outputPanel styleClass="panelGrey">
<!-- User data... -->
<p:panelGrid styleClass="noBorders">
<p:row>
<p:column styleClass="colLabel">
<p:outputLabel id="labelChangePassword" for="changePassword"
value="#{msg['label.password']}"></p:outputLabel>
</p:column>
<p:column styleClass="colInput">
<p:commandButton id="changePassword"
value="#{msg['user.changePassword']}"
actionListener="#{userController.openDialogChangePassword}"
update="messages formChangePassword">
</p:commandButton>
</p:column>
</p:row>
</p:panelGrid>
</p:outputPanel>
</h:form>
<!-- Dialog change password -->
<h:form id="formChangePassword">
<p:dialog id="dlgChangePassword" modal="true"
header="#{msg['user.changePassword.title']}"
widgetVar="dlgChangePassword" styleClass="popUpPassword" closable="false">
<p:messages id="messagesDialog" closable="true" autoUpdate="true"
globalOnly="false" />
<p:panelGrid styleClass="noBorders" id="panelChangePassword">
<p:row>
<p:column>
<p:outputLabel id="labelOldPassword" for="oldPassword"
value="#{msg['label.oldPassword']}" />
</p:column>
<p:column>
<p:password id="oldPassword"
value="#{userController.oldPassword}" required="true"
feedback="false">
<p:ajax update="messagesDialog" event="keyup"></p:ajax>
</p:password>
</p:column>
</p:row>
<p:row>
<p:column>
<p:outputLabel id="labelNewPassword" for="newPassword"
value="#{msg['label.newPassword']}" />
</p:column>
<p:column>
<p:password id="newPassword"
value="#{userController.newPassword}"
match="checkNewPassword"
required="true" feedback="true">
</p:password>
</p:column>
</p:row>
<p:row>
<p:column>
<p:outputLabel id="labelCheckNewPassword" for="checkNewPassword"
value="#{msg['label.checkNewPassword']}" />
</p:column>
<p:column>
<p:password id="checkNewPassword"
value="#{userController.newPassword}" required="true"
feedback="false">
</p:password>
</p:column>
</p:row>
<p:row>
<p:column rowspan="2">
<p:commandButton id="btnOK" value="#{msg['button.ok']}"
update="messages messagesDialog"
actionListener="#{userController.changePassword}">
</p:commandButton>
<p:commandButton id="btnCancel"
value="#{msg['button.cancel']}" immediate="true"
actionListener="#{userController.closeDialogChangePassword}" />
</p:column>
</p:row>
</p:panelGrid>
</p:dialog>
</h:form>
Пользовательский контроллер:
private boolean dialogChangePasswordOpened;
public boolean isDialogChangePasswordOpened() {
return dialogChangePasswordOpened;
}
public void setDialogChangePasswordOpened(boolean dialogChangePasswordOpened) {
this.dialogChangePasswordOpened = dialogChangePasswordOpened;
}
public void openDialogChangePassword() {
dialogChangePasswordOpened = true;
resetChangePasswordFields();
RequestContext.getCurrentInstance().execute("PF('dlgChangePassword').show()");
}
public void closeDialogChangePassword() {
dialogChangePasswordOpened = false;
resetChangePasswordFields();
RequestContext.getCurrentInstance().execute("PF('dlgChangePassword').hide()");
}
public void resetChangePasswordFields() {
this.newPassword = "";
this.oldPassword = "";
}
public void changePassword(ActionEvent actionEvent){
try{
usuarioService.changePassword(this.userAuthenticated.getName(),this.oldPassword, this.newPassword);
FacesContext.getCurrentInstance().addMessage("messages",
new FacesMessage(FacesMessage.SEVERITY_INFO,
"Password has been changed correctly.", null));
closeDialogChangePassword();
} catch (Exception e) {
FacesContext.getCurrentInstance().addMessage("messagesDialog",
new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Error while changing the password.", null));
}
}
Спасибо.
messages
: он глобальный для всехFacesMessages
в очереди. Если вы хотите нацелить свои сообщения, вы должны использоватьmessage
, указав идентификатор, когда вы ставите сообщения в очередь. - person kolossus   schedule 11.06.2015