SpringMVC 学习-如何搭配使用 Velocity 页面模板

一、快速搭建 Velocity 框架

1. 加入所需 Jar 包

<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity</artifactId>
    <version>1.7</version>
</dependency>
<dependency>
    <groupId>velocity-tools</groupId>
    <artifactId>velocity-tools-generic</artifactId>
    <version>2.0-beta1</version>
</dependency>
<dependency>
    <groupId>velocity-tools</groupId>
    <artifactId>velocity-tools-view</artifactId>
    <version>2.0-beta1</version>
</dependency>
<dependency>
    <groupId>commons-digester</groupId>
    <artifactId>commons-digester</artifactId>
    <version>2.1</version>
</dependency>

2. 修改 SpringMVC 的配置文件 springmvc-servlet.xml

旧配置:

<!-- 对加载页面的路径解析 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <!-- 前缀 -->
  <property name="prefix" value="/"></property>
  <!-- 后缀 -->
  <property name="suffix" value=".html"></property>
</bean>

改为:

<!-- 对加载页面的路径解析 不需要配 prefix, 在 velocity-servlet.xml 中配置 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
  <!-- 加载 toolbox 配置文件 -->
  <property name="toolboxConfigLocation" value="/WEB-INF/velocityToolBox.xml" />
  <!-- 后缀 -->
  <property name="suffix" value=".vm"></property>
</bean>

3. 在 WEB-INF 下面创建配置文件,命名为 velocityToolBox.xml 

<toolbox>
  <!-- application start -->
  <tool>
    <key>date</key>
       <scope>application</scope>
       <class>org.apache.velocity.tools.generic.DateTool</class>
  </tool>
  <tool>
       <key>math</key>
       <scope>application</scope>
    <class>org.apache.velocity.tools.generic.MathTool</class>
  </tool>
  <!-- application end -->
</toolbox>

4. 在 WEB-INF 下创建配置文件 velocity-servlet.xml 

<bean id="velocityConfigurer"
        class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
  <!-- 模版路径 -->
  <property name="resourceLoaderPath">
    <!-- prefix -->
    <
value>/</value>   </property>   <!-- 模版属性 -->   <property name="velocityProperties">     <props>       <prop key="input.encoding">utf-8</prop>       <prop key="output.encoding">utf-8</prop>     </props>   </property> </bean>

记得在 web.xml 文件中引入 velocity-servlet.xml 

5. velocity 模板的一些基本指令

比如循环:后台传递过来的用户信息列表 userList 

#foreach($item in $userList)
    <div>$item.userName $item.createDate</div>
#end

二. 如何自定义标签

1. 先创建一个自定义标签 Java 类。必须要有 @DefaultKey("") 注解

package com.erim.web.common;

@DefaultKey("erim")
public class ErimTag {
  // 格式化时间
    public String formatDate(Date date) {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
    }
}

2. 修改 WEB-INF 下 velocityToolBox.xml 引入 Java 类

<tool>
    <key>erim</key>
    <scope>application</scope>
    <class>com.erim.web.common.ErimTag</class>
</tool>

这样自定义注解就生效了。假如后台有一个时间变量 createDate 需要在页面渲染,渲染完发现格式是酱紫的:

Thu May 12 15:20:02 CST 2016

这就需要用到我们的自定义标签:

$erim.formatDate($createDate)

 

三. 如何自定义指令

1. 还是先创建一个 Java 类,继承 Directive。

public class TextTag extends Directive {

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

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

    @Override
    public boolean render(InternalContextAdapter context, Writer writer, Node node)
            throws IOException, ResourceNotFoundException, ParseErrorException,
            MethodInvocationException {
        // 获取第一个参数
        SimpleNode user = (SimpleNode) node.jjtGetChild(0);
        // 格式化
        String userName = (String) user.value(context);
        // 操作
        userName = userName + ".....";
        // 输出
        writer.write(userName);
        return true;
    }

}

2. 在 WEB-INF 下创建资源文件 velocity.properties

input.encoding=utf-8   
output.encoding=utf-8 
userdirective=com.erim.web.common.TextTag

其中 userdirective 的值为自定义指令 Java 类的地址,多个 Java 类以逗号分隔

3. 修改 velocity-servlet.xml 文件

<!-- velocity 相关配置 -->
<bean id="velocityConfigurer" 
  class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
  <!-- 引入外部资源 -->
  <property name="configLocation" value="/WEB-INF/velocity.properties" />
  <!-- 模板路径 -->
  <property name="resourceLoaderPath" value="/templates/"></property>
  <!-- 模板属性 -->
  <property name="velocityProperties">
    <props>
      <prop key="input.encoding">utf-8</prop>
      <prop key="output.encoding">utf-8</prop>
    </props>
  </property>
</bean>

4. 使用场景

#vText("hhahaha")

hahahha, demo 就是这么任意

#vText 就是上面 getName() 方法中指定的字符串。

原文地址:https://www.cnblogs.com/libra0920/p/5478079.html