Velocity增加自定义标签的方法

合集下载

velocity模板

velocity模板

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教程

Velocity教程

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 直接返回对象结果。

Velocity 模板使用指南》中文版

Velocity 模板使用指南》中文版

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 方法

java模板引擎velocity 方法

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`语法来遍历集合或者数组的元素。

velocity2.0 入门 变量 方法

velocity2.0 入门 变量 方法

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 方法

java模板引擎velocity 方法

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指令

编写自定义的Velocity指令

编写自定义的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⽂件如下,这⾥相当⼀个查询。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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语法,可以放心使用。

相关文档
最新文档