首页 > 网站 > Apache > 正文

用Apache Velocity模板引擎速造网站

2024-08-27 18:29:12
字体:
来源:转载
供稿:网友

  基于java的网站开发,很多人都采用jsp作为前端网页制作的技术,尤其是在国内。这种技术通常会存在一些问题,可以通过简单地分析网站开发过程来看看这些问题。通常网站开发采用以下两种方式:

  ◆ 网站功能确定后,由美工设计网页的ui(界面)部分,然后由程序员在其上加入代码显示逻辑(比如循环、判断显示数据结果)。这就是通常的jsp页面制作,当然这部分可以由美工完成模板,然后由jsp工程师以它为原型创建相应的jsp页面。

  ◆ 网站功能确定后,由美工设计网页的ui(界面)部分,然后由网页制作人员在其上加入代码显示逻辑(比如循环、判断显示数据结果)。在这一步的jsp页面制作中,网页制作人员通常只需要懂javascript和html,在工程师的指导下学会如何嵌入jsp taglib标记,然后以美工的模板为原型制作jsp网页。

  显然后一种方式要比前一种方式分工明确。然而在很多小公司,或者项目紧急的情况下,jsp网页制作和后台程序开发都是同一个人,这样无疑加大了程序员的负担。后一种情况也有两个缺点,一是网页制作人员必须学会如何使用jsp taglib,这将加大网页制作人员的负担;二是如果页面因为客户的要求重新设计,那么无论哪种情况,网页制作人员都要将显示逻辑重新嵌入jsp网页。

  虽然从性能角度和taglib的使用上来说,jsp比php和asp做得要好,但它在设计上同样类似php这种服务器页面语言,即在页面中嵌入脚本语言的技术。这使得它虽然比传统基于cgi脚本语言的开发模式速度快,但却将后台程序逻辑与页面显示混淆。

  用mvc模式开发网站

  现在更多的网站制作采用一种称为mvc的模式,也就是将网站制作工作分工,分为m(model,模型)、v(view,视图)和c(controller,控制器)。

  ◆ m(model,模型) m包括后台的事务逻辑、真正处理事务的代码和商业逻辑等,它们是整个网站最重要的工作部分。通常这部分代码相对比较稳定,不会经常变动,就是有所变动也不会对前端的页面产生影响。

  ◆ v(view,视图) v是网页的显示部分,这部分接受来自后台程序的结果或数据,进行显示。v视图通常是变化比较大的部分,比如网站界面的每日更新,每隔一段时间更新网页风格等都会造成v视图部分的大量更改工作。

  ◆ c(controller,控制器) c在视图和模型之间传递控制,并根据要求调用相应的视图显示模型返回的数据,主要负责调度工作。

  这种职责的分工到底有什么好处呢?它简化了软件开发过程中所有相关人员的工作,使不同部分的修改通常不会影响到其它部分的工作。比如,修改后台某些程序的算法并不影响前台的页面显示,前台页面的修改也不影响后台程序的开发。

  这种分工合作比起jsp混淆代码逻辑和显示层的方式要好得多。所以越来越多的国外程序员在不断提出替代jsp的方案。在众多方案中,基于java模板引擎的技术脱颖而出,其中著名的有velocity和webmacro两种模板技术。

  velocity模板引擎

  
模板引擎的设计思想最早由webmacro提出,并被应用在一个著名的搜索引擎www.altavista.com上。后来,这种思想渐渐被apache开发小组所采用,并作为一个子项目被提出来,这就是现在的velocity。

  模板引擎与mvc中视图部分的关系更为密切。velocity可以应用在任何需要格式化数据显示的java程序中。那么velocity到底是什么呢?它的官方解释是:“velocity是一种基于java的模板引擎,它允许任何人使用简单而强大的模板语言来引用定义在java代码中的对象。”

  使用velocity的优点在于:

  ◆ 很容易集成在各种各样的程序领域中;

  ◆ 为网页制作人员提供了一种清晰而简单的语法;

  ◆ 因为模板和代码是分离的,所以可以分别独立的开发和维护它们;

  ◆ velocity引擎可以很容易地集成到一些java运行环境,特别是servlet中;

  ◆ velocity使得模板可以访问任何环境对象中的共有方法。

  velocity的强大之处还在于它严格地区分程序开发功能的职责划分。它通过限制模板可能访问的对象(即后台程序允许其得到的对象)来实现这一点。这意味着网页设计人员可以只把精力放在数据的显示部分(view),而程序员则只要关注如何写好程序的控制层(controller)、商业逻辑与数据管理(model)。这就是典型的mvc开发模式,它简化了开发和日益复杂的应用和维护工作。

  velocity最擅长做的工作包括:

  ◆ 基于servlet的网站制作;

  ◆ java和sql代码生成;

  ◆ xml处理和转换;

  ◆ 文字处理,比如生成trf文件等。

  不过,velocity用得最多的还是在基于java servlet的网页程序中做生成网页的引擎,以替代jsp等技术。除了使用比较容易外,它提供了强大的模板语言来显示和操作数据。注意,不是生成数据,这点很重要,因为生成工作应该是程序逻辑的部分。

  velocity非常适合在j2ee(java 2 platform,enterprise edition)的网站开发中替代jsp,做输出页面的技术工作。虽然jsp包含在j2ee规范中,但是j2ee本身并不需要jsp。

  用velocity做网页

  velocity是如何工作的呢?虽然大多数velocity的应用都是基于servlet的网页制作,但是为了说明velocity的使用,这里将采用更通用的java application来说明它的工作原理。

  任何velocity的应用都包括模板制作和程序部分两个方面。按照惯例,采用helloworld来作为第一个程序的示例。

  1. 模板制作模板示例hellosite.vm的内容如下(虽然其不是以html为主,但很容易改成一个html的页面):

hello $name!  welcome to $site world!

  2.java程序部分

  下面是java代码:

import java.io.stringwriter;import org.apache.velocity.app.velocityengine;import org.apache.velocity.template;import org.apache.velocity.velocitycontext;public class helloworld{public static void main( string[] args )throws exception{/*  first, get and initialize an engine  */velocityengine ve = new velocityengine();ve.init();/*  next, get the template  */template t = ve.gettemplate( "hellosite.vm" );/*  create a context and add data */velocitycontext context = new velocitycontext();context.put("name", "eiffel qiu");context.put("site", "http://www.eiffelqiu.com");/* now render the template into a stringwriter */stringwriter writer = new stringwriter();t.merge( context, writer );/* show the world */system.out.println( writer.tostring() );}}

  将这两个文件放在同一个目录下,编译运行,结果是:

hello eiffel qiu!  welcome to http://www.eiffelqiu.com world

  为了保证运行顺利,请从velocity的网站http://jakarta.apache.org/velocity/上下载velocity的运行包,并将其中velocity jar包的路径放在系统的classpath中,这样就可以顺利编译和运行以上程序了。

  这个程序很简单,但是它能清楚地说明velocity的基本工作原理。程序中的其它部分基本上很固定,最主要的部分在以下几段代码。

  ◆ velocity获取模板文件,得到模板引用:

  

template t = ve.gettemplate( "hellosite.vm" );

  ◆ 初始化环境,并将数据放入环境:

  

velocitycontext context = new velocitycontext();context.put("name", "eiffel qiu");context.put("site", "http://www.eiffelqiu.com");

  ◆ 初始化velocity模板引擎:

  

velocityengine ve = new velocityengine();ve.init();

  ◆ 将环境变量和输出部分结合:

  

stringwriter writer = new stringwriter();t.merge( context, writer );/* show the world */system.out.println( writer.tostring() );

  这一部分在将来的servlet应用中会有所区别,因为网页输出并不和命令行输出相同,如果用于网页输出,将并不通过system.out输出。

  小结

  velocity解决了如何在servlet和网页之间传递数据的问题,当然这种传输数据的机制是在mvc模式上进行的,也就是view、modle和controller之间相互独立工作,一方的修改不影响其它方面的变动。

  他们之间的联系通过环境变量(context)来实现,当然网页制作方和后台程序方要相互约定好对所传递变量的命名,比如上个程序例子中的site、name变量,它们在网页上就是$name、$site。

  这样只要双方约定好变量名字,就可以独立工作了。无论页面如何变化,只要变量名不变,后台程序无需改动,前台网页也可以任意由网页制作人员修改。

  通常简单变量名无法满足网页制作显示数据的需要,比如经常会循环显示一些数据集,或者是根据一些数据的值来决定如何显示下一步的数据等。

  velocity同样提供了循环、判断的简单语法以满足网页制作的需要。velocity提供了一个简单的模板语言,供前端网页制作人员使用,这个模板语言简单到大部分懂得javascript的人都可以很快掌握,其甚至比javascript更简单。

  当然这种简单是刻意的,因为不需要velocity什么都能完成,而只需专注于其应该完成的。view层不应该包含更多的逻辑,velocity的简单模板语法完全可以满足所有对页面显示逻辑的需要,并且也不会发生像jsp那样因为一个无限循环语句而毁掉系统的情况。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表