java velocity详解_[velocity] velocity详解

(1)为什么要使用模版语言?

在服务器端可以使用 Velocity处理模板和生成的动态内容(HTML、XML等)。这和JSP技术的目标非常接近。但是,JSP模型可以毫无阻碍地访问底层的Servlet API和Java编程语言。它基本上是一种在很大程度上开放的访问模型。而作为一种完全自包含的模板引擎和脚本解释器,Velocity拥有完全封闭的模型。任何针对系统和/或Java编程语言的访问都必须明确地启用。默认情况,Velocity模板中不能访问Java编程语言的任何方面。这种封闭的模型使Velocity能够提供分离的模板表示层,与任何应用程序业务逻辑或者数据管理代码清晰地划分开。从而保证了web site的长期可维护性.

第一次解释jsp需要经过转换成java代码,再编译成class文件等步骤,而velocity则在速度上更快,因为它不需要经过像解释jsp页面那么多的步骤,其次velocity也可以用作其它实现的模板技术,像我在项目中就遇到过使用velocity来作为邮件的模板,而jsp显然做不到这样的功能。

拓展:在java领域,表现层技术主要有三种:jsp、freemarker、velocity。

jsp是大家最熟悉的技术

优点:

1、功能强大,可以写java代码

2、支持jsp标签(jsp tag)

3、支持表达式语言(el)

4、官方标准,用户群广,丰富的第三方jsp标签库

5、性能良好。jsp编译成class文件执行,有很好的性能表现

缺点:没有明显缺点,非要挑点骨头就是,由于可编写java代码,如使用不当容易破坏mvc结构。

velocity是较早出现的用于代替jsp的模板语言

优点:

1、不能编写java代码,可以实现严格的mvc分离

2、性能良好,据说比jsp性能还要好些

3、使用表达式语言,据说jsp的表达式语言就是学velocity的

缺点:

1、不是官方标准 2、用户群体和第三方标签库没有jsp多 3、对jsp标签支持不够好

freemarker 也是一种模版引擎语言

优点:

1、不能编写java代码,可以实现严格的mvc分离

2、性能非常不错

3、对jsp标签支持良好

4、内置大量常用功能,使用非常方便

5、宏定义(类似jsp标签)非常方便

6、使用表达式语言

缺点:

1、不是官方标准 2、用户群体和第三方标签库没有jsp多

综合对比:

1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。

2、freemarker宏定义比jsp tag方便,内置大量常用功能,比如html过滤,日期金额格式化等等,支持jsp标签。且freemarker和velovity一样,作为模版语言,都可以实现严格的mvc分离。

(2)Velocity模版语言(VTL)使用详解

① VTL变量声明

所有的VTL statement都是以#开头,且包含一个指示符,当客户访问你的页面时, the Velocity Templating Engine将搜索页面中的所有#符号,如果确定这是一个VTL声明时就按一定规则处理动态内容,符号#仅仅只是表明这可能是一个VTL声明.记住以下的规则:

使用$字符开始的references用于得到什么;使用#字符开始的directives用于作些什么。

在下面的例子中,一个值被分配给$foo变量,并在其后被引用。

#set ( $foo = “Velocity” )

Hello $foo World!

上面的实现结果是在页面上打印“Hello Velocity World!”

② 注释语法

单行注释:##内容

多行注释:#* 内容 *#

文档格式:#** 内容  *#

③ 正式引用标记

${mudSlinger}     变量

${customer.Address}   属性

${purchase.getTotal()}   方法

如果写成如下的语法格式,当值为null的时候会原样输出字符串

$mudSlinger     变量

$customer.Address   属性

$purchase.getTotal()   方法

所以尽量使用正式的标记或者可以写成如下的方式:

$!mudSlinger     变量

$!customer.Address   属性

$!purchase.getTotal()   方法

也可以一同使用

$!{mudSlinger}     变量

$!{customer.Address}   属性

$!{purchase.getTotal()}   方法

拓展:$customer.address 引用时,查找顺序是:

1.getaddress() 2. getAddress() 3. get(“address”) 4. isAddress()

④ 如何在velocity中使用特殊字符?

$字符:货币字符

在VTL中使用$2.5这样的货币标识是没有问题得的,VTL不会将它错认为是一个reference,因为VTL中的reference总是以一个大写或者小写的字母开始。但还是要明白,VTL中使用“\”作为逃逸符。如:\$name将会输出$name字符串。

⑤ 常用基础语法

1)条件语句

#if ( $foo )  1  #else  2  #end

上例中的条件语句将在以下两种条件下成立:

1.$foo是一个boolean型的变量,且它的值为true

2.$foo变量的值不为null

#if( $foo 

2)循环语句

#foreach ( $product in $allProducts )

这是第$velocityCount次循环,值为: $product

#end

每次循环$allProducts中的一个值都会赋给$product变量。

$velocityCount 变量的名字是Velocity默认的名字,你也可以通过修改velocity.properties文件来改变它。默认情况下,计数从“1”开始,但是你 可以在velocity.properties设置它是从“1”还是从“0”开始。下面就是文件中的配置:

directive.foreach.counter.name = velocityCount

directive.foreach.counter.initial.value = 1

现在我们假设$allProducts是一个Hashtable,如果你希望得到它的key应该像下面这样:

#foreach ( $key in $allProducts.keySet() )

Key: $key -> Value: $allProducts.get($key) 

#end

3) 关系、逻辑运算符

相等 ==不等!=且&&或||非!

4) include

#include script element允许模板设计者引入本地文件。被引入文件的内容将不会通过模板引擎被render。为了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目录下。

#inclued ( “one.txt” )

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

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

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

#inclue ( “greetings.txt”, $seasonalstock )

5) parse

#parse script element允许模板设计者一个包含VTL的本地文件。Velocity将解析其中的VTL并render模板。

#parse( “me.vm” )

就像#include,#parse接受一个变量而不是一个模板。任何由#parse指向的模板都必须包含在TEMPLATE_ROOT目录下。与#include不同的是,#parse只能指定单个对象。

你可以通过修改velocity.properties文件的parse_direcive.maxdepth的值来控制一个template可以包含的最多#parse的个数――默认值是10。#parse是可以递归调用的

6) Range Operator

#foreach ( $bar in [2..-2] )  $bar #end

结果:2 1 0 -1 -2

#set ( $arr = [0..1] )

#foreach ( $i in $arr ) $i #end

结果:0 1

7) 内置对象

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

$request、$response、$session,另外,模板内还可以使用$msg内的消息工具访问Struts的国际化资源,达到简便实现国际化的方法。

8) 四则运算

直接进行四则运算将会默认为字符串连接,因此运算应该是如下的方式解决。

如果$foo=2.则$foo + 1 结果是21,而不是3.

需要先#set ( $value = $foo + 1 ) ,然后$value结果才是3

9) 解析步骤

当Velocity应用在应用程序时,一般分一下几步:

初始化Velocity==>创建context对象==>添加数据到context==>选择模板==>合并模板和数据,产生输出页面

10) velocity.properties文件详解(在spring集成的时候主要是配置在prop标签中)

1. tools.view.servlet.error.template = error.vmzd

处理错误信息的模板路径

2. tools.view.servlet.layout.directory = /WEB-INF/layout/ 所有布局文件的默认路径

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

默认的布局文件

4. #模板编码:

input.encoding=ISO-8859-1 //模板输入编码

output.encoding=ISO-8859-1 //模板输出编码

5. velocimacro.library=/WEB-INF/vm/macro.vm,/WEB-INF/vm/tuanmacro.vm

是一个逗号分隔的所有Velocimacro模板库的列表

(3)如何把VTL集成到spring的项目框架中?

① 需要的jar包

commons-collections.jar

velocity-1.5.jar

velocity-dept.jar

velocity-tool-view1.4.jar

② 引入Velocity包

在application-context.xml配置文件里配置VelocityConfigurer,当然也可以在dispatcher-servlet(application-springmvc.xml)里面配置,这完全取决于你自己的想法。

下面的配置使Spring能够知道我们的模板文件是放在哪里的

在dispatcher-servlet里配置VelocityViewResolver

下面的配置则是针对一个模板文件使用的是什么后缀。

本项目例子:

36a6fe3b7e856968cc8945dedab8b46d.png

a31de1225a19ed84635c87765690db39.png

a5bfb15d64b67ef905a17ed0fa876faa.png

格式化时间:

$date.format('yyyy-MM-dd HH:mm:ss',$element.createTime)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pc端游戏修改器_原神:不要吐槽手机内存了,想要获得最佳游戏体验,PC端最合适...

想必大家这段时间都被一个米哈游公司的游戏给刷屏了吧,它就是号称用时三年,斥资一亿美元打造的《原神》,正是这种情况下,原神的关注远远要高于其他游戏,并且玩家的期望值也是和关注度成正比。但是,一经发布…

java调用命令行命令_Java命令行界面(第4部分):命令行

java调用命令行命令我的Java命令行解析系列的第四部分介绍了Commandline ,它被描述为 “用于解析命令行参数的Java库”,它“基于使用注释从命令行参数到对象的映射”。 像以前介绍的args4j和jbock一样, Commandline使用注释来提供潜在命令行…

JVM 内存示意图(内存结构图/内存解析图)

图 1: 图 2: 图 3: 图 4:

java登录界面命令_Java命令行界面(第8部分):Argparse4j

java登录界面命令Argparse4j是“ Java命令行参数解析器库”,其主页将其描述为“基于Python的argparse模块的Java命令行参数解析器库”。 在本文中,我将简要介绍如何使用Argparse4j 0.7.0处理命令行参数,该参数类似于本系列中的前七篇文章中有…

协议管理模块设计

文章目录协议和合同的区别协议表说明协议签署日志协议和合同的区别 如果协议的内容写得比较明确、具体、详细、齐全,并涉及到违约责任,即使其名称写的是协议,也是合同;如果协议的内容写得比较概括、原则、很不具体,也…

java登录界面命令_Java命令行界面(第7部分):JCommander

java登录界面命令这是我系列的第七篇文章,简要介绍了用于处理Java命令行参数的各种库。 这篇文章回到了基于注释的库的覆盖范围,该库似乎是在Java中可用于处理命令行参数的众多可用库中知名度最高,最受欢迎的库之一: JCommander 。…

java体系技术框架_java框架之Spring 核心框架体系结构

很多人都在用spring开发java项目,但是配置maven依赖的时候并不能明确要配置哪些spring的jar,经常是胡乱添加一堆,编译或运行报错就继续配置jar依赖,导致spring依赖混乱,甚至下一次创建相同类型的工程时也不知道要配置哪…

IntelliJ IDEA中打开项目时用 Import Project(导入项目) 和 Open(打开项目) 的区别

文章目录创建测试目录使用 Open 方式打开用 Import Project 方式打开用 Open 方式打开文件夹下的多个项目用 Import Project 的方式打开多个项目总结对于 IDEA 中如下图所示的 Import Project 和 Open Project 的区别,一开始不明白怎么回事,网上看了很多…

java命令模式返回值_JAVA 设计模式 命令模式

目录用途命令模式 (Command)将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或请求日志,以及支持可撤销的操作。命令模式是一种行为型模式。结构图-命令模式结构图Command: 用来声明执行操作的接口。abstract…

IntelliJ IDEA for Mac 如何创建普通的Java项目_创建项目_新建项目

文章目录创建 Java 新项目的流程普通 Java 项目结构Java 项目结构特例讲解创建 Java 新项目的流程 Create New Project Empty Project (1)选择【Empty Project】,则项目不会自动创建模块,项目创建成功之后,会自动弹出…

java 集成开发工具_最好的Java开发人员测试和集成工具

java 集成开发工具通过从您的应用程序学习企业APM产品,发现更快,更有效的性能监控。 参加AppDynamics APM导览! 无论您是刚刚起步还是已经从事了一段时间,使用正确的工具进行编程都可以对项目的成功产生巨大的影响。 适当的工具使…

aws高额账单_取消堆放以提高延迟并减少AWS账单

aws高额账单大多数性能问题可以通过几种不同的方式解决。 多数人都容易理解和应用许多适用的解决方案。 一些解决方案(例如从JVM管理的堆中删除某些数据结构)更加复杂。 因此,如果您不熟悉此概念,我建议您继续学习我们最近如何减少…

Iphone 手机如何导入/导出通讯录

打开苹果云官网,选择「通讯录」,点击左下角的「设置」,可以看到导入/导出菜单 点击进入 icloud 官网

intellij远程调试_IntelliJ中的远程调试Wildfly应用程序

intellij远程调试远程调试Java应用程序意味着使用本地开发环境连接到远程运行的应用程序。 Java开箱即-agentlib:jdwp[options]支持远程调试:目标应用程序必须使用-agentlib:jdwp[options]选项执行, -agentlib:jdwp[options]选项加​​载Java调试线协议&…

微信小程序注册/登录接口开发

文章目录后端有关说明前端有关说明接口设计小程序注册/登录接口APP 注册/登录接口PC Web 端的注册/登录接口小程序注册/登录序列图校验 token后端有关说明 登录和注册的逻辑要独立抽取写成2个接口:注册接口、登录接口 小程序、APP、PC端的登录接口和注册接口要分开…

couchbase_使用Portworx和Couchbase的有状态容器

couchbase容器本应是短暂的,因此可以很好地扩展以用于无状态应用程序。 有状态的容器(例如Couchbase)需要区别对待。 管理Docker容器的持久性概述了如何管理有状态容器的持久性。 该博客将说明如何使用Docker Volume Plugins和Portworx创建有…

在 MyEclipse 中配置 tomcat

在 IDE 配置 tomcat 实则就是让 IDE 来管理 tomcat 配置 步骤 1 点击工具栏上的“Run/Stop/Restart MyEclipse Servers”图标旁边的下拉箭头 步骤 2 选择“Configure Server” 步骤 3 在弹出的对话框“Preferences”中展开“MyEclipse” – “Servers” – “Tomcat”–“To…

java 中怎么加汉字,jquery怎么向body里面增加文字

jquery如何向里面增加文字jsp代码是这样的:我想在页面加载时动态的将一行文字增加到里面,不知道为什么总是加不进去,js代码如下:$(document).ready(function(){if($("#type").val()"MESSAGE") {$(".ke-t…

MacBook 推出移动硬盘时总是提示有程序在使用它,如何解决?

如下图所示: 先使用命令 df -lh 在终端查看当前系统的所有硬盘,命令如下: liaowenxiongliaowenxiongdeMacBook-Air ~ % df -lh Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/disk1s5s1 234Gi…

java登录界面命令_Java命令行界面(第5部分):JewelCli

java登录界面命令细算在Java命令行处理与Apache的百科全书CLI , args4j , jbock和命令行中先前的文章,我把注意力转向在这个岗位使用JewelCli完成的命令行参数相似的处理Java中。 几个Java命令行处理库使用批注来定义命令行选项。 到目前为止…