如何在PrimeFaces java.sql.Timestamp
等JSF日期组件中使用类型为<p:calendar>
的模型属性?此组件需要java.util.Date
的实例作为其输入,它还将返回相同类型的java.util.Date
。
是否可以为此案例创建转换器?如何实施转换器以将java.sql.Timestamp
转换为java.util.Date
?我想我需要一个带有getAsObject()
和getAsString()
的JSF转换器,但我不知道我应该在哪里进行转换?
实际上,在这种情况下,List<Model>
会显示<p:dataTable>
。在每一行中,我可以直接从表中设置startDate和endDate。所以我需要在save()
过程中直接使用model属性从表中获取最新/更新的数据。
这是我模特的样本:
public class Model {
private Timestamp startDate;
private Timestamp endDate;
public Timestamp getStartDate() {
return startDate;
}
public void setStartDate(Timestamp startDate) {
this.startDate = startDate;
}
public Timestamp getEndDate() {
return endDate;
}
public void setEndDate(Timestamp endDate) {
this.endDate = endDate;
}
}
这是我的bean的样本:
public class PageBean {
private List<Model> listModel;
public String save() {
// Process insert / update listModel to database here
return "next-page"
}
public List<Model> getListModel() {
return listModel;
}
public void setListModel(List<Model> listModel) {
this.listModel = listModel;
}
}
这是我的xhtml示例:
<p:dataTable value="#{pageBean.listModel}" var="model" >
<p:column headerText="Start Date">
<p:calendar value="#{model.startDate}" pattern="dd-MMM-yyyy" ></p:calendar>
</p:column>
<p:column headerText="End Date">
<p:calendar value="#{model.endDate}" pattern="dd-MMM-yyyy" ></p:calendar>
</p:column>
</p:dataTable>
<p:commandButton value="Save" action="#{pageBean.save()}" ajax="false" />
我认为如果模型属性类型是java.util.Date
,可以直接使用模型,但我在这里得到java.sql.Timestamp
类型。
答案 0 :(得分:4)
您首先不应该在模型中具有持久层特定类型属性。您的模型应具有java.util.Date
属性。相反,应该更改持久层,以便能够处理java.util.Date
模型属性。
改为在持久层中进行转换。
preparedStatement.setTimestamp(i, new Timestamp(model.getDate().getTime()));
由于java.sql.Timestamp
已经是java.util.Date
的子类,因此没有必要采用相反的方法。
答案 1 :(得分:1)
您可以将时间戳委托给日期,反之亦然。
import java.sql.Timestamp;
import java.util.Date;
...
private Timestamp timestamp;
...
public Timestamp getTimestamp() {
return timestamp;
}
public void setTimestamp(Timestamp timestamp) {
this.timestamp = timestamp;
}
public Date getDate() {
return timestamp == null ? null : new Date(timestamp.getTime());
}
public void setDate(Date date) {
timestamp = date == null ? null : new Timestamp(date.getTime())
}
JSF:
<p:calendar id="button" value="#{bean.date}" showOn="button" />
答案 2 :(得分:0)
最佳做法是创建一个由持久层类型分隔的模型,如@BaulusC所述。但我找到了一个适合我的情况的解决方案(实际上是一个技巧),即使用java.util.Map
或创建另一个模型来绑定视图,但它需要更多的工作。您需要将地图或模型映射器中的值放到实际模型中。
java.util.Map
这是示例bean:
public class PageBean {
private List<Model> listModel;
private List<Map> listMap;
public String save() {
// Move the values from listMap to listModel
listModel = new ArrayList<Model>();
for (Map map : listMap) {
Model model = new Model();
model.setStartDate(new Timestamp(((Date) map.get("startDate")).getTime());
model.setEndDate(new Timestamp(((Date) map.get("endDate")).getTime());
listModel.add(model);
}
// Process listModel to database ...
return "next-page"
}
public List<Map> getListMap() {
return listMap;
}
public void setListMap(List<Map> listMap) {
this.listMap = listMap;
}
}
在xhtml页面中,我们使用listMap
作为<p:dataTable>
值:
<p:dataTable value="#{pageBean.listMap}" var="map" >
<p:column headerText="Start Date">
<p:calendar value="#{map.startDate}" pattern="dd-MMM-yyyy" ></p:calendar>
</p:column>
<p:column headerText="End Date">
<p:calendar value="#{map.endDate}" pattern="dd-MMM-yyyy" ></p:calendar>
</p:column>
</p:dataTable>
<p:commandButton value="Save" action="#{pageBean.save()}" ajax="false" />
与视图绑定的新模型示例:
public class ModelMapper {
private Date startDate;
private Date endDate;
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
}
在bean中:
public class PageBean {
private List<Model> listModel;
private List<ModelMapper> listModelMapper;
public String save() {
// Move the values from listModelMapper to listModel
listModel = new ArrayList<Model>();
for (ModelMapper modelMapper : listModelBinder) {
Model model = new Model();
model.setStartDate(new Timestamp(modelMapper.getStartdate().getTime());
model.setEndDate(new Timestamp(modelMapper.getEndDate().getTime());
listModel.add(model);
}
// Process listModel to database ...
return "next-page"
}
public List<ModelMapper> getListModelMapper() {
return listModelMapper;
}
public void setListModelMapper(List<ModelMapper> listModelMapper) {
this.listModelMapper = listModelMapper;
}
}
在xhtml页面中,我们使用listModelMapper
作为<p:dataTable>
值:
<p:dataTable value="#{pageBean.listModelMapper}" var="mapper" >
<p:column headerText="Start Date">
<p:calendar value="#{mapper.startDate}" pattern="dd-MMM-yyyy" ></p:calendar>
</p:column>
<p:column headerText="End Date">
<p:calendar value="#{mapper.endDate}" pattern="dd-MMM-yyyy" ></p:calendar>
</p:column>
</p:dataTable>
<p:commandButton value="Save" action="#{pageBean.save()}" ajax="false" />
这个解决方法不需要修改实际模型,尽管我们需要做其他事情来将值移动到实际模型。这对我来说很有用。希望它会有用。