如何在JSF中显示我的应用程序的错误?

在我的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> 

我希望能够根据continueButton()方法中发生的事件将错误分配给特定的h:message标记。 需要为newPassword和newPassword2显示不同的错误。 validation程序不会真正起作用,因为将传递结果(从数据库)的方法在continueButton()方法中运行,并且运行两次的代价太高。

我不能使用h:messages标记,因为页面有多个地方,我需要显示不同的错误信息。 当我尝试这个时,页面显示每个消息的重复。

我试过这个最好的猜测,但没有运气:

 public Navigation continueButton() { ... expensiveMethod(); if(...) { FacesContext.getCurrentInstance().addMessage("newPassword", new FacesMessage("Error: Your password is NOT strong enough.")); } } 

我错过了什么? 任何帮助,将不胜感激!

FacesContext.addMessage(String,FacesMessage)需要组件的clientId而不是 id 。 如果你想知道为什么,考虑把控件当作数据表的子元素,用每行的相同控件标出不同的值 – 可以为每行打印不同的消息。 id始终是一样的; clientId每行都是唯一的。

所以“myform:mybutton”是正确的值,但硬编码是不明智的。 查找会在视图和业务逻辑之间创build更less的耦合,并且会成为一种在更加严格的环境(如portlet)中工作的方法。

 <f:view> <h:form> <h:commandButton id="mybutton" value="click" binding="#{showMessageAction.mybutton}" action="#{showMessageAction.validatePassword}" /> <h:message for="mybutton" /> </h:form> </f:view> 

托pipe的bean逻辑:

 /** 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()中包含FormID。

  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" )); 

也是有效的,因为当null被指定为第一个参数时,它被应用到整个表单中。

更多信息: coreservlets.com //过时

在Google上find这个 。 第二篇文章对JSF的不同阶段提出了一个观点,这可能会导致您的错误信息丢失。 此外,请尝试null来代替“newPassword”,因为您没有任何具有id newPassword的对象。

JSF是一个野兽。 我可能会丢失一些东西,但我曾经通过将所需的消息保存到bean的属性,然后通过outputText显示属性来解决类似的问题:

 <h:outputText value="#{CreateNewPasswordBean.errorMessage}" render="#{CreateNewPasswordBean.errorMessage != null}" /> 

我试过这个最好的猜测,但没有运气:

它看起来是对的我。 您是否尝试过明确设置消息严重性? 此外,我相信ID需要与组件的相同(即,如果这些是您的ID,而不是像示例中那样使用newPassword,则需要使用newPassword1或newPassword2)。

 FacesContext.getCurrentInstance().addMessage("newPassword1", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error Message")); 

然后使用<h:message for="newPassword1" />在JSF页面上显示错误消息。