今天浏览WW的Wiki,结果无意发现ww:date标签的用法,挠头一想以前没有见过呀,仔细一看原来是2006/3/21才加上的。
会头看看项目发现用的ww 2.2.1中没有这个标签,心想是不是发布新版本了?
果不出所料!发现OPENSYMPHONY已经发布2.2.2了。
不过2.2.2是在Opensymphony下的最后一个版本了,以后的版本就会以Struts Action 2.0的形式发布了,而后者今年8月才发布,中间的日子估计只能靠nightly build了。
说说变化,发现增加了RichTextEditor,经考察就是我们熟悉的FCK Editor。发现还增加了nifty corners,这是一个不用images的圆角容器(css+js),估计用在了某个theme里面。还有J2SE5的支持也更加完善,现在已经可以支持泛型Collection的反射(无需-conversion文件了),还支持annotation风格的validation声名(如此像Stripes那样的Web框架就没什么可吹嘘的了)。其它的变化请参考他们的ReleaseNotes。
http://www.opensymphony.com/webwork/wikidocs/Release%20Notes.html
说说新添加的ww:date标签。很多朋友可能都认为ww:property输出date比较不如意,以前很多解决方案感觉都不够灵活。WW肯定察觉了,新增加的ww:date把玩了一下发现非常好用,所以推荐给大家。
语法非常简单:
name:你取值的ognl表达式
nice:是否使用易读(readable notations)的模式,其实就是类似conflunce里面显示时间的方式,类似“in 2 hours, 14 minutes”
format:就是我们常用的时间format,例如“yyyy-MM-dd hh:mm”
id:就是HTML中的元素id
使用起来如下,官方的例子:
<ww:date name="person.birthday" format="dd/MM/yyyy" />
按照“dd/MM/yyyy”格式显示
<ww:date name="person.birthday" format="%{getText('some.i18n.key')}" />
将format定义到i18n文件中的方式,这个很常用:D
<ww:date name="person.birthday" nice="true" />
使用易读(readable notations)的模式
<ww:date name="person.birthday" />
使用默认的格式输出
其中显示的规则如下:
1、如果制定了nice="true"则优先以易读(readable notations)的模式显示
2、如果nice="false"则按照指定的format显示
3、如果上面两个属性都没有指定,则从默认的资源文件中寻找webwork.date.format这个i18n的key,按照它显示
4、如果还没有找到则按照DateFormat.MEDIUM格式显示
5、特别之处:如果从ValueStack没有找到值,则默认显示空白(而不是null)
就这么简单,感觉读(readable notations)模式尤其有趣,非常好用,你还可以给它指定i18n的显示方式。
下面共享一下我写的zh_cn版本,你只需要将一下内容拷贝到classpath下面的default.properties文件中就可以了(也可以按照i18的资源文件命名规则):
- webwork.date.format.past = { 0 } 以前
- webwork.date.format.future = 在 { 0 }
- webwork.date.format.seconds = 几秒钟前
- webwork.date.format.minutes = { 0 , choice , 1 #一分钟| 1 <{ 0 } 分钟}
- webwork.date.format.hours = { 0 , choice , 1 #一小时| 1 <{ 0 } 小时}{ 1 , choice , 0 #| 1 #零一分钟| 1 <零 { 1 } 分钟}
- webwork.date.format.days = { 0 , choice , 1 #一天| 1 <{ 0 } 天}{ 1 , choice , 0 #| 1 #零一小时| 1 <零 { 1 } 小时}
- webwork.date.format.years = { 0 , choice , 1 #一年| 1 <{ 0 } 年}{ 1 , choice , 0 #| 1 #零一天| 1 <零 { 1 } 天}
你也可以自己翻译,默认的key如下:
i18n文件默认为default.properties
- webwork.date.format.past = { 0 } ago
- webwork.date.format.future = in { 0 }
- webwork.date.format.seconds = an instant
- webwork.date.format.minutes = { 0 , choice , 1 #one minute| 1 <{ 0 } minutes}
- webwork.date.format.hours = { 0 , choice , 1 #one hour| 1 <{ 0 } hours}{ 1 , choice , 0 #| 1 # , one minute| 1 < , { 1 } minutes}
- webwork.date.format.days = { 0 , choice , 1 #one day| 1 <{ 0 } days}{ 1 , choice , 0 #| 1 # , one hour| 1 < , { 1 } hours}
- webwork.date.format.years = { 0 , choice , 1 #one year| 1 <{ 0 } years}{ 1 , choice , 0 #| 1 # , one day| 1 < , { 1 } days}
2.2.2的更多功能的探索希望大家能够互相交流。
还有点补充:现在用ww:property输出Date类型的数据默认会显示到毫秒……请注意。