- 浏览: 755074 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lgh1992314:
a offset: 26b offset: 24c offse ...
java jvm字节占用空间分析 -
ls0609:
语音实现在线听书http://blog.csdn.net/ls ...
Android 语音输入API使用 -
wangli61289:
http://viralpatel-net-tutorials ...
Android 语音输入API使用 -
zxjlwt:
学习了素人派http://surenpi.com
velocity宏加载顺序 -
tt5753:
谢啦........
Lucene的IndexWriter初始化时的LockObtainFailedException的解决方法
velocity本身支持自定义标签和指令的扩展,
在 Velocity 模板语言的语法中,以美元符 $ 开头的为变量的声明或者引用,而以井号 # 开头的语句则为 Velocity 的指令(Directive)。
velocity支持的指令有:#set,#foreach,#if #else #end,#parse,#include,#evaluate,#define,#macro,
在velocity的jar包中的directive.properties中定义了这些实现:
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
自定义标签和指定,比如我们定义了下面的remoteVelocity指令
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gbk" /> <title>click ok page</title> </head> <body> This app runs well #set($monkey= {"banana" : "good", "roast beef" : "bad"}) #remoteVelocity("namespace","velocityname",$monkey) </body> </html>
要对这个指令的实现要继承Directive这个类,这个宏我们可以从其他服务获取vm的内容,动态渲染,这种方式可以统一管理公共模板,
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 RemoteVelocity extends Directive{ @Autowired TemplateService templateService; private static final VelocityEngine velocityEngine = new VelocityEngine(); @Override public String getName() { return "remoteVelocity"; } @Override public int getType() { return LINE; } @Override public boolean render(InternalContextAdapter context, Writer writer, Node node) throws IOException, ResourceNotFoundException, ParseErrorException, MethodInvocationException { SimpleNode sn_region = (SimpleNode) node.jjtGetChild(0); String region = (String)sn_region.value(context); SimpleNode sn_key = (SimpleNode) node.jjtGetChild(1); Serializable key = (Serializable)sn_key.value(context); SimpleNode sn_data = (SimpleNode) node.jjtGetChild(2); Object data = sn_data.value(context); Map map = new HashMap(); map.put("data", data); // String vel = HostUtil.getResponseText("http://127.0.0.1/index.html"); String vel="#foreach($member in $data.entrySet())<li>$member.key - $member.value</li>#end "; writer.write(renderTemplate(map,vel)); return true; } public static String renderTemplate(Map params,String vimStr){ VelocityContext context = new VelocityContext(params); StringWriter writer = new StringWriter(); try { velocityEngine.evaluate(context, writer, "", vimStr); } catch (ParseErrorException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MethodInvocationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ResourceNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }//渲染模板 return writer.toString(); } }
node.jjtGetChild(2) 这个方法可以获取对应指令的参数,下标从0开始,
在web工程的WEB-INF下面定义velocity.properties这个配置文件,用户扩展的指令最好放到这个文件里面,velocity的jar包里面提供了默认实现,我们可以覆盖重新定义自己的扩展,类就是对应自己的扩展类的类名
#自定义标签
userdirective=com.alibaba.click.test.RemoteVelocity
这样启动后就可以正常使用了。
Directive的三个方法:
getName:指令的名称
getType:当前有LINE,BLOCK两个值,line行指令,不要end结束符,block块指令,需要end结束符
public boolean render(InternalContextAdapter context, Writer writer, Node node) 具体处理过程
参考:http://www.ibm.com/developerworks/cn/java/j-lo-velocity/
发表评论
-
对字符串进行验证之前先进行规范化
2013-09-17 23:18 13957对字符串进行验证之前先进行规范化 应用系统中经常对字 ... -
使用telnet连接到基于spring的应用上执行容器中的bean的任意方法
2013-08-08 09:17 1482使用telnet连接到基于spring的应用上执行容器中 ... -
jdk7和8的一些新特性介绍
2013-07-06 16:07 10113更多ppt内容请查看:htt ... -
Lucene的IndexWriter初始化时的LockObtainFailedException的解决方法
2013-06-28 21:35 11808原文链接: http://www.javaarch.net ... -
java对于接口和抽象类的代理实现,不需要有具体实现类
2013-06-12 09:50 2957原文链接:http://www.javaarch.net/j ... -
Excel2007格式分析和XML解析
2013-06-07 09:56 10744在物料清单采购中,用到excel上传文件解析功能,不 ... -
Java EE 7中对WebSocket 1.0的支持
2013-06-05 09:27 3845原文链接:http://www.javaarch.n ... -
java QRCode生成示例
2013-06-05 09:26 1514原文链接:http://www.javaarch.n ... -
Spring Security Logout
2013-06-03 00:05 2371原文地址:http://www.javaarch.net/ ... -
Spring Security Basic Authentication
2013-06-03 00:04 1741原文地址:http://www.javaarch.net/ ... -
Spring Security Form Login
2013-06-02 16:16 2149原文地址:http://www.javaarch.net/j ... -
spring3 的restful API RequestMapping介绍
2013-06-02 14:53 1155原文链接:http://www.javaarch.net/j ... -
Java Web使用swfobject调用flex图表
2013-05-28 19:05 1127Java Web使用swfobject调用 ... -
spring使用PropertyPlaceholderConfigurer扩展来满足不同环境的参数配置
2013-05-21 15:57 3341spring使用PropertyPlaceholderCon ... -
java国际化
2013-05-20 20:57 4478java国际化 本文来自:http://www.j ... -
RSS feeds with Java
2013-05-20 20:52 1225RSS feeds with Java 原文来自:htt ... -
使用ibatis将数据库从oracle迁移到mysql的几个修改点
2013-04-29 10:40 1678我们项目在公司的大战略下需要从oracle ... -
线上机器jvm dump分析脚本
2013-04-19 10:48 2911#!/bin/sh DUMP_PIDS=`p ... -
spring3学习入门示例工程
2013-04-18 09:28 11321. github地址 https://github ... -
spring map使用annotation泛型注入问题分析
2013-04-15 13:30 8547今天在整一个spring的ioc学习demo,碰到 ...
相关推荐
4. **宏**:Velocity 支持宏定义,类似于 HTML 中的自定义标签,可以复用和封装代码,增强模板的模块化。 5. **指令集**:Velocity 提供了多种内置指令,如 #if, #foreach, #set 等,用于控制流程和处理数据。 ** ...
这可能涉及到自定义 Velocity工具或者中间件,使得Velocity引擎能够识别并处理SSI标签,然后将其转换为Velocity语法执行。 例如,我们可以创建一个 VelocityContext 对象,将SSI所需的变量添加进去,然后通过...
Velocity通过模板语言,允许开发者用简单的指令来控制页面元素的生成,这些指令可以与Java对象直接交互,无需繁琐的JSP标签或脚本。 二、核心概念 1. 模板(Template):模板是 Velocity 的灵魂,它是静态页面的...
JSP的核心概念包括JSP指令、脚本元素、表达式和自定义标签等,这些元素帮助开发者创建动态网页。 **Velocity** 是Apache软件基金会的一个开源项目,它提供了一个简单易用的模板语言,用于分离业务逻辑和表现层。...
例如,可以使用Velocity的内置宏或者自定义函数来自动转义HTML特殊字符,如 `、`>`、`&` 和 `'`。 `EscapeRequestReference`可能是一个类,用于处理HTTP请求中的引用,并确保它们在被插入到Velocity模板中之前得到...
可以通过`<velocity>`标签在Struts2配置文件中自定义模板路径。 3. **Velocity模板语法**:Velocity模板语言是一种非侵入性的脚本语言,其语法简洁。例如,`$variable`用于引用Java对象,`#if`, `#else`, `#end`...
手册通常会涵盖变量引用、条件语句、循环结构、函数调用、自定义标签等内容,帮助开发者充分利用Velocity的特性。 此外,压缩包中的"Struts 与 Velocity 的集成.htm"文件可能是对这个主题的深入讲解,而".files...
4. **宏库**: 宏是NVelocity中的可重用代码块,类似于HTML中的自定义标签。它们可以提高代码复用性和可维护性。 5. **指令(Control Directives)**: NVelocity提供了一系列的控制指令,如`#foreach`, `#if`, `#else`...
内置对象如request、response、session等可以直接在页面中使用,指令标签如page、include、taglib用于配置页面属性或引入自定义标签库,动作标签如jsp:include、jsp:forward用于控制页面流程。 2. JSTL(JavaServer...
这两个模板引擎都支持自定义标签,可以根据项目需求扩展功能。 总的来说,Java Web中的这些标签库为开发者提供了丰富的工具,使他们能够更专注于业务逻辑,而不是页面的呈现细节。合理利用这些标签,可以显著提高...
3. **可扩展性**:用户可以通过自定义宏(macro)和指令(directive)来扩展 Velocity 的功能,满足不同的开发需求。 4. **易于集成**:Velocity 可以轻松地与其他 Java 应用程序框架集成,如 Struts、Spring 等。 ...
VTL(Velocity Template Language)是Velocity的核心,它提供了一系列指令(如#set、#if、#foreach)和引用机制,使得在模板中嵌入动态数据变得简单。例如,`#foreach`循环可以遍历集合,`#if`判断可以根据条件展示...
- **Velocity**:一个基于Java的模板引擎,能够实现在Web页面中引用Java代码中定义的数据对象和方法。 - **目标群体**:适用于Web设计师和Java开发者,旨在帮助他们实现纯正的MVC架构系统。 #### 二、Velocity的...
Velocity允许你使用#set, #if, #foreach等指令,并可以引用Java对象的属性。 - Freemarker:另一种常见的模板引擎,更加强大,支持更多的逻辑控制和数据处理。 2. **创建自定义模板**: - 分析项目需求,确定...
3. **velocity模板**:在velocity模板文件(.vm)顶部添加`#set($encoding = "UTF-8")`指令,确保模板在解析时使用UTF-8编码。 4. **sitemesh配置**:修改sitemesh的配置文件(通常为`sitemesh.properties`),设置...
深入理解Struts标签库,可以学习如何自定义标签,以满足项目中特殊的需求。同时,了解Struts2的FreeMarker或Velocity模板语言,可以更好地利用Struts2提供的标签库。 总结,Struts标签是提高开发效率的有效工具,...
JSP技术文档通常包含了关于JSP语法、生命周期、内置对象、指令、动作元素、EL表达式以及自定义标签等全面信息。 1. **JSP语法** JSP页面主要由两部分组成:静态内容(HTML、CSS、JavaScript)和动态内容(Java代码...
Struts2的标签库不仅限于JSP页面,也可以在Velocity和FreeMarker等模板技术中使用。 1. **Struts2的作用** - **简化视图**:Struts2的标签库提供了主题和模板功能,帮助开发者快速创建美观且结构清晰的视图页面。 ...
5. **自定义和扩展**:Velocity 允许用户自定义工具包(Velocity Tools),扩展其功能,如自定义标签库(Taglibs)和宏库,以满足特定项目需求。 6. **性能优化**:Velocity 在处理大量数据和复杂模板时,能够保持...
- **引入标签库**:在JSP页面中,需使用`<%@ taglib>`指令引入Struts2的标签库,例如`<%@ taglib uri="/struts-tags" prefix="s"%>`。 - **配置web.xml**:在`web.xml`中声明Struts2过滤器,如`<filter-class>org....