【发布时间】:2015-06-11 09:06:09
【问题描述】:
我正在使用 Primefaces 5.2、JSF 2.2.10 和 Tomcat 7.0。
我有一个用户页面,其中包含其个人数据,以及一个允许该用户通过对话框更改其密码的按钮。
在页面中,我在对话框中使用了一个 p:messages 组件(id="messages")和其他 p:messages 组件(id="messagesDialog")。
要更改密码,用户必须输入当前密码和新密码。
当对话框字段验证失败时,我想在对话框消息组件(“messagesDialog”)中显示错误,而不是在页面消息组件(“messages”)中显示错误。
我怎么能得到它?
我尝试在控制器中使用一个字段,当对话框打开时它为真,当它关闭时为假。页面消息(“消息”)具有该字段的渲染属性。但没有成功。
这是我正在使用的代码:
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,在你排队消息时提供 id
标签: jsf primefaces dialog duplicates messages