【问题标题】:Error message appearing twice错误信息出现两次
【发布时间】:2017-03-02 10:56:22
【问题描述】:

我正在学习 JSF,需要一些帮助。我正在尝试在页面中进行声明性验证,但是呈现的所需消息在 HTML 标记中出现了两次。

在我的托管 bean 中,我有一个 students 字段指向一个学生实体,该实体具有以下字段 firstNameotherNamessurName

这就是 Managed Bean 的样子:

@ViewScoped
public Class FormController implements Serializeble{
 private List<Student> students = new ArrayList<>();

  @PostConstruct
  public void init(){
   students.add(new Student());
   students.add(new Student());
    }

  //getters and setters
}

然后在我的 JSF 页面中,我的 bean 中有一个 ui:repeat 指向 students,并在输入字段上进行了声明式验证;

    <h:form>
      <table>
       <ui:repeat value="#{formController.students}" var="student">
        <tr>
         <td><p:outputLabel value="first name:"/></td>
         <td><p:inputText value="#{student.firstname}" 
                          required="true" 
                          requiredMessage="field cannot be blank"/></td>
         <td><p:messages/></td>
        </tr>

        <!--other input fields omitted to make code cleaner-->

       </ui:repeat>
      </table>
      <p:commandButton value="submit" 
                       action="#{formController.saveStudents()}"/>
    </h:form>

问题, 我面临的问题是,为 HTML 标记中的每个输入字段生成两次所需的消息,如下所示:

<span class="bf-message">
    <span class="bficon bficon-error-circle-o bf-message-icon" aria-hidden="true</span>
    <span class="bf-message-detail">this feild cant be left blank</span></span><br /><span class="bf-message">
    <span class="bficon bficon-error-circle-o bf-message-icon" aria-hidden="true"></span>
    <span class="bf-message-detail">this feild cant be left blank</span></span>


 //repeated likewise for all other input field required message,omitted to save space

这是我的开发环境

  • GlassFish 4.1.1
  • JSF 2.2
  • Primefaaces 6.0
  • NetBeans IDE。

补充一点细节,commandButtion 动作指向的支持 bean 方法没有 FacesMessage,实体类中的字段也没有验证注释。

【问题讨论】:

    标签: jsf primefaces jsf-2


    【解决方案1】:

    问题是您将&lt;p:messages /&gt; 嵌套在&lt;ui:repeat&gt; 中。由于ui:repeat 在呈现响应阶段会遍历您添加到列表中的所有学生,因此您最终会为您添加的每个学生提供一个消息组件。 p:messages 组件默认显示添加到 FacesContext 的所有消息(例如所有验证消息)。

    &lt;p:messages /&gt;移出&lt;ui:repeat&gt;,消息只会显示一次。

    另一个解决方案,如果您希望消息直接显示在inputText,将给inputText 组件一个id 属性并在您的&lt;p:messages /&gt; 中使用这个id 属性作为@ 987654334@ 属性。当然,这个id 必须是唯一的。 for 属性使messages 组件仅显示为此特定组件添加的消息。但是,这不适用于&lt;ui:repeat&gt;,因为ui:repeat 仅多次渲染组件,但实际上并未在组件树中创建多个组件。所以你必须为此使用&lt;c:forEach&gt;。不过请务必先阅读this introduction to JSTL tags in JSF

    <p:inputText id="#{student.id}" ... />
    <p:messages for="#{student.id}" />
    

    【讨论】:

    • @Kaizen 我不太确定你想用它来实现什么。你能详细说明一下吗?
    • 哦,拍摄,这是另一个问题错误的地方。回到你的。如果我要采用您的第二个解决方案,当ui:repeat 只是多次渲染相同的组件,但不在树中创建新组件时,我如何使用inputText 上的for 属性。我读了这个stackoverflow.com/q/19131583/7646476
    • @Kaizen 你说得对,我忘了。我用更正确的信息更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2017-02-02
    • 2014-02-21
    • 2019-11-21
    相关资源
    最近更新 更多