如何在转换器的JSF视图中使用java.sql.Timestamp

时间:2015-03-17 08:26:48

标签: java jsf jdbc timestamp converter

如何在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类型。

3 个答案:

答案 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或创建另一个模型来绑定视图,但它需要更多的工作。您需要将地图或模型映射器中的值放到实际模型中。

  1. 使用java.util.Map
  2. 这是示例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" />
    
    1. 创建另一个模型
    2. 与视图绑定的新模型示例:

      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" />
      

      这个解决方法不需要修改实际模型,尽管我们需要做其他事情来将值移动到实际模型。这对我来说很有用。希望它会有用。