【问题标题】:two date fields - one loses its value, the other works两个日期字段 - 一个失去价值,另一个有效
【发布时间】:2021-01-27 16:23:26
【问题描述】:

我有一个带有两个日期输入字段的表单。名为 dateFrom 的第一个字段在页面重新加载时总是会丢失其值,而名为 dateTo 的第二个字段可以正常工作。当我填写这两个字段时,两个值都被传递给 UI Bean,并且都成功地用于过滤视图(项目列表)。 UI Bean 将这两个值存储在具有会话范围的 statusObject 中。

但是页面更新后,只有dateTo仍然被填满,而dateFrom一个是空的。我在值的 getter 和 settes 中添加了一些 System.out.println(),以查看会发生什么,并且两个 setter 都用一个值调用,然后两个 getter 都返回一个值。 dateFrom 字段只是忽略它从 UI Bean 获得的值。

我使用的是浏览器提供的日期字段,因此是 a:type="date"。

页面如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:a="http://xmlns.jcp.org/jsf/passthrough"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
<h:head/>

<h:body>
  <ui:composition>

    <f:loadBundle basename="de.myapp.Resources" var="bundle"/>

<!-- Some stuff removed for readability -->

    <h:form enctype="multipart/form-data" id="filterForm">
      <div class="filterBar">
        <div class="filterElement">
          <h:inputText a:type="date" id="dateFrom" size="8" maxlength="10"
                       value="#{myBean.dateFrom}"
                       converter="dateConverter"/>
        </div>
        <div class="filterElement">
          <h:inputText a:type="date" id="dateTo" size="8" maxlength="10"
                       value="#{myBean.dateTo}"
                       converter="dateConverter"/>
        </div>
      </div>
      <div class="filterElement">
        <h:commandButton id="refreshButton"
                         action="#{myBean.refreshList}"
                         value=" #{bundle.refresh}"/>
      </div>

    </h:form>

<!-- Some more stuff removed for readability -->

  </ui:composition>
</body>
</html>

我检查了 dateFromdateTo 这两个词确实出现在我已删除的页面部分中。 p>

UI Bean 中的获取器和设置器

public Date getDateFrom() {
  System.out.println("getDateFrom() -> " + statusObjet.getDateFrom());
  return statusObjet.getDateFrom();
}

public void setDateFrom(final Date dateFrom) {
  if (dateFrom != null) {
    System.out.println("setDateFrom( " + dateFrom + " )");
  } else  {
    System.err.println("setDateFrom( NULL )"); // my IDE shows this colored red in the console
  }
  statusObjet.setDateFrom(dateFrom);
}

public Date getDateTo() {
  System.out.println("getDateTo() -> " + statusObjet.getDateTo());
  return statusObjet.getDateTo();
}

public void setDateTo(final Date dateTo) {
  if (dateTo != null) {
    System.out.println("setDateTo( " + dateTo + " )");
  } else {
    System.err.println("setDateTo( NULL )"); // my IDE shows this colored red in the console
  }
  statusObjet.setDateTo(dateTo);
}

除了 ID 和值 EL 之外,这两个字段都是相同的。 Getter 和 setter 也是相同的(我已经仔细检查过)。事实上,dateTo 的所有代码都是 dateFrom 的副本,复制后在编辑器中进行了更改(在选择中全部替换)。

为什么 dateTo 有效,而 dateFrom 无效?

【问题讨论】:

  • 我在您发布的代码中看不到任何会导致该问题的明显问题。问题可能出在您调用方法 getDateFrom()setDateFrom() 的代码的不同部分
  • 这也是我一开始的怀疑。这就是我添加System.out.println() 的原因之一。代码的任何其他部分都没有 setter 访问权限。

标签: jsf datefield


【解决方案1】:

原来问题不在于日期字段,而是输入的日期(以及 dateConverter 中的一个缺陷):

我一直使用同一年的 1 月 1 日12 月 31 日 测试表单。

知道浏览器提供的日期输入使用取决于浏览器语言而不是网站语言的日期格式,我编写了一个 dateConverter 来理解最重要的格式,所有这些格式都带有和不带前导零的一位数价值观。
缺陷是它的getAsString() 返回了一个没有前导零的日期格式,并且浏览器不理解例如2019 年 1 月 1 日

解决方案:使用单独的 DateFormat 强制 getAsString() 使用前导零并返回 2019-01-01

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    相关资源
    最近更新 更多