`
javacoo
  • 浏览: 65639 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

让Web项目中Velocity的#parse支持相对路径

阅读更多
下面这个宏可以让你在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简单实例

    要在Java Web项目中使用Velocity,首先需要在项目的类路径下添加Velocity的依赖库。然后,配置Velocity的初始化参数,例如模板目录、缓存策略等。接着,创建一个`VelocityContext`对象,用于存放数据,最后使用`...

    velocity模板路径

    Velocity是Apache软件基金会的一个开源项目,它是一个强大的模板引擎,常用于Java应用中的视图层,如Web应用、邮件服务等。Velocity通过简洁易读的模板语言,使得开发者可以将HTML页面与业务逻辑分离,提高代码的可...

    Velocity用户手册 中文版

    Velocity 广泛应用于Web开发中,特别是在基于Apache的项目中,如Apache Struts和Spring MVC。它也可以作为邮件模板引擎,生成定制化的邮件内容。 ** 学习路径 ** 阅读Velocity用户手册中文版,可以从基础语法开始...

    Velocity模板使用指南中文版

    ** Velocity 模板使用指南中文版 ** Velocity 是一个基于 Java ...通过阅读这份《Velocity 模板使用指南中文版》,你将能够掌握 Velocity 的基础和进阶知识,从而在实际项目中灵活运用 Velocity 实现高效的模板渲染。

    Velocity模板解析

    Velocity模板解析是Apache软件基金会开发的一个Java模板引擎,它允许开发者在HTML、XML、Java源代码等静态文件中嵌入可执行的代码...在实际项目中,熟悉并熟练运用Velocity模板解析,将有助于构建高效、清晰的Web界面。

    velocity 测试代码

    9. **调试**:Velocity 提供了调试工具,可以帮助开发者找出模板中的错误,如开启日志记录或使用 `VelocityEngine` 的 `parse()` 方法预解析模板。 10. **与其他框架集成**:Velocity 可与 Spring、Struts 等主流 ...

    Velocity入门教程实例

    为了在项目中使用Velocity,需要在项目的类路径中添加Velocity的库文件,然后可以通过编程的方式,利用`VelocityEngine`类来初始化引擎,并加载模板文件。 总之,Velocity模板引擎因其简单和功能强大的特点,在Java...

    velocity官方实例

    **Velocity官方实例详解** ...理解并熟练掌握Velocity的使用,对于提升Java Web开发中的用户体验和代码质量具有重要意义。通过不断实践和探索,我们可以更好地利用Velocity来满足各种复杂的页面生成需求。

    velocity入门篇

    1. 配置Velocity:在Java项目中添加Velocity依赖,配置Velocity的初始化参数,如模板路径等。 2. 创建上下文:填充数据到Velocity上下文中,通常是通过`VelocityContext`类实现。 3. 渲染模板:使用Velocity解释器,...

    springmvc4+hibernate4+velocity1.7jar包

    Spring MVC、Hibernate 和 Velocity 是三个在Java开发中广泛使用的开源框架,它们分别专注于Web应用程序的模型-视图-控制器(MVC)架构、对象关系映射(ORM)以及模板引擎。下面将详细介绍这三个框架以及它们整合...

    Struts2 配置文件

    `location`属性指定JSP文件的路径,而`parse`属性决定`location`是否会被当作OGNL表达式解析,默认值为`true`。 - **示例代码**: ```xml <param name="location">/path/to/success.jsp <param name="parse...

    EasyJWeb开发介绍.ppt

    EasyJWeb是一个轻量级的企业级Java Web开发框架,它旨在降低开发难度,提高开发效率。本介绍将详细解析EasyJWeb的一些核心特性和开发实践经验。 1. **易学易用**: - EasyJWeb设计的目标是使开发人员能够快速上手...

    Java的Struts框架中<results>标签的使用方法

    总之,`<results>`标签在Struts2中扮演着连接控制器与视图的重要角色,它使得视图的呈现方式多样化,支持JSP、FreeMarker、Velocity等多种模板引擎,同时能够灵活地处理不同场景下的结果展示。通过正确配置`...

Global site tag (gtag.js) - Google Analytics