Velocity增加自定义标签的方法
- 格式:docx
- 大小:224.53 KB
- 文档页数:6
velocity模板Velocity模板。
Velocity是一种用于生成文本输出的模板语言,它可以用于生成HTML、XML、JSON等各种文档格式。
Velocity模板可以帮助开发人员将数据和模板进行分离,提高了代码的可维护性和可读性。
本文将介绍Velocity模板的基本语法和常见用法,希望能够帮助大家更好地理解和使用Velocity模板。
1. 变量定义和输出。
在Velocity模板中,可以使用$符号来引用变量,变量的定义和赋值使用#set指令。
例如:```。
#set($name = "Velocity")。
Welcome to $name!```。
上面的例子中,我们定义了一个名为name的变量,并将其赋值为"Velocity",然后通过$name来引用这个变量。
在模板输出中,$name会被替换为实际的数值,输出结果为:```。
Welcome to Velocity!```。
2. 条件判断。
Velocity模板中的条件判断使用#if指令。
例如:```。
#set($score = 85)。
#if($score >= 60)。
You have passed the exam.#else。
You have failed the exam.#end。
```。
在上面的例子中,我们定义了一个名为score的变量,并根据其数值进行条件判断。
如果score大于等于60,则输出"You have passed the exam.",否则输出"You have failed the exam."。
3. 循环。
Velocity模板中的循环使用#foreach指令。
例如:```。
#set($list = ["apple", "banana", "orange"])。
#foreach($item in $list)。
Velocity教程⼀、基本语法1、"#"⽤来标识Velocity的脚本语句,包括#set、#if 、#else、#end、#foreach、#end、#iinclude、#parse、#macro等;如:#if($info.imgs)<img src="$info.imgs" border=0>#else<img src="noPhoto.jpg">#end2、"$"⽤来标识⼀个对象(或理解为变量);如如:$i、$msg、$TagUtil.options(...)等。
3、"{}"⽤来明确标识Velocity变量;⽐如在页⾯中,页⾯中有⼀个$someonename,此时,Velocity将把someonename作为变量名,若我们程序是想在someone这个变量的后⾯紧接着显⽰name字符,则上⾯的标签应该改成${someone}name。
4、"!"⽤来强制把不存在的变量显⽰为空⽩。
如当页⾯中包含$msg,如果msg对象有值,将显⽰msg的值,如果不存在msg对象同,则在页⾯中将显⽰$msg字符。
这是我们不希望的,为了把不存在的变量或变量值为null的对象显⽰为空⽩,则只需要在变量名前加⼀个“!”号即可。
如:$!msg⼆、在EasyJWeb中的最佳实践 理论上你可以在EasyjWeb模板使⽤所有Velocity的脚本及功能,但我们不推荐你在界⾯模板中使⽤过多过复杂的脚本表达⽅式,在万不得已的情况下,不要在界⾯模板中加⼊任何复杂的逻辑,更不要在界⾯模板中加⼊变量声明、逻辑运算符等等。
在EasyJWeb中,我们提供了五条基本的模板脚本语句,基本上就能满⾜所有应⽤模板的要求。
这四条模板语句很简单,可以直接由界⾯设计⼈员来添加。
在当前很多EasyJWeb的应⽤实践中,我们看到,所有界⾯模板中归纳起来只有下⾯四种简单模板脚本语句即可实现:1、$!obj 直接返回对象结果。
2.Escaping Valid VTL References(封装有效的引用)如下示,如果没有#set( $email = "foo" )这一行且java代码中Context对象中没有放放email对象,将直接输出$email.#set( $email = "foo" )$email如果email己定义了 (比如它的值是foo),而这里你却想输出$email. 这样一个字符串,就需要使用转义字符”\”.## The following line defines $email in this template:#set( $email = "foo" )$email\$email\\$email\\\$email上面的模板在web页面上的输出将是:foo$email\foo\$email但如果email并没有定义,我们这样写:.$email\$email\\$email\\\$email输出就原封不动了:$email\$email\\$email\\\$email注意:当己定义变量和未定义变量一起输出时,会输出字面意思,如下便,$moon是未定义的:#set( $foo = "gibbous" )$moon = $foo输出到web页面中将是$moon = gibbou11.Case Substitution(可选的格式)至此,你对velocity的refenerce己比较熟悉了, 你可以在你的模板中开始应用这些功能. 但你还可以知道的是Velocity references从java语法中汲取了一些优点以便模板设计者更容易使用VTL.比如:$foo$foo.getBar()## 等同于$foo.Bar$data.setUser("jon")##等同于#set( $er = "jon" )$data.getRequest().getServerName()##等同于$data.Request.ServerName## is the same as${data.Request.ServerName}这里示例了你可选的一些引用方式. VTL汲取了java语法和java bean的一些简洁语法以解析java代码中Context中的对象和这些对象的命令及属性---这样,一个java对象的所有功能都可以展示到视图中了.Velocity也借见了java Bean的规范(Bean specifications defined by Sun Microsystems), 是大小写敏感的; 但Velocity会尽可能的帮你修正错误. 当命令getFoo()通过指令 $bar.foo在模板中引用时,Velocity的搜索规则我们在前面己讲了,你还记得是什么吗?.注意:模板中引用的必须是通过java Bean中的getter/setter 实现的,而直接的java对象的数据域是不能直接引用的,如$ 会解析到 class Foo's getName() 的实例方法,但不会解析到Foos类的public Name 这个实例变量.12.Directives(指令符号)模板设计者使用“引用“生成动态内容, 指令(directives)–简单的说就是设计者在模板中操作java 对象—让视图设计者全面控制输出内容的格式.指令总是以 #开头后面紧跟具体的指令符. 就像引用一样(指令的一种),可以将指令理解为”表示这里是一个什么东东).如下例生成一个出错提示:#if($a==1)true enough#elseno way!#end这个例子中应使用括号将else分开.#if($a==1)true enough#{else}no way!#end1.#set指令#set用来给一个引用赋值.值可以被赋给变量引用或属性引用, 但要将它们放入括号中,如下示:#set( $primate = "monkey" )#set( $customer.Behavior = $primate )“左操作数被赋值“是引用操作的一个规则.=号右侧可能是以下类型之一:∙Variable reference变量引用∙String literal字符串∙Property reference 属性引用∙Method reference 命令引用∙Number literal 数字∙ArrayList 数组∙Map 映射下面是对上述类型设置的示例:#set( $monkey = $bill ) ## variable reference#set( $monkey.Friend = "monica" ) ## string literal#set( $monkey.Blame = $whitehouse.Leak ) ## property reference#set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference#set( $monkey.Number = 123 ) ##number literal#set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList#set( $monkey.Map = {"banana" : "good", "roast beef" : "bad"}) ## Map注意: 在ArrayList类型引用的例子中,其原素定义在数组 [..]中, 因此,你可以使表$monkey.Say.get(0)访问第一个元素.类似的,引用Map 的例子中, 原素定义在 { } 中,其键和值间以:隔成一对,使用$monkey.Map.get("bannana") 在上例中将返回 'good', ( $monkey.Map.banana也会有同样效果).下面是一般的计算表达式:#set( $value = $foo + 1 )#set( $value = $bar - 1 )#set( $value = $foo * $bar )#set( $value = $foo / $bar )但注意:如果右边的操作数是一个属性或命令的引用而返回null,那么赋值将不会成功,且在随后的VTL 中也不能再取出使用. 如下例:#set( $result = $query.criteria("name") )The result of the first query is $result#set( $result = $query.criteria("address") )The result of the second query is $result如果$query.criteria("name")返回的是字符串 "bill", 但$query.criteria("address")返回null, 上面的TVL输出结果将是:The result of the first query is billThe result of the second query is bill这对与初学者的理解有些麻烦,比如在#foreach loops中,你使用#set给一个属性或命令赋值时,如下例示:#set( $criteria = ["name", "address"] )#foreach( $criterion in $criteria )#set( $result = $query.criteria($criterion) )#if( $result )Query was successful#end#end在上例中,就不能依赖if( $result )来决定查询是否成功. $result一但被#set 为null (context会同样), 它将不能被赋其它值 (不能从 context中取出).一个解决办法是,每次都将$result设为false. 如果$query.criteria()调用成功,就可以检测到. #set( $criteria = ["name", "address"] )#foreach( $criterion in $criteria )#set( $result = false )#set( $result = $query.criteria($criterion) )#if( $result )Query was successful#end#end注意:#set不需要使用#end来声明结尾.2.Literals (语义解析)使用#set指令时,变量如果用“”引起会被解析,如:#set( $directoryRoot = "www" )#set( $templateName = "index.vm" )#set( $template = "$directoryRoot/$templateName" )$template输出的将是:www/index.vm但当用单引号引起来时,就不会被解析::#set( $foo = "bar" )$foo#set( $blargh = '$foo' )$blargh输出后会是:bar$foo默认情况下,不会解析单引号中的变量,当然,这可以通过改变Velocity的配置参数来改变:velocity.properties such that stringliterals.interpolate=false.另外, 指令#literal元素可以用来输出字面意思,如下示.#literal()#foreach ($woogie in $boogie)nothing will happen to $woogie#end#end会输出::#foreach ($woogie in $boogie)nothing will happen to $woogie#end3.Conditionals(条件判断)1.If / ElseIf / Else#if指令用来根据条件在页面中输出内容, 如下简单的例子:#if( $foo )<strong>Velocity!</strong>#end根据变量$foo计算后是否为true决定输出, 这会有两种情况: (i) $foo的是值是一个boolean (true/false)型并有一个true value, 或(ii) 它是一个非null值. 要记者,Velocity context 中只能包含Objects, 因此当我们讲'boolean'时, 它就是一个Boolean (the class).在#if和#end的内容是否会输出,由$foo是否为true决定. 这里,如果$foo is true, 输出将是: "Velocity!". 如果$foo为null或false,将不会有任何输出.#elseif或#else可以#if和组合使用. 如果第一个表达式为true,将会不计算以后的流程,如下例假设t $foo是15 and $bar产6.#if( $foo < 10 )<strong>Go North</strong>#elseif( $foo == 10 )<strong>Go East</strong>#elseif( $bar == 6 )<strong>Go South</strong>#else<strong>Go West</strong>#end输出将会是Go South.2.Relational and Logical Operators(关系和逻辑运算)Velocity使用==来做比较,如下例.#set ($foo = "deoxyribonucleic acid")#set ($bar = "ribonucleic acid")#if ($foo == $bar)In this case it's clear they aren't equivalent. So...#elseThey are not equivalent and this will be the output.#end注意:==计算与java中的==计算有些不同:不能用来测试对象是否相等(指向同一块内存). Velocity 中是否相等仅直接的用来比较numbers, strings的值, or objects的toString()结果是否相等. 如果是不同的对象,会调用它们的toString()命令结果来比较.Velocity也使用AND, OR and NOT 执行逻辑运算.详细说明请参看《VTL参考中文版》,如下是一些简单示例:## logical AND#if( $foo && $bar )<strong> This AND that</strong>#end仅当$foo$bar和都为true时,#if()才会输出中间内容.OR 运算例子## logical OR#if( $foo || $bar )<strong>This OR That</strong>#end$foo或$bar只要有一个为true就可以输出。
java模板引擎velocity 方法Velocity是一种基于Java的模板引擎,它以其强大灵活的功能在Java开发中被广泛应用。
本文将介绍Velocity模板引擎的方法,包括模板语法、变量引用、条件判断、循环控制以及自定义指令。
模板语法:Velocity模板使用简洁而灵活的语法,允许将静态的模板与动态的数据结合,生成最终的输出。
1. 变量引用:在Velocity模板中,可以通过使用`${}`语法来引用变量。
变量可以是一般的Java对象或者是Velocity上下文中设置的变量。
2. 简单示例:以下是一个简单的Velocity模板示例,展示了如何引用变量:```<html><head><title>${title}</title></head><body><h1>Welcome, ${name}!</h1></body></html>在这个示例中,`${title}`和`${name}`分别引用了两个变量,通过将这些变量与具体的值进行绑定,可以生成最终的HTML输出。
3. 条件判断:Velocity模板引擎也支持简单的条件判断,可以根据条件的真假来控制模板输出的内容。
下面是一个条件判断的示例,展示了如何根据布尔值来判断是否输出某些文本:```#if($showWelcome)<h1>Welcome!</h1>#else<h1>Goodbye!</h1>#end```在这个示例中,如果变量`showWelcome`为真,将输出`<h1>Welcome!</h1>`,否则将输出`<h1>Goodbye!</h1>`。
4. 循环控制:Velocity模板引擎也支持循环控制,可以通过`#foreach`语法来遍历集合或者数组的元素。
1. 什么是velocity2.0?velocity2.0是一个模板引擎,用于在Web开发中,特别是在Java Web开发中,用于生成HTML、XML等静态文件。
velocity2.0可以将模板文件中的变量替换为具体的数值,也可以执行一些简单的逻辑操作,比如条件判断、循环等。
它的主要作用就是将模板和数据整合在一起,生成最终的文件输出。
2. velocity2.0的入门指南想要学习和使用velocity2.0,首先需要了解它的基本语法和用法。
下面是velocity2.0入门的一些基本概念和内容。
3. 变量在velocity2.0中,变量用来表示一些数值、字符串或者对象,在模板中可以通过变量名来引用这些值。
变量的命名规则和作用域和Java中的情况很类似,这些都是需要在学习velocity2.0时需要注意的地方。
4. 变量定义与赋值在velocity2.0模板中,可以通过#set指令来定义和赋值一个变量,比如:```#set($name = "velocity2.0")```这样就定义了一个名为name的变量,并赋值为"velocity2.0"。
5. 变量的引用定义了变量之后,就可以在模板中引用这个变量了。
比如:```Wee to $name!```这样就会在生成的文件中,将$name替换为具体的数值,也就是"velocity2.0"。
6. 变量的作用域velocity2.0中的变量和作用域和Java中的类似,有全局变量和局部变量之分。
全局变量是在整个模板中都可以访问的,而局部变量只在某个指令块中可以访问。
7. 方法除了变量之外,方法也是velocity2.0中比较重要的概念。
在模板中,可以通过方法来执行一些逻辑操作,比如字符串的拼接、条件判断、循环等。
8. 方法的定义与调用在velocity2.0模板中,可以通过#macro指令来定义一个方法,然后通过#call指令来调用这个方法。
java模板引擎velocity 方法【实用版4篇】目录(篇1)1.Java 模板引擎 Velocity 简介2.Velocity 的使用方法3.Velocity 的基本语法4.Velocity 的优点与局限性正文(篇1)一、Java 模板引擎 Velocity 简介Java 模板引擎 Velocity 是一款基于 Java 的模板引擎,它可以帮助开发者简化代码编写,提高工作效率。
Velocity 允许用户将输出结果与数据分离,通过定义模板和提供数据,可以生成各种格式的文档。
它具有很强的扩展性,可以轻松地与其他 Java 框架集成。
二、Velocity 的使用方法1.添加 Velocity 依赖在项目中使用 Velocity,首先需要将 Velocity 的依赖添加到项目中。
对于 Maven 项目,可以在 pom.xml 文件中添加以下依赖:```xml<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity</artifactId><version>2.0</version></dependency>```2.创建 Velocity 配置在项目中创建一个 Velocity 配置类,用于配置 Velocity 的属性。
例如:```javaimport org.apache.velocity.app.Velocity;import org.apache.velocity.context.Context;import org.apache.velocity.runtime.RuntimeConstants;import org.apache.velocity.runtime.RuntimeServices;public class VelocityConfig {public static Velocity getVelocityInstance() {Velocity velocity = new Velocity();velocity.setProperty(RuntimeConstants.RUNTIME_LOG_LEVEL, "WARN");velocity.setProperty(RuntimeConstants.RUNTIME_LOG_PATH,"/tmp/velocity.log");velocity.setProperty(RuntimeConstants.RUNTIME_DIRECTIVE_LOG_LEV EL, "WARN");velocity.setProperty(RuntimeConstants.RUNTIME_DIRECTIVE_LOG_PAT H, "/tmp/directive.log");velocity.setProperty(RuntimeConstants.RUNTIME_CHAIN_LOG_LEVEL, "WARN");velocity.setProperty(RuntimeConstants.RUNTIME_CHAIN_LOG_PATH, "/tmp/chain.log");velocity.setProperty(RuntimeConstants.RUNTIME_TEMPLATE_LOG_LEVE L, "WARN");velocity.setProperty(RuntimeConstants.RUNTIME_TEMPLATE_LOG_PATH, "/tmp/template.log");velocity.setProperty(RuntimeConstants.RUNTIME_STATIC_LOG_LEVEL, "WARN");velocity.setProperty(RuntimeConstants.RUNTIME_STATIC_LOG_PATH, "/tmp/static.log");velocity.setProperty(RuntimeConstants.RUNTIME_FILE_LOG_LEVEL, "WARN");velocity.setProperty(RuntimeConstants.RUNTIME_FILE_LOG_PATH,"/tmp/file.log");velocity.setProperty(RuntimeConstants.RUNTIME_LOG_IGNORE_CASE, "true");velocity.setProperty(RuntimeConstants.RUNTIME_LOG_ENABLED, "true");velocity.setProperty(RuntimeConstants.RUNTIME_DIRECTIVE_ENABLED, "true");velocity.setProperty(RuntimeConstants.RUNTIME_TEMPLATE_ENGINE_E NABLED, "true");velocity.setProperty(RuntimeConstants.RUNTIME_STATIC_ENGINE_ENA BLED, "true");velocity.setProperty(RuntimeConstants.RUNTIME_FILE_ENGINE_ENABL ED, "true");return velocity;}}```3.创建 Velocity 模板在项目中创建一个 Velocity 模板文件,例如:test.vm。
编写自定义的Velocity 指令Date: March 22, 2009Type of Submission:ArticleTitle:编写自定义的Velocity指令Subtitle:Keywords: Velocity, VeloclipsePrefix:无需填写Given:刘柄成Middle:Family:Suffix:无需填写Job Title:Email: javayou@Bio:刘柄成,开源中国社区()站长,DLOG4J作者,十年的Java开发经验,热衷于开源软件的开发和应用。
Company:Photo filename:Abstract:本文充分的介绍了Velocity的指令,并通过编写一个自定义的指令来扩展Velocity的功能。
Velocity及其指令简介Velocity是一个基于java的模板引擎(template engine)。
它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。
当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。
Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。
Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被当作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。
下面是一个简单的用Velocity 编写的网页代码:<html><head><meta http-equiv="Content-Type"content="text/html; charset=UTF-8"/> <meta http-equiv="Content-Language"content="zh-CN"/><title>$page_title</title><link rel="stylesheet"href="osc-global.css"type="text/css"/></head><body><div id="OSC_top">#parse("header.vm")</div><div id="OSC_content"><table>#foreach($idx in [1..20])<tr><td>$velocityCount</td><td>Now is $date.now()</td></tr>#end</table></div><div id="OSC_bottom">#include("bottom.vm")</div></body></html>在Velocity 模板的语法中,以美元符$ 开头的为变量的声明或者引用,而以井号# 开头的语句则为Velocity 的指令(Directive)。
如何设置⾃定义标签1.什么是⾃定义标签,查询单独的某种⽤户的特定信息时可以使⽤⾃定义标签。
2.如何设置⾃定义标签。
1.2.全部代码如下:<?xml version="1.0" encoding="UTF-8" standalone="no"?><taglib xmlns="/xml/ns/j2ee" xmlns:xsi="/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="/xml/ns/j2ee /xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <display-name>Ruiec Tags</display-name><tlib-version>1.0</tlib-version><short-name>ruiec</short-name><uri>/ruiec-tags</uri><tag><name>hasPerms</name><tag-class>com.ruiec.web.template.jsp.directive.HasPermsTag</tag-class><body-content>scriptless</body-content><attribute><name>perms</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag><tag><name>date</name><tag-class>com.ruiec.web.template.jsp.directive.DateTag</tag-class><body-content>scriptless</body-content><attribute><name>startDate</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute><attribute><name>endDate</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute><attribute><name>type</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute><attribute><name>var</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag><tag><name>module</name><tag-class>com.ruiec.web.template.jsp.directive.ModuleTag</tag-class><body-content>scriptless</body-content><attribute><name>parentId</name><type>ng.Integer</type><rtexprvalue>true</rtexprvalue></attribute><attribute><name>var</name><rtexprvalue>true</rtexprvalue></attribute></tag><tag><name>department</name><tag-class>com.ruiec.web.template.jsp.directive.DepartmentTag</tag-class><body-content>scriptless</body-content><attribute><name>parentId</name><type>ng.Integer</type><rtexprvalue>true</rtexprvalue></attribute><attribute><name>var</name><rtexprvalue>true</rtexprvalue></attribute></tag><tag><name>user</name><tag-class>erTag</tag-class><body-content>scriptless</body-content><attribute><name>userId</name><type>ng.Integer</type><rtexprvalue>true</rtexprvalue></attribute><attribute><name>var</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag><tag><!-- 查询回复帖⼦ --><name>replyArticle</name><tag-class>com.ruiec.web.template.jsp.directive.ReplyArticleTag</tag-class><body-content>scriptless</body-content><attribute><name>replyArticleId</name><type>ng.Integer</type><rtexprvalue>true</rtexprvalue></attribute><attribute><name>var</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag></taglib>3.配置Tag⽂件如下,这⾥相当⼀个查询。
一、什么是Java模板引擎Velocity?Java模板引擎Velocity是一种用于动态生成文本的工具,它能够通过预定义的模板和数据生成所需的文本。
它是Apache软件基金会的一个开源项目,因其灵活性和高效性而得到了广泛的应用。
二、Velocity的基本用法1. 引入Velocity库要使用Velocity,首先需要在项目中引入Velocity库。
可以通过Maven或手动下载并导入jar包的方式将Velocity集成到项目中。
2. 创建模板文件在使用Velocity时,需要预先创建模板文件,模板文件中可以包含一些占位符和逻辑控制代码,用来指示Velocity填充内容或执行相应的逻辑。
3. 创建模板上下文在Java代码中,需要创建一个模板上下文对象,该对象用于存储模板中需要填充的数据。
4. 渲染模板通过Velocity引擎的渲染方法,将模板文件和模板上下文传入,即可生成最终的文本内容。
五、Velocity的高级用法1. 模板继承Velocity支持模板继承的功能,可以在模板中定义块,然后在子模板中重写这些块的内容。
2. 自定义指令Velocity允许用户自定义指令,以满足特定的需求。
通过编写自定义指令的代码,可以扩展Velocity的功能。
3. 工具类集成Velocity本身并不包含太多实用的工具类,但它可以和一些常用的工具类集成,比如Apache Commons和Guava等,以提高模板中逻辑控制的灵活性和便利性。
六、Velocity的优缺点1. 优点(1)简单易学:Velocity的语法简单易懂,很容易上手。
(2)高效灵活:Velocity能够高效地生成文本,并且支持高度的灵活定制。
(3)可扩展性强:Velocity支持自定义指令,可以满足各种复杂的需求。
2. 缺点(1)性能一般:相比一些新的模板引擎,Velocity的性能并不算太突出。
(2)社区活跃度不高:作为一个老牌的模板引擎,Velocity的社区活跃度已经不如以前,新功能和bug修复相对较慢。
Velocity用户指南什么是Velocity?Velocity是基于Java的模板引擎。
它允许Web页面开发者引用Java代码中定义的方法。
Web设计者可以和Java程序开发者并行开发遵循MVC模式的Web 站点。
这意味着,Web设计者可以将精力放在好的Web站点设计上,而Java 程序开发者可以将精力放在编写代码上。
Velocity将Java代码从Web页面中分离,使Web站点更具长期可维护性,并提供了一种替代JSP或PHP的方案。
VTL(Velocity Template Language)介绍VTL提供一种简单、容易和干静的方法将动态内容合并到Web页面。
VTL使用引用(references)将动态内容插入到Web页面中。
变量是一种引用,可以指向Java代码中的定义内容,或者由Web页面中的VTL语句来获得值。
下面是一个可以插入到HTML文档的VTL语句的例子:#set( $a = "Velocity" )VTL语句以#开头,并包含指令(set)。
变量以$开头,用引号引起。
引号可以是单引号,也可以是双引号。
前者引用具体的String值;后者可以包含Velocity 引用,例如”hello, $name”,$name会用其当前的值替换。
上面的例子是将值Velocity赋值给变量a。
当变量被赋值后,就可以在HTML文档的任何地方引用,下面是Hello Velocity World!的例子:<html><body>#set( $foo = "Velocity" )Hello $foo World!</body><html>注释VTL支持单行注释(以##开始)和多行注释(包括在#*和*#之间),下面是一个例子:This text is visible. ## This text is not visible.This text is visible.This text is visible. #* This text, as part of a multi-line comment,is not visible. This text is not visible; it is also part of themulti-line comment. This text still not visible. *# This text is outsidethe comment, so it is visible.## This text is not visible.引用VTL有3种类型的引用:变量、属性和方法。
Visual-studio2012指导(zhǐdǎo)教程Visual-studio2012指导(zhǐdǎo)教程Visual C++ 指导(zhǐdǎo)教程Visual Studio 2012在本指导教程中,将介绍 Visual Studio 开发环境,以及可以使用(shǐyòng) Visual C++ 创建的各种类型的应用程序。
其中包括(bāokuò)命令行应用程序、Windows 应用程序,甚至简单的游戏。
本指导(zhǐdǎo)教程还将介绍如何创建可重用代码库,以及如何在编写和测试了代码后将其交付给客户。
因为每个主题都以上一主题中的信息(xìnxī)为基础,所以我们建议您按顺序完成指导教程。
在每个主题的底部,您可以找到指导教程下一主题的导航链接和上一主题的链接(如果需要返回并查看某些内容)。
本指导教程假定您具备 C++ 语言的基础知识。
本节内容Visual Studio IDE 简介 (C++)描述如何使用 Visual Studio IDE 创建解决方案和项目,以便有效地编写代码并生成、调试、测试和部署应用程序。
创建命令行应用程序 (C++)介绍 C 和 C++ 命令行应用程序,讨论如何创建符合 ANSI 的 C 或 C++ 程序,并描述如何使用命令行编译器编译应用程序。
创建 Windows 应用程序 (C++)描述如何创建 Windows API (Win32) 应用程序、Windows 窗体应用程序、Windows 窗体控件,甚至简单的 DirectX 游戏。
创建可重用代码(C++)描述如何创建动态链接库 (DLL)、静态库和托管程序集,以便多个应用程序可以方便地重用(zhòngyòng)代码。
下一步(yī bù)要做什么 (C++)包含指向(zhǐ xiànɡ)文档其他部分的链接,您可以学习关于指导教程中介绍的主题的更多信息。
java web程序设计教程课后答案第1章 Web应用开发简介习题答案1.Web在组成上包括______和______两部分。
答案:服务器客户端2.谈谈对面向对象的认识。
答案:面向对象将将要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙解决问题中的各个步骤中的行为。
面向对象编程方式是建立在面向过程编程方式基础上,其最重要的改变在于面向对象编程中,程序将围绕被操作的对象来设计,而不是操作本身。
面向对象编程方式以类作为构造程序的基本单位,具有封装、抽象、继承、多态性等特点。
3.介绍几种常用的框架技术。
答案:Java中常用的框架。
1.StrutsStruts是Apache 基金会Jakarta 项目组的一个开源项目,是一个基于Sun J2EE平台的MVC框架,它将Servlet和JSP标签作为实现自身功能的一部分。
2.WebWorkWebWork是由OpenSymphony组织开发的,是一个基于Web的MVC 框架。
它在运行时通过Interceptor(拦截器)自动应用,因此脱离了Action类。
3.Struts 2Struts 2是Apache基金会的一个开源项目,它建立在Struts框架与WebWork框架基础之上,继承了二者的优点,是目前非常流行的一个Web框架。
4.SpringSpring是一个以IoC和AOP为核心的轻量级容器框架。
它提供了一系列的Java EE开发解决方案,包括表示层的Spring MVC、持久层的Spring JDBC以及业务层事务管理等众多的企业级应用技术。
5.HibernateHibernate是一个ORM(对象关系映射)框架,它对JDBC进行了轻量级的封装。
通过使用Hibernate框架,开发人员能够以面向对象的思维方式来操作数据库。
6.Ibatis相对于Hibernate而言,Ibatis是一个“半自动化”的ORM实现框架,它主要致力于POJO与SQL之间的映射关系,是对“全自动化”ORM框架的一种有益补充。
velocityengine 自定义方法Velocity是一个Java模板引擎,用于将模板和数据合并生成文本输出。
在Velocity中,你可以定义和使用自定义方法(user-defined methods)来扩展模板的功能。
以下是一个简单的介绍,说明如何在Velocity中创建和使用自定义方法:1. 创建自定义方法的类创建一个Java类,其中包含你想要在Velocity模板中使用的自定义方法。
这个类需要包含一个或多个public方法,这些方法将在模板中调用。
```javapublic class MyCustomMethods {public String customMethod(String input) {// 实现你的自定义逻辑return "Processed: " + input;}public int addNumbers(int a, int b) {return a + b;}}```2. 注册自定义方法在Velocity模板引擎中,你需要将自定义方法注册到一个VelocityEngine实例中。
```javaVelocityEngine velocityEngine = new VelocityEngine();// 注册自定义方法的类velocityEngine.addProperty("userdirective", "com.example.MyCustomMethods");```3. 在模板中使用自定义方法在Velocity模板中,你可以通过类名来调用自定义方法:```velocity#set($result = $com.example.MyCustomMethods.customMethod("Hello"))Processed: $result#set($sum = $com.example.MyCustomMethods.addNumbers(3, 5))Sum: $sum```这里,`$com.example.MyCustomMethods`引用了你之前创建的类,然后调用了相应的方法。
一、介绍模板文件赋值的概念在Java开发中,模板文件赋值是指将数据动态填充到模板文件中的过程。
通常情况下,我们会使用各种模板引擎来实现模板文件赋值,以便生成各种格式的文档、网页或邮件等。
二、常见的模板引擎1. FreeMarkerFreeMarker是一个流行的Java模板引擎,它使用基于Apache软件许可协议的业界标准的模板语言。
通过FreeMarker,我们可以将数据填充到模板文件中,并生成各种文档格式的输出。
2. VelocityVelocity是另一个常用的Java模板引擎,它的语法简洁清晰,易于学习和使用。
通过Velocity,我们可以实现模板文件赋值,并且支持自定义的模板指令,非常灵活。
3. ThymeleafThymeleaf是一款现代化的Java模板引擎,它提供了与HTML、XML、JavaScript等文件无缝集成的功能。
通过Thymeleaf,我们可以使用统一的表达式语言来实现模板文件赋值,非常适合Web开发。
三、模板文件赋值的基本原理无论是使用FreeMarker、Velocity还是Thymeleaf,它们的实现原理都是类似的。
在模板文件中,我们会预留一些占位符或变量,然后通过模板引擎将实际数据填充到这些占位符中,最终生成输出文档。
四、模板文件赋值的使用方法1. 设置模板文件我们需要准备好模板文件,通常是一个包含了占位符的文本文件或者HTML文件。
这些占位符可以是以"${}"或者"#"包裹的变量,也可以是自定义的标签或指令。
2. 准备数据接下来,我们需要准备好需要填充到模板文件中的数据。
这些数据可以是从数据库中查询得到的结果,也可以是用户输入的表单数据,或者任何需要动态生成的内容。
3. 使用模板引擎我们需要使用相应的模板引擎来实现模板文件赋值。
具体的操作方法会因使用的模板引擎不同而有所差异,但通常会涉及到创建模板引擎实例、将模板文件和数据进行结合,最终生成输出结果的过程。
nuscenes数据集velocity标签-回复nuscenes数据集是一个被广泛使用的自动驾驶研究和开发平台,含有大量的标签和注释信息,以帮助研究人员和开发者构建高效的自动驾驶系统。
其中一个重要的标签是velocity(速度)标签,它提供了关于车辆在每个时间步的速度信息。
本文将一步一步回答有关nuscenes数据集velocity 标签的问题。
第一部分:nuscenes数据集简介在回答velocity标签的问题之前,我们先简要介绍一下nuscenes数据集。
nuscenes是由nuTonomy公司提供的一个大规模自动驾驶数据集,用于训练和评估自动驾驶系统。
该数据集覆盖6个城市中的1000个场景,每个场景都包含多辆车辆、行人和其他动态物体。
数据集中的每个实例都带有大量的标签和注释,包括位置、速度、方向等信息。
第二部分:velocity标签是什么velocity标签是nuscenes数据集中的一个重要标签,它记录了每个时间步车辆的速度信息。
这对于研究和开发自动驾驶系统非常重要,因为速度是车辆行为的一个关键方面。
velocity标签以向量形式表示,即包含车辆在x、y和z轴上的速度分量。
第三部分:velocity标签的数据结构velocity标签的数据结构相对简单,它由一个包含三个浮点数的向量表示。
这三个浮点数分别表示车辆在x、y和z轴上的速度分量。
以某个时间步的velocity标签为例,可以像这样表示:[vx, vy, vz]。
其中,vx表示车辆在x轴上的速度分量,vy表示车辆在y轴上的速度分量,vz表示车辆在z 轴上的速度分量。
第四部分:velocity标签的应用velocity标签在自动驾驶研究和开发中具有广泛的应用。
它可以被用来分析和预测车辆的行为,从而帮助自动驾驶系统做出合理的决策和规划。
下面我们将介绍velocity标签在几个不同的应用场景中的具体应用。
1.车辆行为分析:通过分析velocity标签可以获得车辆的实时速度信息,从而对车辆的行为进行分析。
velocity用法数据结构(最新版)目录1.Velocity 简介2.Velocity 的基本用法3.Velocity 中的数据结构4.总结正文【1.Velocity 简介】Velocity 是一个基于 Java 的模板引擎,用于生成基于文本的输出,例如:HTML、XML、RTF、TXT 等。
它允许用户通过简单的模板语法定义输出的结构,并通过数据结构填充模板中定义的变量,从而实现代码的复用和简化。
【2.Velocity 的基本用法】Velocity 的基本用法主要包括以下几个步骤:(1)导入 Velocity 库:在项目中引入 Velocity 的 jar 包,例如:velocity-1.7.jar。
(2)配置 Velocity 环境:创建一个 velocity.properties 文件,用于配置 Velocity 的基本属性,例如:输出目录、编码方式等。
(3)编写 Velocity 模板:创建一个.vm 文件,编写模板代码,并在需要的地方使用$符号定义变量。
(4)执行 Velocity 模板:通过 Velocity 引擎执行模板文件,生成目标文件。
【3.Velocity 中的数据结构】Velocity 中的数据结构主要包括以下几种:(1)String:表示一个字符串,用于表示模板中的普通文本。
(2)Integer:表示一个整数,用于表示模板中的整数值。
(3)Double:表示一个浮点数,用于表示模板中的小数值。
(4)Boolean:表示一个布尔值,用于表示模板中的逻辑值。
(5)Date:表示一个日期对象,用于表示模板中的日期值。
(6)ArrayList:表示一个列表,用于表示模板中的列表结构。
(7)HashMap:表示一个哈希表,用于表示模板中的键值对结构。
这些数据结构在 Velocity 模板中通过$符号定义,并在模板引擎执行时进行填充和解析。
【4.总结】Velocity 作为一个强大的模板引擎,可以简化代码的编写,提高开发效率。
想在每个layout(page)增加一个统一的Footer。
这时,就需要修改portal-normal.vm。
对于复杂的,可以参考Liferay默认的一个Theme liferay-noir-theme的实现方式,通过:$serviceLocator.findService("com.liferay.portlet.journal.service.Jour nalArticleLocalService"))获取一个文章的服务,并通过liferay-look-and-feel.xml中的文章编号配置,来显示一篇文章;对于简单的,我们只是写几个文字就可以了,比如说,联系我们,copyright等等。
如果直接在portal-normal.vm中增加文字,英文还可以,但如果增加中文,那么就会出现乱码,需要通过Liferay的国际化机制来实现。
具体的办法是:$languageUtil.get($locale, "msgKey")这里的msgKey就是你的资源文件中的键值。
资源文件就是portal-impl.jar中的content下的language文件再深入分析一下,liferay是如何实现$languageUtil.get调用的呢?首先,查找得知,languageUtil是在VelocityVariables中定义的,而在VelocityFilter中,将所有的这些变量写入到HttpRequest中。
VelocityFilter在哪里定义?当然是web.xml中了。
有一个问题是:在VelocityVariables中,定义的theme是一个Theme对象,但是在vm中,$theme却好像是VelocityTaglib对象,其方法匹配不上,比如runtime方法。
答案可以在ThemeUtil.includeVM中找到,在该方法中,确实是用VelocityTaglib的一个对象,替换了原来的theme属性值。
一、标签大全1.set<html><body>#set($foo=" Velocity ")Hello $foo</body><html>Hello Velocity#set用来指定值给一个变量名$a,以“$”标示的变量名a的值就是"Velocity".如:#set( $monkey = $bill ) ## variable reference#set( $monkey.Friend = "monica" ) ## string literal#set( $monkey.Blame = $whitehouse.Leak ) ## property reference#set($monkey.Plan = $spindoctor.weave($web) ) ## method reference#set( $monkey.Number = 123 ) ##number literal#set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList#set( $monkey.Map = {"banana" : "good", "roast beef" : "bad"}) ## Map#set( $value = $foo + 1)#set( $value = $bar - 1)#set( $value = $foo * $bar)#set( $value = $foo / $bar)2.## 单行注释#* 内容*# 多行注释3.条件判断if/elseif/else#if(条件) 内容#elseif(条件) 内容#else 内容#end#if( $foo ) <strong>Velocity!</strong> #end如果foo为true或者foo不为null,则输出Velocity!4.Include引入#include脚本元素让模板设计者可以在模板中引入一个本地文件,这个被引入的文件将不会经过Velocity的解析.安全起见,可以引放的文件只是是配置参数TEMPLATE_ROOT 所定义目录下的,默认为当前目录下#include("one.txt")如果需要引入多个文件,可以这样:#include("one.gif","two.txt","three.htm")当然,还可用一个变量名来代替文件名引入:#include("greetings.txt",$seasonalstock) 5.Foreach循环遍历(用于数组,List,Set,Map,Vector等)假如要遍历一个HashMap的keySet可以用下面的方法#foreach( $key in $allProducts.keySet() )Key: $keyValue: $allProducts.get($key)#end#foreach()指令提供了两个属性:$velocityCount 获得当前循环到第几个元素,从1开始$velocityHasNext 获得时候还有后续元素,有返回true否则返回false#set($strArr=['你好吗','我不好','null','二年级',3])#foreach($element in $strArr)#if(${velocityCount}>3)#break#endstrArr[${velocityCount}]----》$element,${velocityHasNext}#end程序输出strArr[1]----》你好吗,truestrArr[2]----》我不好,truestrArr[3]----》null,true6.语法原样输出有时候不需要词法替换vtl代码,而是需要在输出流打印整块的vtl代码。
velocity.properties配置说明1.Runtime Logruntime.log = velocity.log⽤以指定 Velocity 运⾏时⽇志⽂件的路劲和⽇志⽂件名,如不是全限定的绝对路径,系统会认为想对于当前⽬录.runtime.log.logsystem这个参数没有默认值,它可指定⼀个实现了 interface org.apache.velocity.runtime.log.LogSystem.的⾃定义⽇志处理对象给 Velocity。
这就⽅便将Velocity 与你⼰有系统的⽇志机制统⼀起来runtime.log.logsystem.class = org.apache.velocity.runtime.log.AvalonLogSystem上⾯这⾏,是⼀个⽰例来指定⼀个⽇志记录器.runtime.log.error.stacktrace = false runtime.log.warn.stacktrace = false .stacktrace = false 这些是错误消息跟踪的开关.将会⽣成⼤量、详细的⽇志内容输出.runtime.log.invalid.references = true当⼀个引⽤⽆效时,打开⽇志输出. 在⽣产系统运⾏中,这很有效,也是很有⽤的调试⼯具.2.字符集编码问题input.encoding = ISO-8859-1输出模板的编码⽅式 (templates). 你可选择对你模板的编码⽅式,如 UTF-8.GBK.output.encoding = ISO-8859-1VelocityServlet 对输出流(output streams)的编码⽅式.3.#foreach() Directive = velocityCount在模板中使⽤#foreach() 指令时,这⾥设定的字符串名字将做为 context key 代表循环中的计数器名, 如以上设定,在模板中可以通过 $velocityCount 来访问.directive.foreach.counter.initial.value = 1#foreach() 中计数器的起始值.4.#include() and #parse() Directivedirective.include.output.errormsg.start =directive.include.output.errormsg.end =使⽤#include()时,定义内部流中开始和结束的错误消息标记,如果两者都设这屯,错误消息将被输出到流中'.但必须是两都定义.directive.parse.maxdepth = 10 定义模板的解析深度,当在⼀个模板中⽤#parse()指⽰解析另外⼀个模板时,这个值可以防⽌解析时出现 recursion 解析.5.资源管理resource.manager.logwhenfound = true定义⽇志中的 'found' 务⽬开关.当打开时,如 ResourceManager 第⼀次发现某个资源时, the first time, theresource name and classname of the loader that found it will be noted in the runtime log.resource.loader = <name> (default = File)(可以有多个以.号分开的值),可以理解为指定资源⽂件的扩展名.<name>.loader.description = Velocity File Resource Loader描述资源装载器名字.<name>.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader实现的资源装载器的类名. 默认的是⽂件装载器.<name>.resource.loader.path = .Multi-valued key. Will acceptCSV for value. 资源位置的根⽬录. 当前配置会使⽤FileResourceLoader and JarResourceLoader 遍历⽬录下的所有⽂件以查找资源.<name>.resource.loader.cache = false 控制装载器是否对⽂件进⾏缓存.默认不存是为了⽅便开发和调试. 在⽣产环境布署(productiondeployment)时可设为 true 以提⾼性能, 这⾥参数 modificationCheckInterval 应设为⼀个有效值—以决定多久 reload ⼀次.<name>.resource.loader.modificationCheckInterval = 2当模把caching 打开时,这个以秒为单位的值指⽰系统多久检测⼀次模板是否⼰修改以决定是否需要,如果设为 <= 0, Velocity 将不做检测. FileResourceLoader 的默认参数完整⽰例:resource.loader = filefile.resource.loader.description = Velocity File Resource Loaderfile.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoaderfile.resource.loader.path = .file.resource.loader.cache = falsefile.resource.loader.modificationCheckInterval = 26.Velocima cro(宏配置)velocimacro.library = VM_global_library.vmMulti-valued key. Will acceptCSV for value.当 Velocity engine 运⾏时,要被载⼊的含有宏代码库的⽂件名. 所有模板都可访问宏(Velocimacros ). 这个⽂件位置在相对于资源⽂件的根⽬录下.velocimacro.permissions.allow.inline = trueDetermines of thedefinition of new Velocimacros via the#macro() directive in templatesisallowed,定义在模板中是否可⽤#macro()指令定义⼀个新的宏. 默认为 true,意味所有模板都可定义new Velocimacros. 注意,这个设定,如模板中的有可能替换掉全局的宏定义.velocimacro.permissions.allow.inline.to.replace.global = false控制⽤户定义的宏是否可以可以替换 Velocity 的宏库.velocimacro.permissions.allow.inline.local.scope = false控制模板中的宏的专有命名空间.When true, ⼀个模板中的 #macro() directive 只能被定义它的模板访问. 这意味者所有的宏都不能共想了,当然也不会互想扰乱、替换了.velocimacro.context.localscope = false 控制 Velocimacro 的引⽤访问(set/get)是涉及到Context范围还是仅在当前的 Velocimacro 中.velocimacro.library.autoreload = false控制宏库是否⾃动载⼊. 设为 true 时,源始的 Velocimacro 将根据是否修改过⽽决定是否需要 reLoad, 可在调试时很⽅便,不需重启你的服务器,如⽤参数 file.resource.loader.cache = false 的设置⼀样,主要是为⽅便开发调试⽤.7.语义更改runtime.interpolate.string.literals = trueControls interpolation mechanism of VTL String Literals. Note that a VTL StringLiteral is specifically astring using doublequotes that is used in a#set() statement, a methodcall of a reference, aparameter to a VM, or as an argument to a VTL directive in general. See the VTL reference for further information.8.运⾏时配置parser.pool.size = 20控制 Velocity启动是需要创建并放到池中预备使⽤的模板解析器的个数 ----这只是预装 . 默认的 20 个对⼀般⽤户来说⾜够了. 即使这个值⼩了,Velocity 也会运⾏时根据系统需要动态增加(但增加的不会装⼊池中). 新增时会在⽇志中输出信息。
Velocity的自定义标签Velocity是当前我们用得最多的模板,其好处和使用方法非常丰富,网上一大堆,这里就不介绍了,需要的去网上搜索即可。
这里重点介绍一下velocity的自定义标签及使用方法。
自定义标签有两种方式:宏和java自定义工具Macro宏其实就是velocity已支持的所有标签的组合,好处是方便快捷,可以递归,可以写复杂的方法,如下便是一个递归遍历树的宏,不足之外是只有利用现有的数据进行组合,方法也仅限于velocity提供的几个标签。
实现方式有两种,1,直接写在使用的页面上,这样只有当前页可用。
2,写在macro.vm里面,这样所有的页面都可以使用。
调用调用方法:#categoryTree($node)和velocity提供的原生的方法一样,括号里面是参数自定义标签流程代码写java代码,代码需要继承Directive,示例代码如下。
getName接口用来告诉velocity这个函数名是什么,也就是页面上调用这个函数的名称,比如#hellofun();getType接口用来告诉velocity这个函数类型,可以是行也可以是块函数;reder接口用来输出html代码,当然也可以不输出,如果需要输出,则使用入参的writer.write("some html");context是当前velocity的容器,可以取调用vm中的变量,比如在页面上使用#set($name="bwong"),可以通过context.get("name")取出"bwong",node里面可以取出调用这个函数时的入参,比如#hellofun("a"),通过node.jjtGetChild(0).value(context)取出"a",所以: writer.write("hello " + node.jjtGetChild(0).value(context)); 就可以输出"hello xxx",xxx是调用这个函数时的入参。
Velocity的自定义标签
Velocity是当前我们用得最多的模板,其好处和使用方法非常丰富,网上一大堆,这里就不介绍了,需要的去网上搜索即可。
这里重点介绍一下velocity的自定义标签及使用方法。
自定义标签有两种方式:宏和java自定义工具
Macro
宏其实就是velocity已支持的所有标签的组合,好处是方便快捷,可以递归,可以写复杂的方法,如下便是一个递归遍历树的宏,不足之外是只有利用现有的数据进行组合,方法也仅限于velocity提供的几个标签。
实现方式有两种,1,直接写在使用的页面上,这样只有当前页可用。
2,写在macro.vm里面,这样所有的页面都可以使用。
调用调用方法:#categoryTree($node)和velocity提供的原生的方法一样,括号里面是参数
自定义标签
流程
代码
写java代码,代码需要继承Directive,示例代码如下。
getName接口用来告诉velocity这个函数名是什么,也就是页面上调用这个函数的名称,比如#hellofun();
getType接口用来告诉velocity这个函数类型,可以是行也可以是块函数;
reder接口用来输出html代码,当然也可以不输出,如果需要输出,则使用入参的
writer.write("some html");context是当前velocity的容器,可以取调用vm中的变量,比如在
页面上使用#set($name="bwong"),可以通过context.get("name")取出"bwong",node里面可以取出调用这个函数时的入参,比如#hellofun("a"),通过node.jjtGetChild(0).value(context)
取出"a",所以: writer.write("hello " + node.jjtGetChild(0).value(context)); 就可以输出"hello xxx",xxx是调用这个函数时的入参。
render就可以通过使用java的所有工具和类了,实现起来会丰富得多。
配置
配置起来非常简单。
在velocity.properties配置文件中加入
userdirective=youpackage.HelloFun,youpackage.OtherUtil
多个工具用”,”隔开。
调用
#hellofun("a")
使用场景及示例
作为velocity原生标签的补充,自定义标签可以轻松的自种自定义的功能。
宏更多的用户对现有的数据进行丰富的组装。
如基础的分页功能,文字展示特殊化等。
Java自定义标签更多的是做一些宏无法实现的功能,也可以做一些公共的展示及取数的功能。
一次公共类目的展示
需求:左边的知识目录是所有页面都要显示的,但是其内容是动态的,也有可能会因人页异,中间才是各个正在进行的业务。
不可能给每个正在进行的业务都要把这些东西都操作一遍,如果能够使用velocity的一个标签调用,就最好不过了。
操作流程
1,自定义一个处理类,并配置以实现联通
配置文件:
userdirective=com.jd.jr.contentManager.util.VelocityControllUtil
2,调用spring的bean,获取左边信息
因为VelocityControlUtil不是Spring管理的类,所以不能直接使用注解的方式来载类,但是可以直接用静态方法来获取Spring的bean。
方法如下
1,定义一个SpringUtil,实现ApplicationConextAware,并在配置文件中流入此对象
<bean class="com.jd.jr.contentManager.util.SpringUtil"/>
调用方式如下:
((CategoryBiz)SpringUtil.getBean("categoryBiz")).buildCategoryTree()
3,使用velocityEngine引擎组装数据并返回
因为VelocityControlUtil的Writer只处理String,所以如果纯拼接String 还是有点复杂,这个时候可以用VelocityEngine暄染的方式,方法如下:
其中volocityEngine定义为:private static final
VelocityEngine velocityEngine= new VelocityEngine();params为需要渲染的参数,vimStr为需要渲染的模板。
模板里支持所有的Velocity语法,可以放心使用。