Wicket 8 DateTextField设为type=date后无法自动更新显示求助
解决Wicket DateTextField改为HTML5 type="date"后不显示日期的问题
这个问题的核心原因很明确:HTML5的<input type="date">要求value属性必须是ISO 8601格式(yyyy-MM-dd),而你当前的DateTextField输出的是dd/MM/yyyy格式的日期字符串,浏览器无法识别这个格式,所以只会显示默认的提示文本——哪怕HTML源码里的value值看起来是正确的。
下面给你几个可行的解决方案:
方案1:使用Wicket内置的Html5DateTextField(推荐)
Wicket专门为HTML5的date输入提供了Html5DateTextField组件,它会自动处理日期格式的转换,完全适配HTML5的要求。
修改你的Java代码,把原来的DateTextField替换成Html5DateTextField即可:
// 替换之前的DateTextField代码 formPatient.add(dtf = new Html5DateTextField("bday", new PropertyModel<Date>(this, "person.bday")));
不需要额外指定格式字符串,这个组件会自动将Java的Date对象转换成ISO格式的字符串输出给浏览器,同时也能正确解析用户选择的日期回传给模型。
方案2:自定义DateTextField的转换器
如果你不想替换组件,也可以给现有的DateTextField设置一个自定义的IDateConverter,让它输出ISO格式的日期:
DateTextField dtf = new DateTextField("bday", new PropertyModel<Date>(this, "person.bday")) { @Override protected IDateConverter createConverter(Class<?> type) { return new IDateConverter() { @Override public Date convertToObject(String value, Locale locale) { // 解析用户输入的ISO日期(yyyy-MM-dd)转成Date对象 try { return new SimpleDateFormat("yyyy-MM-dd", locale).parse(value); } catch (ParseException e) { return null; } } @Override public String convertToString(Date date, Locale locale) { // 将Date对象转成ISO格式的字符串输出 if (date == null) { return ""; } return new SimpleDateFormat("yyyy-MM-dd", locale).format(date); } }; } }; formPatient.add(dtf);
修改后,组件输出的value会变成浏览器能识别的ISO格式,日期就能正常显示了。
方案3:前端JavaScript适配(不推荐)
虽然可以用JavaScript把dd/MM/yyyy格式转成ISO格式后赋值给输入框,但这种方式需要额外的前端代码,还会绕开Wicket的组件模型机制,容易引发其他问题,所以不建议采用。
验证一下:不管用方案1还是方案2,最终生成的HTML里的value应该变成类似value="2011-01-01"的格式,这样浏览器就能正确识别并显示日期了。
内容的提问来源于stack exchange,提问作者il_boga
相关产品推荐
相关产品推荐

