本文由javacoder.cn整理,转载注明出处
在 Spring Mvc(数据绑定) DataBinding 过程源码分析 中,我们详细介绍了ConversionService 在dataBinding阶段的使用, 本文介绍ConversionService在dataFormatting阶段(将vo的数据显示到页面上)的使用
假设我们的vo定义如下:
public class UserVo { ............... @DateTimeFormat(pattern="yyyy-MM-dd") private Date birthday = new Date(); }
由于birthday属性使用了DateTimeFormat注解, 那么会向ConversionService注册一个DateFormatter对象, 当我们如下所示使用spring mvc的input tag
<sf:input path="birthday"/>最后产生如下所示的html代码
<input id="birthday" name="birthday" type="text" value="2018-02-04" />
可以看到Date对象根据@DateTimeFormat(pattern="yyyy-MM-dd")注解格式化成我们想要的格式, 但是如果我们想将birthday属性显示到<span>标签中,或者直接显示在页面中,该如何显示呢
也许你会说如下使用c标签的<c:out>
<c:out value="${userVo.birthday}"></c:out>不过最后生成的却是:
Sun Feb 04 18:19:55 CST 2018
可以按如下自定义tag来输出
public class FormatOutPutTag extends AbstractDataBoundFormElementTag { private static final long serialVersionUID = 1L; private String tag; @Override protected int writeTagContent(TagWriter tagWriter) throws JspException { Object content = this.getBoundValue(); if (tag != null) { tagWriter.startTag(tag); tagWriter.appendValue(content.toString()); tagWriter.endTag(); } else { try { this.pageContext.getOut().write(content.toString()); } catch (Exception e) { e.printStackTrace(); } } return SKIP_BODY; } public void setTag(String tag) { this.tag = tag; } }
AbstractDataBoundFormElementTag中实现了根据path获取BoundValue的逻辑,而且获取的BoundValue还是根据@DateTimeFormat注解正确格式化后的数据,所以完美的解决我们的问题
至于如何完整的自定义tag,请参看JSP Tag开发
Posted in:MySQL practise, spring practise