Velocity 工具类配置
博客又有一段时间没有更新了。前一段时间(好几个月前了,哈哈),看一个朋友的博客,内容有长有短,类似日志;最近看一个微信公众号,座右铭是:宁可十年不将军,不可一日不拱卒。所以,考虑以后把每天有趣或者有意义的东西做个小结,记录发文出来。本文章就算是第一个篇文章吧。
公司项目里使用 Velocity 。网上相关的资料很零散,相关的配置查起来挺麻烦了。而且又没有很好的示例,今天又要费心地配置 Toolbox 。所以,干脆记录下来,
工具类配置文件的位置
默认的 Velocity 工具相关的配置放在 WEB-INF/toolbox.xml。当然,也可以在 web.xml 中配置,配置片段如下:
<!-- Define Velocity template compiler -->
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>
org.apache.velocity.tools.view.servlet.VelocityViewServlet
</servlet-class>
<!--
Unless you plan to put your toolbox.xml and velocity.properties
under different folders or give them different names, then these
two init-params are unnecessary as of VelocityTools 1.3. The
VelocityViewServlet will automatically look for these files in
the following locations.
-->
<init-param>
<param-name>org.apache.velocity.toolbox</param-name>
<param-value>/WEB-INF/toolbox.xml</param-value> <!--1-->
</init-param>
<init-param>
<param-name>org.apache.velocity.properties</param-name>
<param-value>/WEB-INF/velocity.properties</param-value>
</init-param>
</servlet>
<!-- Map *.vm files to Velocity -->
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
- 这里就是 Toolbox 的配置路径。
如果使用 Spring MVC,也可以在 Spring MVC 的配置文件中,配置片段如下:
<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath" value="WEB-INF/velocity/"/>
<property name="velocityProperties">
<props>
<prop key="directive.foreach.counter.name">loopCounter</prop>
<prop key="directive.foreach.counter.initial.value">0</prop>
<prop key="input.encoding">UTF-8</prop>
<prop key="output.encoding">UTF-8</prop>
</props>
</property>
</bean>
<bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"
p:order="1">
<property name="suffix" value=".vm"/>
<property name="contentType" value="text/html;charset=UTF-8"/>
<property name="exposeSessionAttributes" value="true"/>
<property name="dateToolAttribute" value="dateTool"/> <!--1-->
<property name="numberToolAttribute" value="numberTool"/> <!--2-->
<property name="toolboxConfigLocation" value="/WEB-INF/velocity/toolbox.xml"/> <!--3-->
<property name="allowSessionOverride" value="true"/>
</bean>
- 问题一。下面在 悬而未决的问题 中说明。
- 问题二。下面在 悬而未决的问题 中说明。
- 这里就是 Toolbox 的配置路径。
内置常用工具配置
Velocity 中内置了一些常用的工具类。所有的工具类都在 org.apache.velocity.tools.generic包中。常用的工具类有 MathTool 、 NumberTool 、 DateTool 和 `ListTool`等。可以将这些工具类配置的到上文提到的配置文件中。具体配置如下:
<toolbox>
<tool>
<key>mathTool</key>
<scope>application</scope> <!--1-->
<class>org.apache.velocity.tools.generic.MathTool</class>
</tool>
<tool>
<key>numberTool</key>
<scope>application</scope>
<class>org.apache.velocity.tools.generic.NumberTool</class>
<parameter name="format" value="#0.00"/> <!--2-->
<parameter name="locale" value="zh_CN"/> <!--3-->
</tool>
<tool>
<key>dateTool</key>
<scope>application</scope>
<class>org.apache.velocity.tools.generic.DateTool</class>
<parameter name="format" value="yyyy/MM/dd HH:mm:ss"/> <!--2-->
<parameter name="locale" value="zh_CN"/> <!--3-->
<parameter name="timezone" value="Asia/Shanghai"/> <!--4-->
</tool>
<tool>
<key>listTool</key>
<scope>application</scope>
<class>org.apache.velocity.tools.generic.ListTool</class>
</tool>
</toolbox>
- 作用域范围。下面专门来讲解。
- 默认格式。
- 本地化样式。
- 时区。查看 Velocity 的源代码可以获知,这里配置时区 ID即可。下面 常见问题 章节给出获取方法。
这些工具类中的常用方法,大家请查阅相关 Java 代码就能一目了然。这里就不再赘述了。这里简单说明一下配置默认数字样式和默认日期格式化的便利。经过上面配置,在 Velocity 的模板中使用就非常方便了。举几个例来说明一下:
-
如果需要格式化货币,可以直接写成
$numberTool.currency($order.fee), 输出结果会自动两位小数,前面还会加上软妹币的标识符¥; -
如果需要格式化日期,则可以
$dateTool.format($order.createTime),输出结果则是:
2016/02/16 22:47:26。 -
如果需要判断列表是否为空,则可以:
$listTool.isEmpty($orderList)。
是不是非常方便?
工具作用域说明
上面的配置中,有作用域一项,配置文件中,只有 application`一种。其实,一共 `request,session 和 application 三种。
对于 request 还可以设定有效 URL。示例如下:
<tool> <key>catalog</key> <scope>request</scope> <request-path>/catalog/*</request-path> <class>com.diguage.tools.CatalogTool</class> </tool>
这里再多说一句,根据上面的示例也可以看出,可以将自己开发的工具类也配置到这里,进一步扩展Velocity 的功能。
其他配置
在配置文件中,还可以给工具类配置参数,可以配置常量。D瓜哥用的不多,就不再给示例了。可以在给出的参考资料中来查询。
悬而未决的问题
如何获取经过配置的工具类对象?
由于项目中使用“分”作为货币单位。所以,在展示时需要先除以100转化成元再展示。直接使用 Velocity 所以,想自定义一个工具类,将这个转化过程在内部实现,在模板中简写成 $currencyTool.currency($$order.fee)。但是,总是报错,甚是麻烦。废话少说,直接上代码吧(略去了在 toolbox.xml 的配置):
package com.diguage.util.view;
import com.diguage.util.GlobalConstants;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.tools.ToolManager;
import org.apache.velocity.tools.config.DefaultKey;
import org.apache.velocity.tools.generic.MathTool;
import org.apache.velocity.tools.generic.NumberTool;
/**
* 货币格式化工具类
*
* @author D瓜哥, http://www.diguage.com/
* @since 2016/2/16.
*
* TODO 怎样在自己的类中利用Velocity的NumberTool,需要获取项目中根据配置文件初始化好的NumberTool对象?(这样就不需要配置样式了)
*/
@DefaultKey("currency")
public class CurrencyTool {
private NumberTool numberTool;
private MathTool mathTool;
private ToolManager velocityToolManager;
public CurrencyTool() {
velocityToolManager = new ToolManager();
velocityToolManager.configure("/WEB-INF/velocity/toolbox.xml"); // -1-
VelocityContext context = new VelocityContext(velocityToolManager.createContext());
numberTool = (NumberTool) context.get("numberTool");
mathTool = (MathTool) context.get("mathTool");
}
public String currency(Object original) {
}
}
- 这就是找不到的配置文件
报错信息是找不到配置文件。
说一下问题吧。首先,这样写是否可行?其次,配置文件的路径该怎么搞?报错原因,D瓜哥想到一点,这里写的路径是绝对路径,其实是想让它根据 Web 项目的上下文路径来查找。所以,肯定找不到啊。这点,D瓜哥回头再试试怎么搞?如果好的方案,还请赐教。
Spring 配置
上面提到的 问题一 和 问题二,为什么在 Spring MVC 中还需有配置 dateTool 和 numberTool,D瓜哥还没有搞清楚这是干什么。记录下来,留在后续再“追查”这个问题。
获取时区 ID
在 Java 中,如何获取时区 ID?这个问题,以前没有留意过,这里配置所需,查了一下,使用如下代码就可以查看 Java 中所有可用的时区 ID。
/**
* D瓜哥, http://www.diguage.com
*/
String[] availableIDs = TimeZone.getAvailableIDs();
for (String id : availableIDs) {
System.out.println(id);
}
参考资料
原文链接:https://wordpress.diguage.com/archives/138.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
