精华内容
下载资源
问答
  • java对象 velocity 获取
    2021-02-13 00:31:46

    Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅使用简单的模板语言(template language)来引用由java代码定义的对象。下面由学习啦小编整理了几种vlookup函数的使用方法,希望对大家有所帮助。

    velocity调用java方法一

    项目结构 velocity tool java类

    public class T {

    public String msg() {

    return "难道必须没有报名嘛 会疯掉的!";

    }

    public String getMessage() {

    return "message";

    }

    public String sayHello(String s) {

    return "say hello by macro " + s;

    }

    }

    以上是类 无包名

    以上是tools.xml文件内容存放在web-inf下

    input.encoding=utf-8

    output.encoding=utf-8

    # Filepath for error template, relative to web application root directory

    tools.view.servlet.error.template = error.vm

    # Directory for layout templates, relative to web application root directory

    tools.view.servlet.layout.directory = /

    # Filepath of the default layout template

    # relative to the layout directory

    # NOT relative to the root directory of the webapp!

    tools.view.servlet.layout.default.template = default.vm

    以上是velocity.properties 存放与web-inf下

    velocity

    org.apache.velocity.tools.view.VelocityViewServlet

    org.apache.velocity.toolbox

    /WEB-INF/tools.xml

    org.apache.velocity.properties

    /WEB-INF/velocity.properties

    velocity

    *.vm

    index.vm

    以上是web.xml

    $screen_content

    呵呵的部分

    以上是default.vm

    #set($page_title="Layout Test")

    #set($layout="default.vm" )

    $t.getMessage()

    velocity调用java方法二

    1, 注释,任何一种语言中,注释总是必不可少的。

    (1) 单行注释:

    ## 这是单行注释

    (2) 多行注释:

    #*

    这是多行注释

    *#

    2, 输出,也就是数据展现。

    $userName

    这样便可以输出用户名了。但是,并不是绝对的能够输出用户名,因为可能这里输出的变量并不存在。如果userName这个变量不存在,或者为空,$userName将会被当             作字符串直接输出,也就是当我们期望在userName为空的时候输出空,但是却输出了’$userName’。为了避免这种情况,推荐这样的变量输出写法:

    $!{userName}

    3, 变量声明与赋值

    一般情况下,我们不推荐在html页面中直接声明Velocity变量,因为这会增加html界面的复杂度。如果确实有必要,可以使用下面的语句声明变量并赋值:

    #set($userName=’hanmeimei’)

    请注意:Velocity的变量声明都要带着$符号。

    在LML中,我们经常在所谓的后台,也就是Action中给变量赋值,这样在Action对应的html模板中也可以直接使用该变量。可使用一下两种方法:

    (1) 传统的getter/setter

    (2) ViewBag.Add(key,value)

    相比之下,第二种非传统的方式更快速。

    4, 算术运算

    Velocity支持在模板中使用(+,—,*,/),例如:

    #set($a=1)

    #set($b=1)

    #set($c=$a + $b)

    C在算对的情况下等于2,算错的情况下等于3.。有一个问题大家需要注意,我在使用四则运算的时候,发现’—‘不起作用,最后经过尝试,发现需要在变量和运算符之    间留一个空格,这样就没问题了。如果,你也遇到这样的问题,也可以这么尝试一下。

    5, 逻辑运算

    支持一下几个运算符,就如同java一样:

    &&:与。

    ||:或。

    !:非。

    6, 迭代

    #foreach ($item in $list)

    这是第 $velocityCount 个元素: $item

    #end

    $velocityCount,表示当前序号。

    还要说一下我们在LML中分页显示数据用到的迭代,如下:

    #foreach($item in $pager.result.rows)

    $item.userName

    ##以下两种方式可迭代列

    #set($row=$item.values().toArray())

    ##方式1

    #foreach($a in $row) $!a #end

    ##方式2

    #foreach($i in [0..2]) $row.item($i) #end

    #end

    $pager.result是在分页Action中查询到的一个数据集Result。

    我们也可以在模板中直接声明并赋值一个list,而后进行迭代:

    #set( $list = ["a", "b", "c"])

    #foreach ($item in $list)

    $velocityCount

    #end

    还有一种情况,我们需要迭代从1到10,所有的整数:

    #foreach ($item in [1..10])

    $velocityCount

    #end

    注意中间就是两个点。

    查阅很多资料,都直接说明Velocity不能迭代数组,下面说明原因:

    对数组的访问在Velocity中存在问题,因为Velocity只能访问对象的方法,而数组又是一个特殊的Array,所以虽然数组可以进行循环列举,但却不能定位访问特定位置 的   元素,如 strs[2],数组对固定位置元素的访问调用了Array的反射方法get(Object array, int index),而Velocity没能提供这样的访问,所以数组要么改成List等其他类容器的方式来包装,要么就通过公用Util类的方式来提供,传入数组对象和要访问的位置参数,从而达到返回所需值的目的。

    Velocity支持迭代的数据类型有:Vector、Hashtable或者Array

    7, 条件判断

    #if (条件1)

    #elseif (条件2)

    #else

    #end

    一直不是很理解Velocity的数据类型,所以在项目中最多使用的是String,就像这里的条件表达式,我们经常这样写: if(“$!{userSex}”==”0”),虽然性别使用int表示。

    8, 文件引入,#include与#parse

    两者作用类似,但是有以下不同:

    (1) 与#include不同的是,#parse只能指定单个对象。而#include可以有多个

    如果您需要引入多个文件,可以用逗号分隔就行:

    #include ("a.gif", "b.txt", "c.htm" )

    在括号内可以是文件名,但是更多的时候是使用变量的:

    #include ( “a.txt”, $photo )

    (2) #include被引入文件的内容将不会通过模板引擎解析;

    而#parse引入的文件内容Velocity将解析其中的velocity语法并移交给模板,意思就是说相当与把引入的文件copy到文件中。

    以上两点摘自互联网,到目前我基本没有使用过#include。#parse最大的用处或许是这样用:

    #parse(“title.html”)

    类似layout。

    9, 内置对象

    Velocity内置了一些对象,在模版里可以直接调用,列举如下:

    $request、$response、$session

    这些一直也没使用过,完全可以在Action页面把各种对象处理好了。

    基本上,在我们的一般开发中,掌握以上语法已经可以应付自如了。是不是很简单呢,我们希望的不就是简单吗,简单所以快。写的不好,敬请见谅。

    补充:

    LML支持在html模板中直接调用java方法,并可以向方法传递参数(字面值,或者Velocity变量),还可以输出方法的返回值。当然,为了避免模板页面过于复杂,我们还是应该尽量减少在模板中调用java方法。如果确实有必要调用,则需要现在模板页面对应的Action类上先行声明:

    @Helper( { TestHelper.class })

    这样就可以在html模板中调用:

    $!TestHelper.Test("$!{userName}")

    JAVA语言特点

    1.简单性

    Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。例如,Java不支持go to语句,代之以提供break和continue语句以及异常处理。Java还剔除了C++的操作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。因为Java没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。

    2.面向对象

    Java是一个面向对象的语言。对程序员来说,这意味着要注意应中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在这个类层次体系中有一个根类,它是具有一般行为的类。Java程序是用类来组织的。

    Java还包括一个类的扩展集合,分别组成各种程序包(Package),用户可以在自己的程序中使用。例如,Java提供产生图形用户接口部件的类(java.awt包),这里awt是抽象窗口工具集(abstract windowing toolkit)的缩写,处理输入输出的类(java.io包)和支持网络功能的类(java.net包)。

    3.分布性

    Java设计成支持在网络上应用,它是分布式语言。Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。

    网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。

    4.编译和解释性

    Java编译程序生成字节码(byte-code),而不是通常的机器码。Java字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台。Java程序可以在任何实现了Java解释程序和运行系统(run-time system)的系统上运行。

    在一个解释性的环境中,程序开发的标准“链接”阶段大大消失了。如果说Java还有一个链接阶段,它只是把新类装进环境的过程,它是增量式的、轻量级的过程。因此,Java支持快速原型和容易试验,它将导致快速程序开发。这是一个与传统的、耗时的“编译、链接和测试”形成鲜明对比的精巧的开发过程。

    猜你感兴趣:

    更多相关内容
  • 一、引言展示层有三大典型技术,分别是JSP、freemaker和velocity。本文主要介绍velocity。...源代码生成:Velocity 可以被用来生成 Java 代码、SQL 或者 PostScript。自动 Email:很多软件的用户注册、密码提醒...

    一、引言

    展示层有三大典型技术,分别是JSP、freemaker和velocity。本文主要介绍velocity。

    Velocity 主要使用场景如下:

    Web 应用:开发者在不使用 JSP 的情况下,可以用 Velocity 让 HTML 具有动态内容的特性。

    源代码生成:Velocity 可以被用来生成 Java 代码、SQL 或者 PostScript。

    自动 Email:很多软件的用户注册、密码提醒或者报表都是使用 Velocity 来自动生成的。

    转换 xml。

    二、入门

    velocity是一个基于java的模板引擎,与freemarker齐名,下面写一个velocity的hello world的demo。

    maven依赖

    org.apache.velocity

    velocity

    ${velocity.version}

    测试servelt

    import org.apache.velocity.Template;

    import org.apache.velocity.VelocityContext;

    import org.apache.velocity.app.VelocityEngine;

    import org.apache.velocity.runtime.RuntimeConstants;

    import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;

    import java.io.StringWriter;

    import java.util.ArrayList;

    import java.util.List;

    /**

    * ==Velocity之Hello Wordld入门程序==

    *

    * 首先,我们在代码中初始化了VelocityEngine这个模板引擎,对其设置参数进行初始化,

    * 指定使用ClasspathResourceLoader来加载vm文件。然后我们就可以往VelocityContext这个Velocity

    * 容器中存放对象了,在vm文件中我们可以取出这些变量,从而进行模板输出。

    */

    public class VelocityTest {

    private static final String VM_PATH = "template/velocity/helloworld.vm";

    public static void main(String[] args) {

    // 初始化模板引擎

    VelocityEngine velocityEngine = new VelocityEngine();

    velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");

    velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());

    velocityEngine.init();

    // 获取模板文件

    Template template = velocityEngine.getTemplate(VM_PATH);

    // 设置变量,velocityContext是一个类似map的结构

    VelocityContext velocityContext = new VelocityContext();

    velocityContext.put("name", "world");

    List list = new ArrayList();

    list.add("jack");

    list.add("kitty");

    velocityContext.put("list", list);

    // 输出渲染后的结果

    StringWriter stringWriter = new StringWriter();

    template.merge(velocityContext, stringWriter);

    System.out.println(stringWriter.toString());

    }

    }

    测试结果

    hello world

    1: This is jack

    2: This is kitty

    二、语法

    2.1 变量

    和我们所熟知的其他编程语言一样,Velocity 也可以在模板文件中有变量的概念。

    变量定义

    #set($name =“velocity”)

    等号后面的字符串 Velocity 引擎将重新解析,例如出现以$开始的字符串时,将做变量的替换。

    #set($hello =“hello $name”)

    上面的这个等式将会给 $hello 赋值为“hello velocity”

    变量的使用

    在模板文件中使用

    math?formula=name%20%E6%88%96%E8%80%85{name} 来使用定义的变量。推荐使用

    math?formula=%7Bname%7D%20%E8%BF%99%E7%A7%8D%E6%A0%BC%E5%BC%8F%EF%BC%8C%E5%9B%A0%E4%B8%BA%E5%9C%A8%E6%A8%A1%E6%9D%BF%E4%B8%AD%E5%90%8C%E6%97%B6%E5%8F%AF%E8%83%BD%E5%AE%9A%E4%B9%89%E4%BA%86%E7%B1%BB%E4%BC%BCname 和

    math?formula=names%20%E7%9A%84%E4%B8%A4%E4%B8%AA%E5%8F%98%E9%87%8F%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%B8%8D%E9%80%89%E7%94%A8%E5%A4%A7%E6%8B%AC%E5%8F%B7%E7%9A%84%E8%AF%9D%EF%BC%8C%E5%BC%95%E6%93%8E%E5%B0%B1%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%AF%86%E5%88%ABnames 这个变量。

    #set($name =“ricky”)

    Welcome $name to velocity.com

    2.2 循环

    在 Velocity 中循环语句的语法结构如下:

    #foreach($element in $list)

    This is $element

    $velocityCount

    #end

    Velocity 引擎会将 list 中的值循环赋给 element 变量,同时会创建一个 $velocityCount 的变量作为计数,从 1 开始,每次循环都会加 1.

    2.3 条件语句

    条件语句的语法如下:

    #if(condition)

    #elseif(condition)

    #else

    #end

    2.4 关系操作符

    Velocity 引擎提供了 AND、OR 和 NOT 操作符,分别对应&&、||和! 例如:

    #if($foo && $bar)

    #end

    2.5 宏

    Velocity 中的宏可以理解为函数定义。定义的语法如下:

    #macro(macroName arg1 arg2 …)

    #end

    调用这个宏的语法是:

    #macroName(arg1 arg2 …)

    这里的参数之间使用空格隔开,下面是定义和使用 Velocity 宏的例子:

    #macro(sayHello $name)

    hello $name

    #end

    #sayHello(“velocity”)

    输出的结果为 hello velocity

    2.6 内嵌和引用

    #parse 和 #include 指令的功能都是在外部引用文件,二者的区别是:

    #parse会将引用的内容当成类似于源码文件,会将内容在引入的地方进行解析

    #include是将引入文件当成资源文件,会将引入内容原封不动地以文本输出

    下面分别看两个例子:

    案例1:

    ## foo.vm 文件:

    #set($name =“velocity”)

    ## parse.vm文件:

    #parse(“foo.vm”)

    输出结果为:

    velocity

    案例2:

    ## foo.vm 文件:

    #set($name =“velocity”)

    ## include.vm:

    #include(“foo.vm”)

    输出结果为:

    #set($name =“velocity”)

    三、Spring整合velocity进行页面展示

    3.1 初步整合

    添加依赖

    org.apache.velocity

    velocity

    1.6.2

    org.apache.velocity

    velocity-tools

    2.0

    web.xml

    mvc-dispatcher

    org.springframework.web.servlet.DispatcherServlet

    contextConfigLocation

    classpath:springMVC.xml

    1

    mvc-dispatcher

    /

    编写/resources/spring-mvc.xml

    UTF-8

    UTF-8

    添加resources/velocity.properties

    ## 设置模板文件加载器,webapp从应用根目录加载

    resource.loader = webapp

    webapp.resource.loader.class = org.apache.velocity.tools.view.WebappResourceLoader

    ## 模板路径,根目录下的vm文件夹,比如访问http://localhost:8080/velocity/t.htm,则选中的模板路径是webapp/vm/t.htm,如果没配置,默认是模板路径是webapp/t.htm

    webapp.resource.loader.path = /vm

    ## 设置编码,不设置会中文乱码

    input.encoding = UTF-8

    output.encoding = UTF-8

    tools.view.servlet.layout.default.template=default.vm

    # 默认的布局文件位置

    tools.view.servlet.layout.directory=/WEB-INF/layout/

    编写webapp/vm/layout/layout.vm

    header

    $screen_content

    footer

    编写webapp/vm/test/index.vm

    hello world!${name}

    编写测试Controller

    import org.springframework.stereotype.Controller;

    import org.springframework.ui.Model;

    import org.springframework.web.bind.annotation.RequestMapping;

    /**

    * velocity与Spring MVC集成作为展示页面Demo

    */

    @Controller

    @RequestMapping(value = "/velocity")

    public class MyVelocityTestController {

    /**

    * 模拟首页

    *

    * @param model

    * @return

    */

    @RequestMapping(value = "/index")

    public String index(Model model) {

    String name = "tester";

    model.addAttribute("name", name);

    return "test/index";

    }

    3.2 velocity选择不同的模板

    系统中的登录页面所使用的模板与其他普通页面使用的模板不同,或者是某些页面需要引用不同的模板。

    先按照上节velocity(4) 的步骤配置好,通过以上配置后普通页面velocity会自动套用layout/default.vm模板。如果登录页面需套用自己独特的模板则如下可以在登录页面中添加:#set($layout="login_layout.vm"),则登录页面将套用"login_layout.vm"模板。

    编写webapp/vm/layout/empty.vm

    $screen_content

    webapp/test/login.vm

    #set($layout="layout/empty.vm")

    This is the login page

    完善测试controller

    import org.springframework.stereotype.Controller;

    import org.springframework.ui.Model;

    import org.springframework.web.bind.annotation.RequestMapping;

    /**

    * velocity与Spring MVC集成作为展示页面Demo

    */

    @Controller

    @RequestMapping(value = "/velocity")

    public class MyVelocityTestController {

    /**

    * 模拟首页

    *

    * @param model

    * @return

    */

    @RequestMapping(value = "/index")

    public String index(Model model) {

    String name = "tester";

    model.addAttribute("name", name);

    return "test/index";

    }

    /**

    * 模拟使用不一样模板的登录页

    *

    * @param model

    * @return

    */

    @RequestMapping(value = "/login")

    public String login(Model model) {

    return "test/login";

    }

    }

    测试

    测试1:访问localhost:8080/velocity/index

    bcba20eeab48

    test1

    测试2:访问localhost:8080/velocity/login

    bcba20eeab48

    test2

    可以看到,成功实现了不同页面引用和不引用公共模板的功能。

    四、参考资料

    展开全文
  • Velocity是一个基于java的模板引擎,它允许任何人仅仅使用简单的模板语言来引用由java代码定义的对象。 1 Velocity的简介 Velocity模板引擎, 作为一款成熟的基于java的模板引擎,能够帮我们实现页面静态化,同时它将...

    Velocity是一个基于java的模板引擎,它允许任何人仅仅使用简单的模板语言来引用由java代码定义的对象。

    1 Velocity的简介

    Velocity模板引擎, 作为一款成熟的基于java的模板引擎,能够帮我们实现页面静态化,同时它将Java代码与网页分开,将模板和填入数据整合,生成我们需要的页面.

    1 基本语法

    1 关键字

    Velocity模板中的关键字, 都是以#开头表示的

    • #set 设置一个变量
    • #if 条件分支判断
    • #else 另一个条件分支
    • #end 语句结束
    • #foreach 循环语句

    2 变量

    Velocity模板中的变量, 都是以$开头表示的

    如: $user用户 $password 用户密码

    {}变量

    对于明确的Velocity变量, 可以使用{}包括起来, 可以在页面上展示如下效果:

    u s e r N a m e , 此 时 页 面 上 可 以 表 示 为 {user}Name, 此时页面上可以表示为 userName,someoneName的效果.

    !变量

    如上述内容,Velocity模板中如果变量不存在, 在页面会显示 u s e r , 这 种 形 式 影 响 展 示 的 效 果 . 可 以 使 用 user, 这种形式影响展示的效果. 可以使用 user,.使!user表示.

    $!user表示, 存在则展示,不存在则为空白

    ## 定义一个user变量为李白, password变量为123456 
    #set{$user = "李白"}
    #set{$password = "123456"}
    
    ## 变量引用
    #set{$student.name = "李白"}
    ## 数字
    #set{$student.age = 22}
    ## 字符串
    #set{$student.class = "大班"}
    ## 属性引用  
    #set($student.address = $address.info)
    

    3 转义字符和逻辑操作符

    Velocity模板中转义字符是 \

    #set{$user = "李白"}
    ## 输入		结果
    $user		 李白
    \$user		 $user
    \\$user		 \李白
    \\\$user	 \$user
    

    && 且

    || 或

    ! 取反

    4 循环

    Velocity模板中list集合循环语法

    循环遍历,可以得到每个元素,每个元素的序号,以及总的集合长度

    #foreach ( $element in $list)
    	## 集合中每个元素
    	$element
    	## 集合的序号 从1开始
    	${velocityCount}
    	## 集合的长度
    	${list.size()}
    #end
    

    map集合循环语法

    #foreach ($entry in $map.entrySet())
    ## map的key   map的value值
    $entry.key => $entry.value
    #end
    

    5 条件

    Velocity模板中条件语法if-ifelse-else结构

    #if (condition1)
    	// 执行业务
    #elseif (condition2)
    	// 执行业务
    #else
    	// 执行业务
    #end
    

    常用的条件语句是if-else结构

    #if (condition1)
    	// 执行业务
    #else
    	// 执行业务
    #end
    

    #break

    表示跳出循环

    #if (condition1)
      ## 条件符合跳过
      #if($user == "李白")
        #break;
      #end
    #else
    	// 执行业务
    #end
    

    #stop

    表示终止指令,终止模板解析

    #if (condition1)
      ## 条件符合直接终止
      #if($user == "李白")
        #stop
      #end
    #else
    	// 执行业务
    #end
    

    6 注释

    单行注释 ##

    ## 定义一个user变量为李白
    #set{$user = "李白"}
    

    多行注释 #* *#

    #*  
      定义一个user变量
      将user变量赋值为 李白
    *#
    #set{$user = "李白"}
    

    文档注释 #** *#

     #** 
     	@version 1.1
     	@author  李白
     *#
    #set{$user = "李白"}
    

    7 引入资源

    #include

    表示引入外部资源,引入的资源不被引擎所解析

    #include( "one.gif","two.txt","three.htm" )
    

    #parse

    用于导入脚本, 引入的资源会被引擎所解析

    ##  a.vm文件
    #set($user = "李白")
    
    
    ## b.vm文件
    #parse("a.vm")
    ## 变量   值
    $user	  李白
    

    2 Velocity的使用

    Velocity常用的案例和工具类

    public class VelocityUtils {
    
        public static void main(String[] args) {
    
            // 模板路径
            String templatePath = "D:\\work";
            // 模板名称
            String templateName = "index.html.vm";
            // 生成文件路径
            String outFilePath = "D:\\index.html";
            // 模板中所需参数
            Map<String, Object> params = new HashMap<>();
            params.put("name", "world");
            List<String> list =  new ArrayList<>();
            list.add("李白");
            list.add("杜甫");
            list.add("陆游");
            params.put("list", list);
    
            getFile(templatePath,templateName,outFilePath,params);
        }
    
        /**
         * 读取本地模板,生成文件
         * @param templatePath  模板路径
         * @param templateName 模板名称
         * @param outFilePath 生成文件路径
         * @param params 模板中填充参数
         */
        public static void getFile(String templatePath, String templateName, String outFilePath,
                Map<String, Object> params) {
            try {
                // 创建属性
       			loadTemplateFileByTwo(templatePath);
    
                // 封装填充参数
                VelocityContext context = new VelocityContext(params);
                // 获取模板
                Template tpl = Velocity.getTemplate(templateName, "UTF-8");
                // 创建输出流
                Writer writer = new PrintWriter(new FileOutputStream(new File(outFilePath)));
                // 模板与数据填充
                tpl.merge(context, writer);
                // 刷新数据
                writer.flush();
    			writer.close();  
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
       /**
         * 送请求, 将生成的模板文件使用zip压缩包返回
         * @param response 响应对象
         * @param params 模板封装参数
         * @throws IOException
         */
        public static void createFile(HttpServletResponse response, Map<String, Object> params)
                throws IOException {
            
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            ZipOutputStream outZip = new ZipOutputStream(output);
    
            // 设置velocity资源加载器
            loadTemplateFileByOne();
    
            // 封装模板数据
            VelocityContext context = new VelocityContext(params);
    
            //获取模板列表
            List<String> templates = getTemplates();
            for (String template : templates) {
                // 渲染模板
                StringWriter sw = new StringWriter();
                Template tpl = Velocity.getTemplate(template, "UTF-8");
                tpl.merge(context, sw);
                
                // 添加数据
                outZip.putNextEntry(new ZipEntry(getFileName(template)));
                IOUtils.write(sw.toString(), outZip, "UTF-8");
                IOUtils.closeQuietly(sw);
            }
    
            IOUtils.closeQuietly(outZip);
            byte[] data = output.toByteArray();
    
            // 生成zip压缩包响应
            response.setHeader("Content-Disposition", "attachment; filename=\"template-file.zip\"");
            response.addHeader("Content-Length", String.valueOf(data.length));
            response.setContentType("application/octet-stream; charset=UTF-8");
            IOUtils.write(data, response.getOutputStream());
    
        }
    
        /**
         * 获取文件名
         */
        /**
         * @param template 模板名 如index.html.vm
         */
        private static String getFileName(String template) {
            return template.replace(".vm", "");
        }
    
        /**
         * 获取模板
         */
        private static List<String> getTemplates() {
            List<String> templates = Lists.newArrayList();
            // 后端相关模板
            templates.add("index.html.vm");
            return templates;
        }
        
    
        /**
         * 加载配置文件方法一  加载classpath目录下的vm文件
         */
        public static void loadTemplateFileByOne() {
            Properties p = new Properties();
            p.put("file.resource.loader.class",
                    "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
            Velocity.init(p);
        }
    
        /**
         * 加载配置文件方法二  加载绝对路径目录下的加载vm文件
         *
         * @param templatePath 模板路径
         */
        public static void loadTemplateFileByTwo(String templatePath) {
            Properties p = new Properties();
            // 设置模板加载路径 为D盘 work文件夹
            p.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, templatePath);
            Velocity.init(p);
        }
    
        /**
         * 加载配置文件方法三  使用配置文件
         *
         * @param propertiesPath ,如:/velocity.properties
         */
        public static void loadTemplateFileByThree(String propertiesPath) throws IOException {
            Properties p = new Properties();
            p.load(VelocityUtils.class.getClass().getResourceAsStream(propertiesPath));
            Velocity.init(p);
        }
    
    }
    

    其中index.html.vm模板文件在D:盘work文件夹中

    <table cellspacing="0" cellpadding="5" width="20%" >
    <tr>
    <td bgcolor="#eeeeee" align="center">
    Names:${name}
    </td>
    </tr>
    #foreach($name in $list)
    	<tr>
    	<td>
    	第${velocityCount}个, 名字为  $name , 总共 ${list.size()} 个
    	</td>
    	</tr>
    #end
    </table>
    

    生成的index.html文件

    <table cellspacing="0" cellpadding="5" width="20%" >
    <tr>
    <td bgcolor="#eeeeee" align="center">
    Names:world
    </td>
    </tr>
    	<tr>
    	<td>
    	第1个, 名字为  李白 , 总共 3 个
    	</td>
    	</tr>
    	<tr>
    	<td>
    	第2个, 名字为  杜甫 , 总共 3 个
    	</td>
    	</tr>
    	<tr>
    	<td>
    	第3个, 名字为  陆游 , 总共 3 个
    	</td>
    	</tr>
    </table>
    

    从上面测试的案例,可知,name参数有了, list集合参数有. 对于一些日常常规的循环条件判断等, Velocity模板引擎非常好用.

    参考资料:

    http://www.51gjie.com/javaweb/896.html

    https://yanglinwei.blog.csdn.net/article/details/119185550

    展开全文
  • velocity作为Java模版引擎的主要目的是为了允许任何人使用简单而强大的模板语言来引用定义在Java代码中的对象。在velocity文件中可以给该页面指定模版布局,从而节省了大量的时间去写通用的模版布局。可以定义变量,...

    前言

    关于velocity与SpringMVC的配置请参考前一篇文章,此处不再介绍。velocity作为Java模版引擎的主要目的是为了允许任何人使用简单而强大的模板语言来引用定义在Java代码中的对象。在velocity文件中可以给该页面指定模版布局,从而节省了大量的时间去写通用的模版布局。可以定义变量,与Java方法进行交互。

    定义一个layout模版

    在上一篇文章中提到了配置默认模版,当然也可以不使用默认模版即在要用到的页面的最上端写上

    ?

    1

    class="html plain">#set($layout='layout/yourlayout.vm')

    那么如何定义一个layout,看下面的例子:

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    ????

    $!page_title?测试layout页面

    ????

    ????

    ????

    ????

    ????

    ????

    ????$screen_content

    那么$screen_content所在的位置即是你所打开页面将要占用的位置。

    定义一个变量

    ?

    1

    2

    3

    #set($var='xxxx')

    ?

    ##输出上面的变量直接使用$var

    魂环数组或者list

    ?

    1

    2

    3

    #foreach($ele?in?$list)

    output?element:$ele

    #end

    条件判断

    ?

    1

    2

    3

    4

    5

    6

    7

    #if($var=='xxxx')

    it?is?right

    #elseif($var=='')

    sorry

    #else

    it?is?wrong

    #end

    内置对象

    类似于JSP,velocity也有自己的内置对象,如$request,$response,$session这样以来我们就可以将Java对象request和response以及session里的东西轻而易举的展现在web页面里。

    自定义标签(指令)

    velocity同时也支持自定义标签,或者称为指令。如果查看velocity的源码就会发现有个directive.properties

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    directive.1=org.apache.velocity.runtime.directive.Foreach

    directive.2=org.apache.velocity.runtime.directive.Include

    directive.3=org.apache.velocity.runtime.directive.Parse

    directive.4=org.apache.velocity.runtime.directive.Macro

    directive.5=org.apache.velocity.runtime.directive.Literal

    directive.6=org.apache.velocity.runtime.directive.Evaluate

    directive.7=org.apache.velocity.runtime.directive.Break

    directive.8=org.apache.velocity.runtime.directive.Define

    directive.9=org.apache.velocity.runtime.directive.Stop

    这里正是velocity当前所提供的9个标签(指令),下面我们新添加一个指令say

    ?

    1

    2

    3

    ??#say("hello")

    java代码实现

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    import?java.io.IOException;

    import?java.io.Serializable;

    import?java.io.StringWriter;

    import?java.io.Writer;

    import?java.util.HashMap;

    import?java.util.Map;

    ?

    import?org.apache.velocity.VelocityContext;

    import?org.apache.velocity.app.VelocityEngine;

    import?org.apache.velocity.context.InternalContextAdapter;

    import?org.apache.velocity.exception.MethodInvocationException;

    import?org.apache.velocity.exception.ParseErrorException;

    import?org.apache.velocity.exception.ResourceNotFoundException;

    import?org.apache.velocity.runtime.directive.Directive;

    import?org.apache.velocity.runtime.parser.node.Node;

    import?org.apache.velocity.runtime.parser.node.SimpleNode;

    import?org.springframework.beans.factory.annotation.Autowired;

    ?

    import?com.alibaba.citrus.service.template.TemplateService;

    import?com.alibaba.click.util.HostUtil;

    ?

    public?class?Say?extends?Directive{

    ?????

    ????@Autowired

    ????TemplateService?templateService;

    ?????

    ????private?static?final?VelocityEngine?velocityEngine?=?new?VelocityEngine();

    ?

    ????@Override

    ????public?String?getName()?{

    ????????return?"say";

    ????}

    ?

    ????@Override

    ????public?int?getType()?{

    ????????return?LINE;

    ????}

    ?

    ????@Override

    ????public?boolean?render(InternalContextAdapter?context,?Writer?writer,

    ????????????Node?node)?throws?IOException,?ResourceNotFoundException,

    ????????????ParseErrorException,?MethodInvocationException?{

    ????????SimpleNode?sn?=?(SimpleNode)?node.jjtGetChild(0);???

    ????????writer.write((String)sn.value(context));

    ????????return?true;

    ????}

    ?????

    }

    接下来就可以在velocity.properties文件里添加上

    ?

    1

    say=cn.buglife.demo.msv.directive.Say

    劳动所得 不喜勿喷:获取【下载地址】

    8c8418e8c94c5f729bd97038d9412058.png

    展开全文
  • Java Velocity模板引擎详解Velocity是一个基于java的模板引擎(template engine),它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。它作为一款成熟的基于java的模板引擎,能够帮...
  • Velocity语法

    2021-02-26 14:26:21
    1.变量(1)变量的定义:#set($name = "hello")说明:velocity中变量是弱类型的。当使用#set指令时,括在双引号中的字面字符串将解析和重新解释,如下所示:#set($directoryRoot = "www" )#set($templateName = "index...
  • 我要在前台页面展示的数据是后台java对象中一个引用类型属性中的普通属性:如要展示order对象下的orderConsumer下的orderID,该怎么写呢?
  • Velocity 语法

    2021-02-28 10:45:34
    Velocity Notes变量名$name为空时打印变量本身。$!name为空时打印空字符串(不打印任何内容)。${name}类似$name,为空时原样打印。但可以将变量和连续的字符串分隔,例如:${name}space。$!{name}类似$!name,为空时...
  • java开发的朋友一般对JSP是比较熟悉的,大部分人第一次学习开发View层都是使用JSP来进行页面渲染的,我们都知道JSP是可以嵌入java代码的,在远古时代,java程序员甚至在一个jsp页面上就完成了所有的业务逻辑代码,能够...
  • velocity使用1.7版本。 在win7下使用intelliJ IDEA建立一基于tomcat的web app项目,命名为todo_web,设置path为/todo,导入velocity相关jar包。只导入velocity-1.7.jar这个包可能会报错,根据提示再导入velocity自带...
  • //获取返回的消息体 ...//序列化java对象为json以及json字符串反序列化为java对象。 ObjectMapper mapper = new ObjectMapper(); List<ServTempDeviceEntity> list = mapper.convertValue(list1, ne..
  • Velocity可以获取java语言中定义的对象,从而实现界面和java代码的真正分离,这意味着可以使用velocity替代jsp的开发模式了提示:velocity中大小写敏感。基本的Velocity语法1、"#"用来标识Velocity的脚本语句,...
  • 它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象,这样的话其实在前后端分离而言又是一个较为合理的可选方案,Velocity也可以配合其他的语言来完成使用,Velocity.js就是不错的...
  • Velocity

    2021-04-11 10:01:08
    一、模板引擎有什么用?...使用模板引擎的好处就在于开发者和设计者能够以最合适的方式操作和利用数据,Velocity就是一个模板引擎的绝佳范例。Velocity的英文含义是“速度、流通速度、速率;迅速,快速...
  • 一、.vm模板文件,例如一个名为test.vm的模板文件${name}#foreach($...#endvar obj = {//对象加逗号,用$velocityCount判断是否是最后一个#foreach($nameObj in $inputNewNames)"$nameObj":$nameObj#if($veloci...
  • Java-获取时间戳、util.Date、sql.Date类的使用 1.获取时间戳 获取系统当前时间:System类中的currentTimeMillis() package com.lmw.time; import org.junit.Test; import java.util.Date; /** * @author * @...
  • 操作步骤:1....编写命令对象对应的类:如在ins.portal.common包下定义DateUitl.java类,其内容如下:package ins.portal.common;import java.text.SimpleDateFormat;import java.util.Date;public c...
  • JAVA模板引擎velocity语法讲解

    千次阅读 2019-01-15 15:14:09
    Velocity 是一个基于 Java 的模板引擎,它允许用户使用简单的模板语言来引用由 Java 代码定义的对象。当 Velocity 应用于 Web 开发时,界面设计人员可以和 Java 程序开发人员同步开发一个遵循 MVC 架构的 Web 站点。...
  • 近日的业务逻辑代码繁重,许多都是一些重复性的工作,索性花了几天时间做了一个可扩展的代码生成器 分分钟完成domain—>ServiceImpl的所有代码,欢迎大家支持鸭 项目地址:Orange ...SysLogLoginDO.java BasicD
  • 一、总结在Webx的Velocity获取url中参数:$rundata.getRequest().getParameter('userId')在Webx项目中,防止CSRF攻击(Cross-site request forgery,跨站请求伪造),在form表单提交中要加入$!csrfToken....
  • Java的时间日期API

    2021-02-26 17:13:37
    Java为我们提供的时间日期的类有老的java.util.Date和java.util.Calender,以及新的java.time包java.time包基于Joda-Time库构建本章学习目标:掌握Java8中提供的java.time包中的常用日期类与相关方法可以从java.util...
  • Velocity模板生成文件

    2020-10-30 17:26:50
    它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计...
  • VELOCITY 数组操作

    千次阅读 2021-02-26 18:38:23
    常用方法:$myarray.isEmpty()数组是否为空$myarray.size()获取数组元素... 访问Velocity 访问数组对象,无法通过类似 arr[2] 来访问特定位置的元素。#set($arr = [0, 1, 2, 3])$arr.get(2)注:Velocity 中的数组对...
  • 后来页面不用jsp,开发了,换成velocity展示了。想着生成页面也使用velocity。但是发现读取文件的类库加载不进来。2,解决import org.apache.velocity.VelocityContext;import org.apache.velocity....import java....
  • 它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员...
  • java-velocity的用法

    千次阅读 2017-10-16 20:37:26
    转自:http://www.busfly.net/csdn/post/java-velocity.html  这是一篇JAVA的基础文章,大家耐心点看完的话肯定会有收获的,中国自学编程网 [www.zxbc.cn] 整体提供 变量 (1)变量的定义: #set($name = \"hello...
  • velocity基本用法

    2021-10-13 23:50:31
    基本用法1.1 注释1.2 替换变量1.3 不解析,原文输出1.4 调用对象方法指令setif else 基本用法 导入依赖 <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity<...
  • Java导出excel基于velocity模板引擎

    千次阅读 2019-07-29 16:04:49
    项目地址: GitHub https://github.com/wusas/java-excel-velocity 项目结构: ├─.idea │ ├─inspectionProfiles │ ├─libraries │ └─sonarlint │ └─issuestore ├─.mvn │ └─wrapper ├─src │ ├...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,284
精华内容 6,113
关键字:

java对象 velocity 获取