首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
softj (78)
iiprogram (69)
qdzx2008 (50)
goodboy1881 (14)
wangchinaking (58)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
coofucoo (105)
Drate (69)
CSDN - 文档中心 - Java 阅读:10717   评论: 55    参与评论
标题   Velocity -- Java Web 开发新技术     选择自 jacklondon 的 Blog
关键字   Java, JSP, Servlet, template, 模板, Apache, Jakarta, Velocity
出处  

 

Velocity -- Java Web 开发新技术

 关键字:Java, JSP, Servlet, template, 模板, Apache, Jakarta, Velocity
读者要求:了解 Java Servlet 基本概念

 Velocity 是一个基于 Java 的通用模板工具,来自于 jakarta.apache.org 。 Apache 开发的目的是替代 JSP/Struts。

 JSP 是 Sun 开发的 Web 应用程序开发技术,与 PHP, ASP 具有类似功能。但是 JSP 存在着很多问题,使得它难以推广, 请参照 The Problems with JSP by Jason Hunter 。Velocity 主要是用在 Java servlet 中。

 Template 技术最早在 PHP 中作为附加工具包引入。目的是为了解决 PHP 中 常见的 PHP 代码和 HTML 代码混在一起,难以阅读、难以编写、难以修改的问题。其实这种问题在 JSP/ASP 中也存在。ASP 因为语法简单,引入了 VB Script (VBA 最早设计的目的是达到每个 Office 用户都能学会,因而超级易学,VB Script 与 VBA 语法类似) ,使得几乎每个一个会 Java script 的人都能学会。同时会 ASP 和 HTML 的人很多,但是同时会 PHP 和 HTML 的人很少,同时会 JSP 和 HTML 的人更少。PHP 中引入 Template 将 HTML 和 PHP 代码分成不同的文件,会 PHP 的只改 PHP 文件,会 HTML 的只改 HTML 文件,分工明确,因而工作效率大大增强,程序也更容易写。使用 Velocity, java 代码与 HTML 代码分成不同的文件,不用学习 JSP 语法。作为 MVC 的应用技术之一,Velocity 远比 JSP/Struts 在Model 与 View 代码的分离更为成功。

 PHP 的 Template 介绍请参考我的文章 使用PHP4中的 IntegratedTemplate类实现HTML和PHP代码分离使用PHP4中的 IntegratedTemplate类实现BLOCK功能

 Velocity 可以用来产生动态网页,SQL,PostScript 文件和其它可以从模板转换过来的文本文件。我曾经用它来产生 Email 发送感谢信。发给不同用户的 Email 的不同之处在于开始的用户名。用 Velocity 处理这件事很容易。首先用 Dreamweaver 编写一封 HTML 格式的 Email.

 Dear $UserName,

 ....

 然后在 Java 代码中将上面的变量进行替换,发送出去。程序写好后,Email 还可以用 Dreamweaver 随意修改而不用改动 Java 代码。

Velocity 用在 servlet 中示例如下:

1) login.htm

     
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>User Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form name="FormLogin" method="post" action="/login">
<table width="950" height="81" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>&nbsp;</td>
<td colspan="2">Welcome!!</td>
<td>&nbsp;</td>
</tr>
<tr>
<td width="221">&nbsp;</td>
<td width="109">&nbsp;</td>
<td width="374">&nbsp;</td>
<td width="246">&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>Login account:</td>
<td><input name="TextfieldAccount" type="text" id="TextfieldAccount"></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>Password:</td>
<td><input name="TextfieldPassword" type="text" id="TextfieldPassword"></td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><input type="submit" name="Submit" value="Login"></td>
<td>&nbsp;</td>
</tr>
</table>
</form>
</body>
</html>
 
     

2)自 VelocityServlet 继承,写一个子类 login.java

     
 
import javax.servlet.http.*;
import org.apache.velocity.*;
import org.apache.velocity.context.*;
import org.apache.velocity.servlet.*;

public class Login
  extends VelocityServlet {
  protected Template handleRequest(
    HttpServletRequest request,
    HttpServletResponse response,
    Context context) throws Exception {

    boolean checkSuccess = false;
    //check
    //...
    String account = request.getParameter("TextfieldAccount");
    String password = request.getParameter("TextfieldPassword");
    checkSuccess = checkLoginPassword(account,password);

    Template template = null;
    try {
      if (checkSuccess) {
        template = getTemplate("Success.htm");
        context.put("UserName",getLoginUserName());//replace $UserName in html file
      }
      else {
        template = getTemplate("Fail.htm");
        context.put("UserName",getLoginUserName());//replace $UserName in html file
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }

    return template;

  }

  private boolean checkLoginPassword(String account, String password){
    //do something to check
    //....

    return true;
  }

  private String getLoginUserName(){
    return "Test by Jack";
  }
}

	
 
     

3) Success.htm

     
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<body>
<p>Congratulation!!</p>
<p>You are logined as $UserName!!</p>
</body>
</html>

 
     

3) Fail.htm

     
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<body>
<p>Error!!</p>
<p>Fail to login as $UserName!!</p>
</body>
</html>

 
     

基本上来说, Success.htm 和 Fail.htm 都可以用 Dreamweaver 随意排版,不用担心 Java 代码的问题。比起 JSP 文件很多地方无法用 Dreamweaver 排版,只能手工修改 HTML code,Velocity 把我们带入了一个全新的世界。一个只用标准 Java 写 Web 程序,用标准 HTML 写表示层,没有 tag, 没有自定义语法的清晰代码世界。

并且现在没有用任何令人讨厌的 tag. JSP tag 让很多人感到莫名其妙, Java 程序员看着觉得奇怪, 网页程序员看着也觉得奇怪。没有几个人能够精通它,并且没有几个工具能够检查 tag 语法错误,如果你那个地方写错了,没有工具查错是很令人恶心的事。

用了 Velocity, 所有这些烦恼都没有了。放弃设计糟糕的 JSP/Struts 吧。


相关文章
对该文的评论
CSDN 网友 ( 2006-04-02)
velocity的速度要比JSP快很多,这是我喜欢的原因.veloctiy注重的是V,Struts在于C,个人认为,Struts的性能不怎样.还不如自已写C,写M,让veloctiy来完成V,这样就更好.保持KISS原则多好呀.
CSDN 网友 ( 2005-08-16)
struts 不好。在 servier side 网站上面被批得一塌糊涂。关键在 view 的分离不彻底。java 程序员写 tag 肯定必须懂 html , 可以这么说,用 struts 写的程序美工都不怎么好。因为这个程序写完后美工基本上没有办法修改再加工。
CSDN 网友 ( 2005-08-08)
velocity中的模版可以从数据库中取。velocity 的基本思想是字符串替换,html 文件排好版后,运行中替换其中的标记。既然是字符串替换,总归是先取到内存中。
CSDN 网友 ( 2005-05-16)
(王渊命)
还有个问题要请教.
velocity中的模版只能是文件吗?
能不能在数据库里取啊?
这样就可以在后台实现页面的修改.
谢谢
下面那个联系地址是我的,希望得到回复.
CSDN 网友 ( 2005-05-16)

王渊命
希望得到高手们的指点
QQ 116551248
email gongjiezi@163.com