首页 > Java, 挨踢(IT), 日拱一卒 > Velocity 工具类配置

Velocity 工具类配置

2016年2月16日 发表评论 阅读评论 1,634 人阅读    

博客又有一段时间没有更新了。前一段时间(好几个月前了,哈哈),看一个朋友的博客,内容有长有短,类似日志;最近看一个微信公众号,座右铭是:宁可十年不将军,不可一日不拱卒。所以,考虑以后把每天有趣或者有意义的东西做个小结,记录发文出来。本文章就算是第一个篇文章吧。

公司项目里使用 Velocity 。网上相关的资料很零散,相关的配置查起来挺麻烦了。而且又没有很好的示例,今天又要费心地配置 Toolbox 。所以,干脆记录下来,

工具类配置文件的位置

默认的 Velocity 工具相关的配置放在 WEB-INF/toolbox.xml。当然,也可以在 web.xml 中配置,配置片段如下:

01<!-- Define Velocity template compiler -->
02<servlet>
03  <servlet-name>velocity</servlet-name>
04  <servlet-class>
05    org.apache.velocity.tools.view.servlet.VelocityViewServlet
06  </servlet-class>
07 
08  <!--
09    Unless you plan to put your toolbox.xml and velocity.properties
10    under different folders or give them different names, then these
11    two init-params are unnecessary as of VelocityTools 1.3.  The
12    VelocityViewServlet will automatically look for these files in
13    the following locations.
14  -->
15  <init-param>
16    <param-name>org.apache.velocity.toolbox</param-name>
17    <param-value>/WEB-INF/toolbox.xml</param-value<!--1-->
18  </init-param>
19 
20  <init-param>
21    <param-name>org.apache.velocity.properties</param-name>
22    <param-value>/WEB-INF/velocity.properties</param-value>
23  </init-param>
24</servlet>
25 
26<!-- Map *.vm files to Velocity -->
27<servlet-mapping>
28  <servlet-name>velocity</servlet-name>
29  <url-pattern>*.vm</url-pattern>
30</servlet-mapping>
  1. 这里就是 Toolbox 的配置路径。

如果使用 Spring MVC,也可以在 Spring MVC 的配置文件中,配置片段如下:

01<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
02    <property name="resourceLoaderPath" value="WEB-INF/velocity/"/>
03    <property name="velocityProperties">
04        <props>
05            <prop key="directive.foreach.counter.name">loopCounter</prop>
06            <prop key="directive.foreach.counter.initial.value">0</prop>
07            <prop key="input.encoding">UTF-8</prop>
08            <prop key="output.encoding">UTF-8</prop>
09        </props>
10    </property>
11</bean>
12 
13<bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"
14      p:order="1">
15    <property name="suffix" value=".vm"/>
16    <property name="contentType" value="text/html;charset=UTF-8"/>
17    <property name="exposeSessionAttributes" value="true"/>
18    <property name="dateToolAttribute" value="dateTool"/>  <!--1-->
19    <property name="numberToolAttribute" value="numberTool"/> <!--2-->
20    <property name="toolboxConfigLocation" value="/WEB-INF/velocity/toolbox.xml"/> <!--3-->
21    <property name="allowSessionOverride" value="true"/>
22</bean>
  1. 问题一。下面在 悬而未决的问题 中说明。
  2. 问题二。下面在 悬而未决的问题 中说明。
  3. 这里就是 Toolbox 的配置路径。

内置常用工具配置

Velocity 中内置了一些常用的工具类。所有的工具类都在 org.apache.velocity.tools.generic包中。常用的工具类有 MathToolNumberToolDateTool 和 `ListTool`等。可以将这些工具类配置的到上文提到的配置文件中。具体配置如下:

01<toolbox>
02    <tool>
03        <key>mathTool</key>
04        <scope>application</scope> <!--1-->
05        <class>org.apache.velocity.tools.generic.MathTool</class>
06    </tool>
07    <tool>
08        <key>numberTool</key>
09        <scope>application</scope>
10        <class>org.apache.velocity.tools.generic.NumberTool</class>
11        <parameter name="format" value="#0.00"/> <!--2-->
12        <parameter name="locale" value="zh_CN"/> <!--3-->
13    </tool>
14    <tool>
15        <key>dateTool</key>
16        <scope>application</scope>
17        <class>org.apache.velocity.tools.generic.DateTool</class>
18        <parameter name="format" value="yyyy/MM/dd HH:mm:ss"/> <!--2-->
19        <parameter name="locale" value="zh_CN"/> <!--3-->
20        <parameter name="timezone" value="Asia/Shanghai"/> <!--4-->
21    </tool>
22    <tool>
23        <key>listTool</key>
24        <scope>application</scope>
25        <class>org.apache.velocity.tools.generic.ListTool</class>
26    </tool>
27</toolbox>
  1. 作用域范围。下面专门来讲解。
  2. 默认格式。
  3. 本地化样式。
  4. 时区。查看 Velocity 的源代码可以获知,这里配置时区 ID即可。下面 常见问题 章节给出获取方法。

这些工具类中的常用方法,大家请查阅相关 Java 代码就能一目了然。这里就不再赘述了。这里简单说明一下配置默认数字样式和默认日期格式化的便利。经过上面配置,在 Velocity 的模板中使用就非常方便了。举几个例来说明一下:

  • 如果需要格式化货币,可以直接写成 $numberTool.currency($order.fee), 输出结果会自动两位小数,前面还会加上软妹币的标识符

  • 如果需要格式化日期,则可以 $dateTool.format($order.createTime),输出结果则是:
    2016/02/16 22:47:26

  • 如果需要判断列表是否为空,则可以: $listTool.isEmpty($orderList)

是不是非常方便?

工具作用域说明

上面的配置中,有作用域一项,配置文件中,只有 application`一种。其实,一共 `request,sessionapplication 三种。

对于 request 还可以设定有效 URL。示例如下:

1<tool>
2   <key>catalog</key>
3   <scope>request</scope>
4   <request-path>/catalog/*</request-path>
5   <class>com.diguage.tools.CatalogTool</class>
6</tool>

这里再多说一句,根据上面的示例也可以看出,可以将自己开发的工具类也配置到这里,进一步扩展Velocity 的功能。

其他配置

在配置文件中,还可以给工具类配置参数,可以配置常量。D瓜哥用的不多,就不再给示例了。可以在给出的参考资料中来查询。

悬而未决的问题

如何获取经过配置的工具类对象?

由于项目中使用“分”作为货币单位。所以,在展示时需要先除以100转化成元再展示。直接使用 Velocity 所以,想自定义一个工具类,将这个转化过程在内部实现,在模板中简写成 $currencyTool.currency($$order.fee)。但是,总是报错,甚是麻烦。废话少说,直接上代码吧(略去了在 toolbox.xml 的配置):

01package com.diguage.util.view;
02 
03import com.diguage.util.GlobalConstants;
04import org.apache.velocity.VelocityContext;
05import org.apache.velocity.tools.ToolManager;
06import org.apache.velocity.tools.config.DefaultKey;
07import org.apache.velocity.tools.generic.MathTool;
08import org.apache.velocity.tools.generic.NumberTool;
09 
10/**
11 * 货币格式化工具类
12 *
13 * @author D瓜哥, http://www.diguage.com/
14 * @since 2016/2/16.
15 *
16 * TODO 怎样在自己的类中利用Velocity的NumberTool,需要获取项目中根据配置文件初始化好的NumberTool对象?(这样就不需要配置样式了)
17 */
18@DefaultKey("currency")
19public class CurrencyTool {
20    private NumberTool numberTool;
21    private MathTool mathTool;
22 
23    private ToolManager velocityToolManager;
24 
25    public CurrencyTool() {
26        velocityToolManager = new ToolManager();
27        velocityToolManager.configure("/WEB-INF/velocity/toolbox.xml");  // -1-
28        VelocityContext context = new VelocityContext(velocityToolManager.createContext());
29        numberTool = (NumberTool) context.get("numberTool");
30        mathTool = (MathTool) context.get("mathTool");
31    }
32 
33    public String currency(Object original) {
34    }
35}
  1. 这就是找不到的配置文件

报错信息是找不到配置文件。

说一下问题吧。首先,这样写是否可行?其次,配置文件的路径该怎么搞?报错原因,D瓜哥想到一点,这里写的路径是绝对路径,其实是想让它根据 Web 项目的上下文路径来查找。所以,肯定找不到啊。这点,D瓜哥回头再试试怎么搞?如果好的方案,还请赐教。

Spring 配置

上面提到的 问题一问题二,为什么在 Spring MVC 中还需有配置 dateToolnumberTool,D瓜哥还没有搞清楚这是干什么。记录下来,留在后续再“追查”这个问题。

获取时区 ID

在 Java 中,如何获取时区 ID?这个问题,以前没有留意过,这里配置所需,查了一下,使用如下代码就可以查看 Java 中所有可用的时区 ID。

1/**
2 * D瓜哥, http://www.diguage.com
3 */
4String[] availableIDs = TimeZone.getAvailableIDs();
5for (String id : availableIDs) {
6    System.out.println(id);
7}

参考资料

  1. Toolbox Configuration
  2. Creating Custom Tools for Apache Velocity


作 者: D瓜哥,https://www.diguage.com/
原文链接:https://wordpress.diguage.com/archives/138.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.