zoukankan      html  css  js  c++  java
  • Velocity魔法堂系列一:入门示例

    一、前言                          

      Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力。而且Velocity被移植到不同的平台上,如.Net的NVelocity和js的Velocity.js,虽然各平台在使用和实现上略有差别,但大部分语法和引擎核心的实现是一致的,因此学习成本降低不少哦。

      最好的学习资源——官网:http://velocity.apache.org/

      本系列打算采用如下结构对Velocity进行较为全面的学习,若有不妥或欠缺望大家提出,谢谢。

      1. 入门示例

      2. VTL语法详解

      3. 模板与宿主环境通信

      4. 基础配置项

      5. 深入模板引擎及调优配置

    二、入门示例                        

      示例结果是生成如下的html表单:

    复制代码
    <form action="./submit">
    <div>
      <label for="title">标题:</label>
      <input type="text" id="title" name="title"/>
    </div>
    <div>
      <label for="brief">摘要:</label>
      <input type="text" id="brief" name="brief"/>
    </div>
    <div>
      <label for="sex">性别:</label>
      <select id="sex" name="sex">
        <option value="0">男</option>
        <option value="1">女</option>
      </select>
    </div>
    <div>
      <label for="job">职业:</label>
      <select id="job" name="job">
        <option value="0">Java工程师</option>
        <option value="1">Net工程师</option>
      </select>
    </div>
    </form>
    复制代码

       引入依赖项——velocity-1.7-dep.jar

       模板文件frm.vm

    复制代码
    ##表单模板
    ##@author fsjohnhuang
    ##@version 1.0
    ## 引入外部模板文件
    #parse('macro.vm')
    ## 主逻辑
    <form action="$action">
    #foreach($input in $inputs)
    #input($input.title $input.id)
    #end
    #foreach($select in $selects)
    #select($select.title $select.id $select.items)
    #end
    </form>
    复制代码

       模板文件macro.vm

    复制代码
    ## 生成input表单元素区域的宏
    #macro(input $title $id)
    <div>
      <label for="$id">$title</label>
      <input type="text" id="$id" name="$id"/>
    </div>
    #end
    ## 生成select表单元素区域的宏
    #macro(select $title $id $items)
    <div>
      <label for="$id">$title</label>
      <select id="$id" name="$id">
    ## VTL指令紧贴左侧才能确保结果的排版正常(不会有多余空格)
    #foreach($key in $items.keySet())
        <option value="$key">$items.get($key)</option>
    #end
      </select>
    </div>
    #end
    复制代码

       Java代码:

    复制代码
    public static void main(String[] args) {
            // 初始化模板引擎
            Properties props = new Properties();
            props.put("file.resource.loader.path", ".\vm");
            VelocityEngine ve = new VelocityEngine(props);
            // 配置引擎上下文对象
            VelocityContext ctx = new VelocityContext();
            ctx.put("action", "./submit");
            ArrayList<HashMap<String, String>> inputs = new ArrayList<HashMap<String,String>>();
            HashMap<String, String> input1 = new HashMap<String, String>();
            input1.put("id", "title");
            input1.put("title", "标题:");
            inputs.add(input1);
            HashMap<String, String> input2 = new HashMap<String, String>();
            input2.put("id", "brief");
            input2.put("title", "摘要:");
            inputs.add(input2);
            ctx.put("inputs", inputs);
            ArrayList<HashMap<String, Object>> selects = new ArrayList<HashMap<String,Object>>();
            HashMap<String, Object> select1 = new HashMap<String, Object>();
            selects.add(select1);
            select1.put("id", "sex");
            select1.put("title", "性别:");
            HashMap<Integer, String> kv1 = new HashMap<Integer, String>();
            kv1.put(0, "男");
            kv1.put(1, "女");
            select1.put("items", kv1);
            HashMap<String, Object> select2 = new HashMap<String, Object>();
            selects.add(select2);
            select2.put("id", "job");
            select2.put("title", "职业:");
            HashMap<Integer, String> kv2 = new HashMap<Integer, String>();
            kv2.put(0, "Java工程师");
            kv2.put(1, "Net工程师");
            select2.put("items", kv2);
            ctx.put("selects", selects);
            // 加载模板文件
            Template t = ve.getTemplate("test.vm");
            StringWriter sw = new StringWriter();
            // 渲染模板
            t.merge(ctx, sw);
            System.out.print(sw.toString());
        }
    复制代码

     Velocity模板引擎使用时的关注点分别为以外部文件形式存在的Velocity模板Java代码调用

     Velocity模板由VTL(Velocity Template Language)引擎上下文对象构成;Java代码调用部分则负责初始Velocity引擎构建引擎上下文对象加载Velocity模板启动模版渲染。而Velocity模板与Java代码调用部分通信的纽带就是引擎上下文对象了。

    三、总结                              

     现在我们对Velocity引擎应该有个大概的了解,后续内容将对上述内容逐一深入。

     尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4112328.html  ^_^肥仔John

     吐槽:倘若对文本的排版有强烈的要求,那么Velocity就不是最佳选择了。

     如上述示例,若想改成如下格式就要重新设计模板形式了:

    复制代码
    <form action="./submit">
      <div>
        .................
      </div>
      <div>
        .................
      </div>
      <div>
        .................
      </div>
      <div>
        .................
      </div>
    </form>
    复制代码
  • 相关阅读:
    ‘Found duplicate PV’ warnings when using LVM with multipath storage in RHEL/CentOS
    如何卸载windows的服务?卸载服务
    富文本wangeditor层级太高覆盖问题
    vue wangeditor
    vue消息提示this.$message方法
    MySQL之查询指定时间的数据
    企业微信第三方应用PC端实现用户点击注册的三种方式
    两款不带广告的輸入法
    jquery、css 的选择器
    广信可视电话设置可安装应用权限
  • 原文地址:https://www.cnblogs.com/longshiyVip/p/5263884.html
Copyright © 2011-2022 走看看