JSF-1个组件中的验证错误导致表单中的所有其他组件失败



大家好,论坛

我使用JSF Mojarra实现,JSF 2.2 版本

在这件事上我急需帮助。

  1. 我有一个页面的片段
  2. 我有一个自定义组件";example_result.xhtml";在页面中使用
  3. 我有我的BackingBean.java请注意,这个代码不是我制作的真正代码。如果你运行它,它会非常难看,可能是因为我删除了所有的css类,只保留了我需要向你展示我的问题的热门内容

所有东西都在1表单内。

;h: select Many复选框";(在我的代码中,我有8或9个)

在该形式中;h: select Many复选框";其使用";值";属性(javaFrameworks2Values,javaFrameworks3Values,…),以及;f: selectItems"使用";选择项目";(javaFrameworksSelectItems2,javaFrameworksSelectItems3…),只是为了给我举一些例子,让我了解所有selectOne和selectMany组件是如何工作的。关于不同案例的想法来自以下链接:"https://stackoverflow.com/tags/selectonemenu/info"one_answers"https://mkyong.com/jsf2/jsf-2-checkboxes-example"。

在我有两个命令之后按钮

1用于提交,1用于重置值。

显示值

在我显示";h: select Many复选框";通过";example_result.xhtml";。

你可以看到第四个";h: select Many复选框";这是唯一不同的,因为它具有属性";"必需";具有属性";requiredMessage";。有了它;h: 消息";以显示验证错误。

在BackingBean(这是Spring Bean,但它运行得非常好——对不起,我不想要ejb 3.x)中,我已初始化:

  1. SelectItems和
  2. ";值";属性,其中";h: select Many复选框";将被存储以稍后显示。[为了使代码片段可读,代码被完全阉割了]

当页面被呈现时,我从所有";h: 选择Many复选框";。当我说从所有人中选择时,我是认真的;"必需";属性我试着在按钮中(参见代码中的)";作用力1";,或";作用力2";,或";努力3";(在按钮中的"f:ajax"中),最后一部分中的结果输出将像糖果一样显示和更新。没有任何问题。为了用复合组件实现这一点,我在谷歌上搜索并尝试了很多。但我成功了。

然后到了尝试第4次以查看";"必需";属性

我像以前一样再次从所有中选择,但不是从所有中。NOT from the 4th";h: select Many复选框";这次。我从第4个";h: select Many复选框";以确认验证器错误消息("requiredMessage")。结果是:它显示错误的消息(到现在为止很好),但这次它不更新来自其他人的任何信息";h: select Many复选框";到最后的输出结果,它不会像以前那样重置值(当我从所有值和第4个值中选择时)。

据我所知,它说:只要在表格中第4个因验证错误而失败,所有其他";h: select Many复选框";不会更新输出结果(类似于希望其他所有结果也失败)。

但这里到底发生了什么?

  1. 它不给";h: 选择ManyCheckbox";,更新为输出
  2. 它赋予了";h: select Many复选框";正常情况下,但它只是不更新输出

;f: ajax";在按钮中,可能只是为了解决问题,但在这些情况下,它们甚至不会在第4种情况下显示错误消息,当然也不会(再次)更新其他输出结果。但也没有消息错误。

我不知道你是否清楚这个问题。我可以在讨论中更好地解释,这样我就可以更好地澄清情况。[我花了1个半小时才写完这一切]

提前感谢

======我的页面中的代码段======

<h:form>
<h:panelGrid id="smcb" columns="1">

<h:selectManyCheckbox id="smcb1" value="#{myBackingBean.javaFrameworksHardCodedValues}">
<f:selectItem itemLabel="Java Label" itemValue="Java Value"/>
<f:selectItem itemLabel="Spring Framework Label" itemValue="Spring Framework Value"/>
<f:selectItem itemLabel="Hibernate Label" itemValue="Hibernate Value"/>
<f:selectItem itemLabel="JSF Framework Label" itemValue="JSF Framework Value"/>
</h:selectManyCheckbox>

<h:selectManyCheckbox id="smcb2" value="#{myBackingBean.javaFrameworks2Values}">
<f:selectItems value="#{myBackingBean.javaFrameworksSelectItems2}"/>
</h:selectManyCheckbox>

<h:selectManyCheckbox id="smcb3" value="#{myBackingBean.javaFrameworks3Values}">
<f:selectItems value="#{myBackingBean.javaFrameworksSelectItems3}"/>
</h:selectManyCheckbox>

<p><h:message for="smcb4" styleClass="error_messages"/></p>
<h:selectManyCheckbox id="smcb4" value="#{myBackingBean.javaFrameworks4Values}"
required="true"
requiredMessage="The 'h:selectManyCheckbox' must have a value. Please select an item from the list!">
<f:selectItems value="#{myBackingBean.javaFrameworksSelectItems4}"/>
</h:selectManyCheckbox>

<h:selectManyCheckbox id="smcb5" value="#{myBackingBean.javaFrameworks5Values}">
<f:selectItems value="#{myBackingBean.javaFrameworksSelectItems5}"/>
</h:selectManyCheckbox>

</h:panelGrid>
<br/>

<h:commandButton value="Display Java Frameworks values">
<!--
Effort 1 - works perfectly good if I select from all the "h:selectManyCheckbox"
<f:ajax execute="smcb1 smcb2 smcb3 smcb4 smcb5 smcb6 smcb7 smcb8"
render="outputId1 outputId2 outputId3 outputId4 outputId5 smcb1 smcb2 smcb3 smcb4 smcb5"/>
-->

<!--
Effort 2 - works perfectly good if I select from all the "h:selectManyCheckbox"
<f:ajax execute="smcb" render="outputId smcb"/>
-->

<!--
Effort 3 - works perfectly good if I select from all the "h:selectManyCheckbox"
<f:ajax execute="@form" render="@form"/>
-->

<!--
Not working efforts to solve my problem - but are not solving it
<f:ajax execute="@form" render="outputId"/>-->
<f:ajax execute="@form"
render="outputId1 outputId2 outputId3 outputId4 outputId5 smcb1 smcb2 smcb3 smcb4 smcb5"/>
Other combinations with the @form and the ids...
-->
</h:commandButton>
<h:commandButton value="Reset Java Frameworks values" action="#{myBackingBean.resetValues}">
<!--
Effort 1 - works perfectly good if I select from all the "h:selectManyCheckbox"
<f:ajax execute="smcb1 smcb2 smcb3 smcb4 smcb5"
render="outputId1 outputId2 outputId3 outputId4 outputId5 smcb1 smcb2 smcb3 smcb4 smcb5"/>
-->

<!--
Effort 2 - works perfectly good if I select from all the "h:selectManyCheckbox"
<f:ajax execute="smcb" render="outputId smcb"/>
-->

<!--
Effort 3 - works perfectly good if I select from all the "h:selectManyCheckbox"
<f:ajax execute="@form" render="@form"/>
-->
</h:commandButton>
<br/>

<h:panelGrid columns="1" id="outputId">
<mc:example_result id="outputId1"
example_label="1. Java Frameworks hardcoded with 'f:selectItem': "
example_result="#{myBackingBean.displayItemValues()}"/>

<mc:example_result id="outputId2"
example_label="2. Java Frameworks 2: "
example_result="#{myBackingBean.displayItemValues()}"/>

<mc:example_result id="outputId3"
example_label="3. Java Frameworks 3: "
example_result="#{myBackingBean.displayItemValues()}"/>

<mc:example_result id="outputId4"
example_label="4. Java Frameworks 4: "
example_result="#{myBackingBean.displayItemValues()}"/>

<mc:example_result id="outputId5"
example_label="5. Java Frameworks 5: "
example_result="#{myBackingBean.displayItemValues()}"/>
</h:panelGrid>
</h:form>

==============我的组件:"example_result.xhtml"===========

<ui:composition ...
xmlns:mc="http://xmlns.jcp.org/jsf/composite/mc_components">

<cc:interface>
<cc:attribute name="example_label" type="java.lang.String" required="true"/>
<cc:attribute name="example_result" type="java.lang.String" required="true"/>
</cc:interface>

<cc:implementation>
<div id="#{cc.clientId}">
<h:outputText value="#{cc.attrs.example_label}" .../>
<h:outputText value="#{cc.attrs.example_result}" .../>
</div>
</cc:implementation>
</ui:composition>

==============我的BackingBean:"MyBackingBean.java

@org.springframework.stereotype.Component(value = "myBackingBean")
public class MyBackingBean implements Serializable {

// Variables used in the "value" attribute of "HtmlSelectMany" components
private String[] javaFrameworks2Values; // + Getters-Setters
// All the others: javaFrameworks3Values, ...

// The "HtmlSelects" components' "SelectItems" are generated by an array of "SelectItem"
private SelectItem[] javaFrameworksSelectItems2; // +Getters
// All the others: javaFrameworksSelectItems3, ...


@PostConstruct
protected void initLabelValueMapAndLabelValueArray() {

// Pre-selected values of "HtmlSelectMany" components
javaFrameworks2Values = new String[]{"Java Value", "Spring Framework Value"};

// Initialization of the array of "SelectItem"
javaFrameworksSelectItems2 = new SelectItem[4];
javaFrameworksSelectItems2[0] = new SelectItem("Java Value", "Java Label");
javaFrameworksSelectItems2[1] = new SelectItem("Spring Framework Value", "Spring Framework Label");
javaFrameworksSelectItems2[2] = new SelectItem("Hibernate Value", "Hibernate Label");
javaFrameworksSelectItems2[3] = new SelectItem("JSF Framework Value", "JSF Framework Label");

// Initialization of all the others: javaFrameworks3Values, ..., javaFrameworksSelectItems3, ...
}

public String displayItemValues() {
// return array of the result values;
}

public void resetValues() {
// Reset the values to the initials
}
}

在与唯一一个想在这里帮助我的人讨论了很多之后(我非常感谢他@WoAiNii),我决定发布我的解决方案:

我将用5组按钮(提交/重置)制作5个不同的表格,以使这个问题升级,针对表格中的5个如此多的相关组件。

但我的问题是悬而未决的:为什么会发生这种情况,在这种情况下JSF中发生了什么规则,并造成了这种情况。任何人,只要有解释,比如:

  • 这是JSF中的一条规则,或者
  • 是JSF错误,或者
  • 这种情况会发生,或者。。。不管怎样

我很高兴在这里读到它,这样我会学得更好,其他人也会从你的这些想法中学习。非常感谢

相关内容

  • 没有找到相关文章

最新更新