【问题标题】:Strange behavior of convertDateTime in JSFJSF 中 convertDateTime 的奇怪行为
【发布时间】:2012-05-25 07:52:42
【问题描述】:

我正在使用带有richfaces 的JSF。我正在使用核心 ip 的 convertDateTime 将 inputText 转换为 Date。

<h:inputText styleClass="datepicker" value="#{searchBean.creationDate}" id="inputfield">
  <f:convertDateTime pattern="yyyy-MM-dd" />
</h:inputText>

SearchBean 中的 creationDate 是 Java util Date 类型,我使用 jquery datpicker 填充输入字段。

问题是它不能正常工作。当我提交表单而不输入任何日期(空输入字段)时,一切正常。但是,当我选择日期时,调用不会到达 bean(在调试模式下测试过)。页面只是刷新自己,没有任何异常/在服务器端记录。

我已经实现了一个快速的LifeCycleListener,它显示了以下输出:

输入字段填满日期:

START PHASE RESTORE_VIEW(1)
END PHASE RESTORE_VIEW(1)
START PHASE APPLY_REQUEST_VALUES(2)
END PHASE APPLY_REQUEST_VALUES(2)
START PHASE PROCESS_VALIDATIONS(3)
END PHASE PROCESS_VALIDATIONS(3)
START PHASE UPDATE_MODEL_VALUES(4)
END PHASE UPDATE_MODEL_VALUES(4)
START PHASE INVOKE_APPLICATION(5)
END PHASE INVOKE_APPLICATION(5)
START PHASE RENDER_RESPONSE(6)
END PHASE RENDER_RESPONSE(6)

日期为空:

START PHASE RESTORE_VIEW(1)
END PHASE RESTORE_VIEW(1)
START PHASE APPLY_REQUEST_VALUES(2)
END PHASE APPLY_REQUEST_VALUES(2)
START PHASE PROCESS_VALIDATIONS(3)
END PHASE PROCESS_VALIDATIONS(3)
START PHASE RENDER_RESPONSE(6)
END PHASE RENDER_RESPONSE(6)

很明显,在第二种情况下缺少两个步骤。我对 JSF 很陌生,对它的内部工作没有太多了解。此外,没有验证/转换异常。我被困在这里,我不知道在哪里寻找解决方案。任何帮助表示赞赏。

【问题讨论】:

    标签: java richfaces jsf-1.2


    【解决方案1】:

    当您不输入日期时,更新模型和调用应用程序未显示的原因是因为您的验证失败,如果验证失败,模型未更新 UI 内容和应用程序逻辑(您的自定义代码)将不会被调用。

    如果您在 .properties 文件中添加了错误消息,请添加以下内容

    javax.faces.converter.DateTimeConverter.DATE=value ({0}) must be a date
    

    否则

    <h:inputText styleClass="datepicker" value="#{searchBean.creationDate}" id="inputfield" converterMessage="Please Enter creation date in yyyy-MM-dd format">
      <f:convertDateTime pattern="yyyy-MM-dd" />
    </h:inputText>
    

    这可以在验证失败时显示错误消息。

    当您提交 null 作为日期时,您将收到转换错误。

    【讨论】:

    • 什么样的验证。在这种情况下不应该抛出一个可见的异常吗?
    • @UmerHayat 您还需要在页面中指定消息显示。在页面中使用&lt;h:messages globalOnly="false"/&gt; 或使用&lt;h:message for="&lt;your component id&gt;"/&gt; 然后只有它会显示在页面中
    • 非常感谢,对调试问题很有帮助:)
    【解决方案2】:

    如果您使用的是 JSF 1.2 和 RichFaces 3.x,则使用 rich:calendar 标记组件来处理日期,它在后台使用 jquery 来显示。在您的示例中使用它:

    <rich:calendar id="calCreationDate" popup="true"
        value="#{searchBean.creationDate}"
        enableManualInput="true"
        locale="#{application.locale}"
        datePattern="#{application.datePattern}"
        showApplyButton="false" />
    

    在我的应用程序中:

    public class ApplicationBean {
        private Locale locale;
        private String datePattern;
    
        public ApplicationBean() {
            locale = new Locale("es"); //for spanish
            datePattern = "dd/MM/yyyy"; //you can change it to yyyy-MM-dd
        }
    }
    

    ApplicationBean 有 ApplicationScope。

    更多信息在这里:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 2013-12-15
      • 2012-09-03
      • 2011-08-13
      • 2012-12-22
      相关资源
      最近更新 更多