下面这个宏可以让你在web项目中使用相对路径来包含其他的模板文件
#macro(invoke $page)
#if($page.startsWith("/"))
#parse($page)
#else
#set($uri = $request.getAttribute("javax.servlet.include.request_uri"))
#if(!$uri)#set($uri = $request.getServletPath())#end
#set($path = $uri.substring(0, $uri.lastIndexOf("/")))
#parse("$path/$page")
#end
#end
把这段代码加在VM_global_library.vm中,你就可以在页面模板中用#invoke("head.vm")来在页面中嵌入其他的模板文件,比起用#parse指定绝对路径省事很多。
不过这种做法有一个缺点:当子页面还欠有其他页面的时候,相对路径就有点问题,是相对于主页面而非当前页面,这也会给使用上造成一些困扰,但解决的办法还是有的,相对比较复杂而已。
首先我们需要编写一个Toolbox类,例如MyVelocityTool,该类实现接口ViewTool,代码如下:
public class MyVelocityTool implements ViewTool {
protected HttpServletRequest request;
protected HttpServletResponse response;
protected ServletContext context;
protected VelocityContext velocity;
/*
* Initialize toolbox
* @see org.apache.velocity.tools.view.tools.ViewTool#init(java.lang.Object)
*/
public void init(Object arg0) {
if(arg0 instanceof ViewContext){
ViewContext viewContext = (ViewContext) arg0;
request = viewContext.getRequest();
response = viewContext.getResponse();
context = viewContext.getServletContext();
velocity = (VelocityContext)viewContext.getVelocityContext();
}
else if(arg0 instanceof ServletContext){
context = (ServletContext)arg0;
}
}
public String current_template(){
return velocity.getCurrentTemplateName();
}
}
接着在velocity-toolbox.xml中定义这个Toolbox类
dlog
request
com.liusoft.dlog4j.DLOG_VelocityTool
最后修改#invoke宏如下:
#macro(invoke $page)
#if($page.startsWith("/"))
#parse($page)
#else
#set($uri = $dlog.current_template())
#set($path = $uri.substring(0, $uri.lastIndexOf("/")))
#parse("$path/$page")
#end
#end
这就是一个可以完全使用相对路径的方法了,包括子页面嵌入其他的子页面,而不会造成使用的困扰。
分享到:
相关推荐
要在Java Web项目中使用Velocity,首先需要在项目的类路径下添加Velocity的依赖库。然后,配置Velocity的初始化参数,例如模板目录、缓存策略等。接着,创建一个`VelocityContext`对象,用于存放数据,最后使用`...
Velocity是Apache软件基金会的一个开源项目,它是一个强大的模板引擎,常用于Java应用中的视图层,如Web应用、邮件服务等。Velocity通过简洁易读的模板语言,使得开发者可以将HTML页面与业务逻辑分离,提高代码的可...
Velocity 广泛应用于Web开发中,特别是在基于Apache的项目中,如Apache Struts和Spring MVC。它也可以作为邮件模板引擎,生成定制化的邮件内容。 ** 学习路径 ** 阅读Velocity用户手册中文版,可以从基础语法开始...
** Velocity 模板使用指南中文版 ** Velocity 是一个基于 Java ...通过阅读这份《Velocity 模板使用指南中文版》,你将能够掌握 Velocity 的基础和进阶知识,从而在实际项目中灵活运用 Velocity 实现高效的模板渲染。
Velocity模板解析是Apache软件基金会开发的一个Java模板引擎,它允许开发者在HTML、XML、Java源代码等静态文件中嵌入可执行的代码...在实际项目中,熟悉并熟练运用Velocity模板解析,将有助于构建高效、清晰的Web界面。
9. **调试**:Velocity 提供了调试工具,可以帮助开发者找出模板中的错误,如开启日志记录或使用 `VelocityEngine` 的 `parse()` 方法预解析模板。 10. **与其他框架集成**:Velocity 可与 Spring、Struts 等主流 ...
为了在项目中使用Velocity,需要在项目的类路径中添加Velocity的库文件,然后可以通过编程的方式,利用`VelocityEngine`类来初始化引擎,并加载模板文件。 总之,Velocity模板引擎因其简单和功能强大的特点,在Java...
**Velocity官方实例详解** ...理解并熟练掌握Velocity的使用,对于提升Java Web开发中的用户体验和代码质量具有重要意义。通过不断实践和探索,我们可以更好地利用Velocity来满足各种复杂的页面生成需求。
1. 配置Velocity:在Java项目中添加Velocity依赖,配置Velocity的初始化参数,如模板路径等。 2. 创建上下文:填充数据到Velocity上下文中,通常是通过`VelocityContext`类实现。 3. 渲染模板:使用Velocity解释器,...
Spring MVC、Hibernate 和 Velocity 是三个在Java开发中广泛使用的开源框架,它们分别专注于Web应用程序的模型-视图-控制器(MVC)架构、对象关系映射(ORM)以及模板引擎。下面将详细介绍这三个框架以及它们整合...
`location`属性指定JSP文件的路径,而`parse`属性决定`location`是否会被当作OGNL表达式解析,默认值为`true`。 - **示例代码**: ```xml <param name="location">/path/to/success.jsp <param name="parse...
EasyJWeb是一个轻量级的企业级Java Web开发框架,它旨在降低开发难度,提高开发效率。本介绍将详细解析EasyJWeb的一些核心特性和开发实践经验。 1. **易学易用**: - EasyJWeb设计的目标是使开发人员能够快速上手...
总之,`<results>`标签在Struts2中扮演着连接控制器与视图的重要角色,它使得视图的呈现方式多样化,支持JSP、FreeMarker、Velocity等多种模板引擎,同时能够灵活地处理不同场景下的结果展示。通过正确配置`...