Spring3中的Formatter结合Velocity格式化输出实例

看本文之前,希望你对Spring3的Formatter机制有所了解,还不了解的可以猛戳这里

Spring3中对于格式化有两种级别,一种是针对类型级别的格式化,另一种是针对字段的格式化。

首先,针对类型级别的格式化也就是说,比如对于Date类型,我都采用一种格式化方案,那么可以用如下方式注册:

			conversionService.addFormatter(new Formatter<Date>() {
				@Override
				public String print(Date object, Locale locale) {
					return null;
				}
				@Override
				public Date parse(String text, Locale locale)
						throws ParseException {
					return null;
				}
			});

而针对字段级别的格式化,它的灵活度就相对较高,是对于某个类的某个字段而进行格式化的一种方案(一般采用注解形式):

public class TestEntity {
	//@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	private Date date;
	@NumberFormat(pattern = "人民币:##.00")
	private Double salary;

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	public Double getSalary() {
		return salary;
	}

	public void setSalary(Double salary) {
		this.salary = salary;
	}

}

而对于对字段的解析来说也是一样的,若是字段级别的解析,那么在定义方法参数的时候,需要带上注解:

@RequestMapping(value = "/format2")
public String test2(@NumberFormat @RequestParam("salary") Double salary,
	    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") @RequestParam("date") Date date) {
    	System.out.println(phoneNumber);
    	System.out.println(date);
    	return "format/success2";
} 

鉴于Date类型在格式化中的出场频率较高,那么我们就用Date来举例吧:我们先来实现类型级别的格式化

public class DateFormatter implements Formatter<Date> {

	@Override
	public String print(Date object, Locale locale) {
		try {
			return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", locale)
					.format(object);
		} catch (Exception e) {
			return new SimpleDateFormat("yyyy-MM-dd", locale).format(object);
		}
	}

	@Override
	public Date parse(String text, Locale locale) throws ParseException {
		try {
			return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", locale)
					.parse(text);
		} catch (Exception e) {
			return new SimpleDateFormat("yyyy-MM-dd", locale).parse(text);
		}
	}
}

这里也提现了try...catch的一个妙用,我们使用它来帮助我们处理两种不同格式的Date类型

写好Formatter之后,我们将它注册到FormattingConversionService上去

conversionService.addFormatter(new DateFormatter());

这样一来,我们在使用conversionService.converter(...)方法转换Date和String类型的数据时,就会调用DateFormatter中的parse和print方法了

但是每次都手动来转换似乎太麻烦了,Spring貌似提供了<spring:eval expression="model.date">来实现自动格式化,可是这个没怎么接触过

还是自己来手动实现一个吧,这里是结合了Velocity的 Directive来实现的。

public class FormatterDirective extends Directive {

	private FormattingConversionService conversionService;

	@Override
	public String getName() {
		return "formatter";
	}

	@Override
	public int getType() {
		return LINE;
	}

	@Override
	public boolean render(InternalContextAdapter context, Writer writer,
			Node node) throws IOException, ResourceNotFoundException,
			ParseErrorException, MethodInvocationException {

		if (conversionService == null) {
			conversionService = new DefaultFormattingConversionService();
			conversionService.addFormatter(new DateFormatter());
		}
		String param = node.jjtGetChild(0).value(context).toString();
		String[] params = param.split("\\.");
		BeanWrapper beanWrapper = new BeanWrapperImpl(context.get(params[0]));
		// 获取类型信息
		TypeDescriptor descriptor;
		descriptor = beanWrapper.getPropertyTypeDescriptor(params[1]);
		TypeDescriptor stringDescriptor = TypeDescriptor.valueOf(String.class);
		Object value = conversionService.convert(
				beanWrapper.getPropertyValue(params[1]), descriptor,
				stringDescriptor);
		writer.write(value.toString());
		return true;
	}
}

前台页面写法:

	#formatter("person.salary")
	<br /> #formatter("person.date")
	<br />

看起来是不是和spring提供的那种写法类似呢?

时间: 2024-08-08 22:05:41

Spring3中的Formatter结合Velocity格式化输出实例的相关文章

python中while循环运算符及格式化输出

一,while循环 while 条件:       while语句块(循环体) 运行: 判断你给的条件是否为真,如果真则执行循环体.否则跳出循环. 执行完循环体之后再次判断条件是否为真 例子1 我们玩联盟的时候喷打野的的时候,可以用这种方式,这是一个死循环,条件为真,他会一直执行除非手动停止. while True: print("你是不是傻") print("出来帮一下可不可以") print("出来帮一下可不可以") print("

[Javascript] 如何自定义字符串格式化输出

在其他语言中十分常见的字符串格式化输出,居然在 Javascript 中不见踪影,于是决定自己实现该方法,以下就是个人编写的最简洁实现: String.prototype.format = function(){ var args = arguments; return this.replace(/\{(\d+)\}/gm, function(ms, p1){return typeof(args[p1]) == 'undefined' ? ms : args[p1]}); } 应用示例: >>

『Go基础』第8节 格式化输出

输出就是将数据信息打印到电脑屏幕上. 本节我们就来学习一下Go语言中的三种输出方式: Print().Println().Printf(). 1.Print() Print()主要的一个特点就是打印数据时不换行. package main import "fmt" func main() { a, b := 10, 20 // 输出: Print, 打印数据时不带换行 fmt.Print(a) fmt.Print(b) } // 结果: 1020 2. Println() Printl

java中格式化输出大神Formatter简历

一.干嘛的?(作用) 在java中,所有新的格式化功能都有formatter类处理.可以将formatter看作一个翻译器,它将你的格式化字符串与数据翻译成需要的结果.比如很多地方格式输出都有用到,像我们在超市购物付款时候打印的购物小票啊,所以还是很实用的. 二.籍贯(所在库) java中的Formatter类位于java.util.Formatter中,所以需要用到的时候只要import进来就可以用了.注意,请选择1.5及以上版本的编译器,否则会出现"The method format(Str

java中格式化输出

JAVA中有时候需要对计算出来的数据进行格式化,在java中使用printf可以达到目的. 格式化输出,每个以%字符开始的格式说明都用相应的参数替换,f表示浮点数,s表示字符串,d表示十进制整数,还可以加上标志符,详见下面的printf的标志. 下面先举一例: 1 public class testPrintf { 2 public static void main(String[] args){ 3 double number = 10000.0/3.0; 4 System.out.print

EasyUI DataGrid 中字段 formatter 格式化不起作用

今天用 EasyUI datagrid 来做列表,要对一些数据进行格式化,推断某字段状态时,发现 formatter 格式化相应的函数不起作用. <table id="list_data" title="未审核报表" class="easyui-datagrid" style="width: auto;height:350px;" url="" toolbar="#toolbar"

python中神奇的格式化输出

python一共有两种格式化输出语法, 一种是类似于C语言printf的方式,称为 Formatting Expression >>> '%s %d-%d' % ('hello', 7, 1) 'hello 7-1' 另一种是类似于C#的方式,称为String Formatting Method Calls >>> '{0} {1}:{2}'.format('hello', '1', '7') 'hello 1:7' 第一种方式可以指定浮点数的精度,例如 >>

C++中C/C++格式化输出

对于不同的机器,一此格式化输出的函数经常会得不到正确的输出,比方小端上的程序在大端上执行等,另外,在日常程序开发时,也会经常被这种小问题而困扰非常久.终于发现是她的问题.不免有点叹息,以下对printf/wprintf/CString.Format等相关函数所使用的格式化输出的语法作一总结.有些是从官方资料摘过来的,还是英文的. 函数中格式化声明的一般格式为: %[flags] [width] [.precision] [{h | l | ll | I | I32 | I64}]type 当中的

python中格式化输出和字母大小写转换,对齐填充方式

#格式化输出print("ang is a good time")str7="ong is a boy"num=10f=5.22313# %d(整数站位符) %s(字符串站位符) %f(浮点数站位符)# %f默认小数点后6位,%.3f精确到小数点后3位.默认会四舍五入print("num=",num,"f=",f)print("num= %d,str7=%s,f=%.9f" %(num,str7,f))''