`
shonghuanc
  • 浏览: 84319 次
文章分类
社区版块
存档分类
最新评论

velocity的几层窗户纸

阅读更多
这几天有一个项目要使用velocity来生成文件,遇到了一些问题,最后也辗转找到了解决的方法。用一个朋友的话说,这就是一层窗户纸。
开发环境:Tomcat5.5,Velocity-1.4
1、velocity模版和配置文件的位置
   为了测试方便,我首先把根据模版生成文件的源代码单独拿出来,代码(省去了无关的代码)如下:
   //FileManager.java
   //初始化方法,获得属性配置
   private void init() {
  try {
   Velocity.init("velocity.properties");
  
  } catch(Exception e) {
   System.out.println("初始化时发生错误!");
   e.printStackTrace();
  }
}

   
        /**
  * 根据模板建立文件
  */
public boolean createFile(String bt, String content, String[] tp, String fileName) {
  //是否创建成功
  boolean isCreateSuccess = true;
 
  try {
   //建立模版
   VelocityContext context = new VelocityContext();
  
   //设置各个变量
   //…
  
   //得到模版
   Template template = Velocity.getTemplate("news.vm");
  
   //写入文件
   //…
  } catch (Exception e) {
   //异常处理
   //…
  }
          }
   这里配置文件是:velocity.properties,模版文件:news.vm,它们和FileManager的package在同一个目录下,如:
   FileManager的package为com.bokee.mydeman,FileManager.class的位置是C:\1\com\bokee\mydeman\FileManager.class,那么velocity.properties和news.vm的路径就是C:\1\velocity.properties和C:\1\news.vm;如果FileManager没有声明package,那么配置文件和模版文件就和FileManager.class在同一个目录下。
   按照以上规则,测试通过。于是移植到Tomcat下面,可是配置文件和模版文件应该放在什么地方呢?按照上面的规则,它们就应该在WEB-INF/classes下,可是实际运行却报出无法找到资源的异常。于是就把它们分别放在了web工程根目录下、WEB-INF下等几个位置,均报同样的异常。google一下,发现竟然要放在system32下,呵呵,这样放置程序如何移植?于是决定自己指定它们的路径,修改后的程序如下:
  //
  public class FileManager {
private String config = "";
       
        //构造函数中指定配置文件和模版文件所在的路径
public FileManager(String config) {
  this.config = config;
  init();
}

/**
  * 初始化模版
  */
private void init() {
  //…
   Velocity.init(config + "/velocity.properties");
  //…
}

/**
  * 根据模板建立文件
  */
public boolean createFile(String bt, String content, String[] tp, String fileName) {
  //…
   Template template = Velocity.getTemplate(config + "/news.vm");
  
  //…
}

    }
   保存测试,init()方法顺利通过,可是模版仍然报出无法找到资源的异常。呜呼,只有google了,说是要使用Velocity的ResourceEngine来加载资源,否则找不到vm文件。按照指示修改源代码,如下:
   VelocityEngine engine = new VelocityEngine();
   Properties properties = new Properties();
   properties.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, config);
   engine.init(properties);
   Template template = engine.getTemplate("news.vm");
   重新运行测试,OK!
2、模版的中文问题
   Java的中文问题像一个幽灵一样总是在程序员的周围转来转去,不定什么时候就会出来骚扰一下。
   news.vm中使用了中文的字符串,在生成的文件中总是会变成莫名其妙的乱码。查阅Velocity的Developer's Guide文档,在Velocity Configuration Keys and Values一节中给出了具体的解决方法,使用input.encoding和output.encoding指定输入和输出的编码格式(默认的是ISO-8859-1),于是在velocity.properties中分别指定二者的值:
   input.encoding = GBK
   output.encoding = GBK
   单独测试通过,可以正确输出中文。可是在Tomcat中无论如何都出不来中文,把这两个属性值在ISO-8859-1、UTF-8和GBK中变换了无数次,仍然是乱码。最后向高人求教,修改源代码为:
   Template template = engine.getTemplate("news.vm","GBK");
   呵呵,一切OK!中文正常显示,向其道谢,笑称“一层窗户纸”。
3、$velocityCount变量
   vm文件中需要使用$velocityCount,并且文件包含了数个循环,而按照Velocity的DOC的说明,$velocityCount是循环的索引值,于是便担心$velocityCount在下一个循环中,会不会以上一个循环的结束值为初始值,实际运行发现这种担心是没有必要,每次$velocityCount都是从1开始计数。
   在循环中要用到$velocityCount的前一个值和后一个值,于是直接使用$velocityCount-1和$velocityCount+1。怪现象出现了,加1的情况可以正确计算出结果,并且能够正确显示,可是减1的语句直接把$velocityCount-1作为一个字符串输出了。把表达式单独提出来,仍然如此。于是改为#set($temp=$velocityCount-1),呵呵,依然如此,$temp并没有被赋为整数值,还是$velocityCount-1字符串。再次修改:
   #set($temp=$velocityCount)
   $temp-1
   运行后,查看生成的文件,问题解决,终于得到了需要的整数值。

分享到:
评论

相关推荐

    velocity-1.5.jar,velocity-1.6.2-dep.jar,velocity-tools-1.3.jar

    Velocity的主要优点在于其简单易用和高度可扩展性,使得开发者能够将业务逻辑与表现层分离,提高代码的可读性和维护性。以下是关于这三个JAR文件的详细知识点: 1. **velocity-1.5.jar**: 这是Velocity的1.5版本...

    velocity为空判断

    在使用Velocity作为视图层处理数据时,常常需要进行空值判断,确保模板能够正确地处理不存在或者值为空的情况。下面我们将详细探讨在Velocity中如何进行空值和空字符串的判断。 ### 1. 判断Velocity变量是否为null ...

    velocity插件

    通过安装 Velocity 插件,开发者可以享受到以下几点便利: 1. **智能提示**:在编写 Velocity 模板时,插件会提供代码自动补全功能,帮助快速输入常用的 Velocity 指令和变量,提高开发效率。 2. **语法高亮**:...

    velocity的所有jar包

    2. **velocity-1.4.jar**:这是Velocity的主要库文件,包含了 Velocity Engine的核心实现。它负责解析模板,执行嵌入的Java代码,并生成最终的输出。版本1.4是一个较早的版本,但依然稳定且广泛使用。其中包含了许多...

    velocity的jar包

    **Velocity简介** Velocity是Apache软件基金会的一个开源项目,它是一个基于Java的模板引擎,用于生成动态网站内容。Velocity被设计成一个轻量级的、快速的、非侵入式的模板语言,使得开发者能够将HTML页面的展示...

    模板:velocity和freemarker的比较

    首先,从功能上来讲,Freemarker 在 View 层提供了 format 日期和数字的功能,这个功能非常贴心,解决了我们在页面上格式化日期或数字的问题。 Velocity 也提供了类似的功能,但是 Freemarker 的实现更加完善。 ...

    velocity入门使用教程

    在本教程中,我们将介绍如何使用Velocity模板引擎,并通过几个实例说明其基本使用方法。教程内容包含了解Velocity模板引擎的基础知识、学习VTL语法、设置和使用velocity.properties配置文件以及如何在Servlet和...

    velocity所需的jar包

    `eclipse相关插件`,虽然不是必需的jar包,但对于使用Eclipse作为IDE的开发者来说,可能需要安装Velocity支持的Eclipse插件,如Velocity视图插件,它能提供模板语法高亮和代码完成等功能,提高开发效率。 为了正确...

    Velocity 和 FreeMarker区别

    ### Velocity与FreeMarker的区别 在IT领域特别是Java开发中,模板引擎是不可或缺的一部分,它们用于将数据模型转换为HTML、PDF、Word文档等格式。在众多模板引擎中,Velocity和FreeMarker是两种非常受欢迎的选择。...

    Velocity1.4

    Velocity Velocity Velocity Velocity Velocity Velocity Velocity Velocity Velocity Velocity

    eclipse中velocity插件

    Velocity是Apache软件基金会的一个开源项目,是一个快速、简单且可扩展的模板引擎,主要用于Web应用中的视图层,允许开发者将HTML页面设计与业务逻辑分离。在Eclipse中集成Velocity插件,可以方便地进行Velocity模板...

    JAVAEE Velocity例子工程

    在传统的Java Web开发中,视图层通常与业务逻辑和数据层分离,Velocity就扮演了视图的角色,允许开发者将HTML模板与Java代码结合,以实现动态页面生成。在这个例子工程中,我们不会遇到Velocity的XML配置文件,这...

    velocity-1.7.jar

    2. **分离关注点**:Velocity将表现层(视图)与业务逻辑(控制器)分离,使得设计师可以专注于页面布局,而开发者可以专注于后端处理。 3. **安全**:由于VTL不支持完整的Java语法,这降低了注入攻击的风险,提高了...

    eclipse编辑velocity插件velocitysite-2.0.8

    Velocity是一个快速、轻量级的Java模板引擎,常用于Web应用的视图层,它允许开发者将业务逻辑与表现层分离,从而实现更清晰的代码结构。 这款插件的主要特点包括: 1. **代码折叠**:允许用户将复杂的 Velocity ...

    velocity的学习资料

    - 在MVC(模型-视图-控制器)架构中,Velocity作为视图层,负责渲染数据,控制器负责处理请求并填充上下文,模型则存储业务数据。 4. **Velocity用户手册** - 用户手册通常会详细介绍Velocity的安装、配置、模板...

    velocity中文

    Velocity的核心理念是“分离展示层和逻辑层”,这使得开发者能够更专注于应用程序的业务逻辑,而不是页面的呈现细节。 ### 2. Velocity模板语言(VTL) Velocity模板语言是一种标记语言,用于描述如何在模板中插入...

    Velocity

    2. **分离关注点**:通过将表现层(视图)与业务逻辑(模型)分离,Velocity促进了软件开发的模块化,有利于团队协作。 3. **强大的上下文**:Velocity上下文是模板和后端Java代码交互的桥梁,你可以向其中放入任何...

    velocity 电子书

    - 在Model-View-Controller架构中,Velocity作为View层,负责展示由Controller处理后的数据。 - 它与Spring、Struts等框架集成,实现高效Web应用开发。 6. **Velocity工具和扩展** - Velocity提供了一些内置工具...

    velocity和freemarker的比较

    标题“velocity和freemarker的比较”涉及到的是两个在Java Web开发中常用的模板引擎——Velocity和FreeMarker。它们都是用于将静态模板与动态数据结合,生成HTML或其他类型的文本输出,常用于MVC(模型-视图-控制器...

    velocity(eclipse插件)

    Velocity 是一个基于 Java 的模板引擎,它被广泛用于Web开发中的视图层,尤其在Apache Struts 和Spring MVC等框架中。然而,为了方便Java开发者在Eclipse集成开发环境中更好地利用Velocity进行开发,Eclipse社区推出...

Global site tag (gtag.js) - Google Analytics