当前位置: 首页 > 面试题库 >

PrimeFaces日历接受无效日期作为输入

盖泽宇
2023-03-14
问题内容

我遇到的问题是PrimesFaces 3.4.1日历。当使用通过按钮或在输入字段焦点上激活的弹出日期选择器时,您只能选择有效的日期,该日期很好,很开心!

当您在输入字段中手动添加日期时,就会出现问题,如果您添加了无效日期,PrimeFaces日历组件会尽最大的努力将其转换为有效日期然后发送,这意味着后端验证是不可行的。以下是一些有趣的翻译:

  • 30/02/2012变成2/6/2014
  • 322/05/2012变为5/10/2038
  • 由01/14/2012变为4/1/2012

要重现这种疯狂,请查看PrimeFaces日历展示柜。

我已经看到使用该readOnlyInput='true'属性的解决方案,但这似乎只能防止在字段中输入字母,而不是数字或斜杠。以下是我实现的日历的一个实例:

<p:calendar id="fldDateOfBirth"
            value="#{pc_CreateUser.user.dateOfBirth}"
            binding="#{pc_CreateUser.dobComp}"
            navigator="true"
            pattern="dd/MM/yyyy"
            maxlength="10"
            yearRange="-100"
            validator="#{pc_CreateUser.validateDOB}"
            title="#{msg.user_date_format_default_tip}"
            converterMessage="#{msg.user_error_dob_invalid}"
            readOnlyInput="true"
            showOn="button" />

解决方案方面,我愿意接受任何建议:

  1. 这是PrimeFaces中的常见问题吗?有什么技巧可以解决吗?
  2. 我可以使用JavaScript在发送日期之前验证日期还是完全阻止所有用户输入?
  3. 还有我没想到的!

在此先感谢您,这已经使我遇到了数周的问题!


问题答案:

<p:calendar>封面下使用SimpleDateFormat其默认情况下又使用宽松的解析,导致溢出值,以滚动到下一个日期度量水平。例如1月32日将变成2月1日,依此类推。

在普通的Java而言,这可以通过关闭DateFormat#setLenient(),传球false

用JSF术语,您基本上需要提供一个使用non-
lenient的自定义转换器DateFormat。幸运的是,标准的JSF已经提供了开箱即用的功能<f:convertDateTime>,因此您可以直接使用它。

<p:calendar ...>
    <f:convertDateTime pattern="dd/MM/yyyy" />
</p:calendar>


 类似资料:
  • 我想验证用户输入的日期是否有效,格式是否正确。我使用这个块来检查用户的输入,但是当我输入一个无效的日期时,打印语句会给我奇怪的输出。 当是时,它打印

  • 我想验证用户输入的日期是否有效,格式是否正确。我使用这个块来检查用户的输入,但是当我输入无效日期时,print语句会给我奇怪的输出。 当是时,它打印

  • 我有一个java代码,以特定的格式输入日期。 现在我输入的是无效日期。但它返回的日期是2016年1月14日星期四18:31:30。为什么会这样?如何使其返回null作为日期?

  • 我试图将用户输入转换为datetime值,但它在shell脚本中给出了无效的日期错误 $5用户正在输入2015年12月3日$6用户正在输入00:10:00

  • 问题内容: 我正在尝试写一个允许我采用多种不同格式的格式,然后将格式转换为特定类型。由于项目的范围和已经存在的代码,我不能使用其他类型的格式化程序。 例如,我也想接受,但是当我打印时,我只想打印格式化并在我打电话时使用该格式 有人可以就如何使用 这是我的方法: 我没有在网上找到一个很好的/可行的例子。 问题答案: 我已经测试了这个 JDK 1.8.0_131为Mac OS X 和 JDK 1.8.