【问题标题】:Accepting the form submission with not selecting any radio button在不选择任何单选按钮的情况下接受表单提交
【发布时间】:2012-11-09 21:48:10
【问题描述】:

我正在使用 JSF 1.2 和 Seam 框架使用 Java EE 编写应用程序。我有一个从单选按钮输入的表单,如下所示:

<h:selectOneRadio value="#{testAction.selectedOptionId}"
                 id="selectedQuestionOption"
                 layout="pageDirection">
    <s:selectItems var="selectedOption" value="#{currentQuestion.options}"
                   label="#{selectedOption.optionString}"
                   itemValue="#{selectedOption.optionId}"/>
 </h:selectOneRadio>

 <h:commandButton id="goToNextQuestion" value="Submit"
                 action="#{testAction.postAnswer}"/>

我想要这样,如果有人在没有选择单选按钮的情况下提交表单,我会接受结果,但它不起作用。因为在验证阶段 jsf 拒绝提交并导致验证错误。我试图为它编写一个自定义验证器,不幸的是这对我也不起作用。

有什么建议吗?

【问题讨论】:

  • 什么是验证错误。我看不到您在这里使用验证。您能否提供堆栈跟踪中的相关行和setSelectedOptionId() 方法的签名。
  • 在jsf中提交表单后(称为postback),会合并不同的生命周期事件,如绑定值、验证。并且这些阶段事件在任何正常流程中执行,然后再调用我们的应用程序逻辑代码所在的应用程序阶段。事情是单选按钮验证器在没有选择单选按钮时拒绝值并再次重定向到表单。
  • 只有在&lt;h:selectOneRadio&gt; 上有required="true" 时才会出现所述问题,但您没有。到目前为止,代码看起来还不错。这对我来说可以。问题是在其他地方引起的。 SSCCE 会有很大帮助。
  • 感谢@BaluC!是的,当require="true" 时应该会出现问题,但就我而言,我不明白为什么会这样。但我找到了解决办法。

标签: validation jsf seam jsf-1.2 selectoneradio


【解决方案1】:

我没有通过编写自定义验证器来解决这个问题,这在这种情况下应该是理想的解决方案。但我找到了解决这种情况的方法。我可以通过设置提交按钮的immediate = "true" 来绕过绑定值和验证阶段,如下所示:

 <h:commandButton id="goToNextQuestion" value="Submit" immediate="true"
             action="#{testAction.postAnswer}"/>

通过这样做跳过后续阶段,servlet 将转到调用应用程序阶段,并且将应用您的应用程序逻辑,并且当您跳过处理阶段时,来自您的发布请求的数据将不会绑定到您的 bean。因此,在使用这些 bean 之前,您应该从 RequestParameterMap 中读取它们的值,就像我在下面所做的那样(在我的情况下):

    Map<String, String> paramMap = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();

    for (String key : paramMap.keySet()) {
        //log.info("Param: " + key + " Value: " + paramMap.get(key));
        if (key.contains("selectedQuestionOption")) {
            //log.info("OptionParam: " + key + " Value: " + paramMap.get(key));
            selectedOptionId = Integer.parseInt(paramMap.get(key));
        }
    }

然后应用我真正的业务逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多