【发布时间】: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>
我检查了 dateFrom 和 dateTo 这两个词确实不出现在我已删除的页面部分中。 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 访问权限。