转载

Spring MVC借助ConversionService将vo字段显示到页面

本文由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

原文  http://www.javacoder.cn/?p=1210
正文到此结束
Loading...