由于datetime-local插入类型与数据库后端实体类Order中两个date类型字段createTime、endTime不匹配,就会出现日期格式和转换错误。
因为datetime-local插入类型的数据中,包含T,格式如下:
yyyy-MM-ddTHH:mm:ss
而此时插入数据库后端Date类型数据的时候就会报错(因为T的存在)
因此可以采用以下方法解决:
第一步:修改JSP页面
由于当input中name的属性值名字与实体pojo中的属性名一致的时候,SSM框架会帮我们自动封装对象。我们可以采取手动封装,所以我们这里的name属性中的属性值不与pojo实体类中的属性名一致。
<%此处只列举核心部分%>
<td>开单时间:</td>
<td><input type="datetime-local" step="1" name="cTime"/></td>
<td>结账时间:</td>
<td><input type="datetime-local" step="1" name="eTime"/></td>
第二步:修改Conteller
我们从JSP页面中根据刚才的属性值把内容取出,然后进行字符串截substring(起始位值,结束位置),把“T”去掉,再把年月日时分秒重新合并成新的字符串。接着按照要求把这两个字符串类型的变量转换成Date类型再封装到实体对象中。另外也可以直接用字符串的replaceAll(“要被替换的字符”,“替换成什么”)方法来把T替换成空格。
//此处只列举核心部分 代码不全
@RequestMapping("/addOrder")
public String doInsert(Order order,Model model,String cTime,String eTime) throws ParseException {
cTime=cTime.substring(0,10)+" "+cTime.substring(11,19);//截取方法
eTime=eTime.replaceAll("T", " ");//替换方法
order.setCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(csTime));
order.setEndTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(eTime));
/*其余基础操作代码此处略*/
}
实体类Order相关Date日期类型属性要使用注解 @DateTimeFormat
public class Order {
private Integer orderId;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
//此处get set 和toString 方法不列举 但要写
}
如果input使用date类型就不会出现上述错误,此时name属性的属性值直接与实体类中的属性名对应即可(框架自动封装。