上班打发 2010-03-08
ApacheClickFramework测试报告
1.ApacheClick框架简介3
2.开发环境配置3
2.1常规配置3
2.2ApacheClickIDE安装3
3.quickstart简易入门程序5
3.1web应用结构5
3.2添加Jar包6
3.3WelcomeFile6
3.4HomePage6
3.5框架模板8
3.6日志9
4.ApacheClick主要类介绍11
4.1Page类11
4.1.1请求参数自动绑定14
4.1.2用户权限检查14
4.1.3页面导航14
4.1.4.模版页面15
4.1.5.错误处理:15
4.1.6信息资源文件15
4.2.Control类16
4.2.1Control回馈:17
4.2.2Control类集:18
4.2.3Control类的头部组件18
4.2.4Container类18
5.配置19
5.1ServletConfiguration:Servlet设置19
5.2ConfigServiceClass:服务类设置20
5.3ApplicationConfiguration:应用设置20
5.4Page:页面设置20
5.5Headers:页头设置21
5.6Mode:模式设置21
5.7AutoDeployedFiles:自动部署的文件21
6.与其他框架集成22
6.1与struts2集成22
6.1.1web.xml22
6.1.2click.xml22
6.1.3struts.xml23
6.2与Spring集成23
7.ApacheClick应该注意的几个方面23
7.1Click中文显示问题。23
7.2在Click中使用FCKEditor控件。24
7.3使用Click的页面权限验证:24
7.4@Bindable属性24
7.5页面命名24
7.6Mock25
8.ApacheClick框架优缺点25
8.1优点25
8.2缺点25
附:Velocity简介25
1.ApacheClick框架简介
Click是一个高性能的J2EEWeb应用程序框架适用商业Java开发者,它是基于页面和组件的javaweb框架,基于事件编程模型,使用Velocity模板作为页面视图,没有复杂的抽象和定义,简单易学,商业开发者能够在一天内把它运行起来。
◆简单易学,
◆面向页面与组件设计,
◆基于事件编程模型,
◆自动表单验证,
◆使用Velocity模板作为页面视图,
◆漂亮的错误报告功能,
◆使用Rico(一个开源的JavaScript库,它提供对AJAX完全支持并可让Web应用程序支持拖放操作等其它功能)来对AJAX的支持等。
2.开发环境配置
2.1常规配置
jdk:1.6;
IDE:eclipse3.5带wtp插件;
Tomcat:5.5或者6.0;
click包:click-2.1.0-RC1-incubating或者click-2.1.0,下载网址:http://click.apache.org/。
2.2ApacheClickIDE安装
下载ClickIDEclickide-2.1.0.0.zip,解压后将plugins和features两个文件夹放置你的Eclipse安装目录,然后开启Eclipse程序。
1.新建DynamicWebProject,其中的configuration选择ApacheClick2.1.0project;
2.ClickIDE提供了对click.xml文件的可视化编辑器,可以更方便的进行编辑。
3.可以直接新建clickPage,如下图所示。
4.提供了对VelocityTemplate模版的编辑器,带有自动提示功能。
5.MyEclipse8+暂时不支持该IDE。
图2.1新建DynamicWebProject项目
图2.2新建clickPage页面
3.quickstart简易入门程序
接下去的主题将涵盖:
web应用结构
Jar文件
WelcomeFile
HomePage
框架模板
日志
3.1web应用结构
首先在你的web程序WEB-INF目录下添加click.xml和web.xml配置文件。
•WEB-INF/click.xml[51]-ApplicationConfiguration(required)
•WEB-INF/web.xml[50]-ServletConfiguration(required)
click.xml:
<?xmlversion="1.0"encoding="UTF-8"?>
<click-app>
<pagespackage="com.quickstart.page"/>
</click-app>
web.xml:
<?xmlversion="1.0"encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>ClickServlet</servlet-name>
<servlet-class>org.apache.click.ClickServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ClickServlet</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>redirect.html</welcome-file>
</welcome-file-list>
</web-app>
3.2添加Jar包
把如下jar文件添加到你的程序的WEB-INF/lib目录下:
click-2.1.0-RC1-incubating.jar(核心包)、click-extras-2.1.0-RC1-incubating.jar(扩展包)或者click-2.1.0.jar、click-extras-2.1.0.jar
3.3WelcomeFile
为确保默认的请求被转发到homepage,我们将在web程序根目录下新建redirect.html。文件内容:
<html>
<head><metahttp-equiv="Refresh"content="0;URL=home.htm"></head>
</html>
在web.xml中配置redirect.html,使默认的请求都由该文件来提供服务。当浏览器执行redirect.html时,它将被转发到home.html页面。
3.4HomePage
1.现在开始创建页面类。创建包com.quickstart.page,在该包下创建类HomePage.代码如下:
Packagecom.quickstart.page;
importjava.util.Date;
importorg.apache.click.Page;
@SuppressWarnings("serial")
publicclassHomePageextendsPage{
//声明一个私有的时间变量。
privateDatetime=newDate();
publicHomePage(){
addModel("time",time);//将该时间变量添加到页面模型map里
}
}
2.创建页面home.htm,这里我们将home.htm直接放在webRoot下。代码如下:
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">
<title>Inserttitlehere</title>
</head>
<body>
<h1>home--nowtime:$time</h1>
</body>
</html>
注:$time对应HomePage.java、addModel("time",time)中的time
3.修改click.xml文件,确保home.htm能对应到类HomePage.java。在<click-app></click-app>中添加代码:
<click-appcharset="UTF-8">
<pagespackage="com.quickstart.page"/>
<modevalue="debug"/>
</click-app>
注:
(1).这里使用了Click框架的一个重要功能,Automapping即自动映射功能,在请求某页面时,Click将请求自动映射到与页面命名对应的Page类上进行处理,关于Page类在后面有进一步的解释。
(2).<modevalue="debug"/>声明后台日志的模式是什么,这里设置为debug级别。
除此之外还有development(开发模式info)、profile(规范输出模式info)、production(生产模式warn)、trace(跟踪模式)
(3).pages有属性automapping默认为true该属性将决定是否自动映射除WEB-INF下所有page到相应的类。
(4).启动tomcat,在浏览器地址中输入http://localhost:8080/quickstart/home.htm即可看到效果。如果仅在click.xml中声明包名让Click自己去定位(automapping="true")页面对应类,则需要注意页面名称跟类名之间的关系。
对应规则为:
change-password.htm=>ChangePassword
change_password.htm=>ChangePassword
changePassword.htm=>ChangePassword
ChangePassword.htm=>ChangePassword
customer.htm=>CustomerPage
change-password.htm=>ChangePasswordPage
除自动映射外可以强制配置:
<pagespackage="com.quickstart.page">
<pagepath="home.htm"classname="HomePage"/></pages>
如果我们将页面home.htm不直接放在webRoot下,而是放在page/home.htm下,那么要想让Click自己知道对应的类,则我们需要将click.xml文件修正为<pagespackage="com.quickstart"/>。以此类推如果是放在quickstart/page/home.htm下,则我们的click.xml文件只需要配置成<pagespackage="com"/>即可。如果不遵循该规则,则只能在click.xml配置文件中显示声明出来。
显示结果如下:
图3.1home.htm显示结果
3.5框架模板
现在我们打算建立一个页面框架模板,以便应用程序页面有一个统一的风格。
首先在web根目录下建立文件border-template.htm。此文件包含如下内容。
<html>
<head>
<title>ClickQuickstart-$title</title>
<linkrel="stylesheet"type="text/css"href="$context/assets/style.css"title="Style"/>
</head>
<body>
<divid="header">
<spanclass="title">$title</span>
</div>
<divid="container">
#parse($path)
</div>
</body>
</html>
注:这里的$context就是网站根目录
现在我们定义BorderPage类,并将border-template.htm文件指定为他的模板。
packagecom.quickstart.page;
importnet.sf.click.Page;
publicclassBorderPageextendsPage{
publicStringgetTemplate(){
return"border-template.htm";
}
}
我们命名模板文件为border-template.htm,以便它不会自动地被Click映射我们的BorderPage类。我们修改HomePage类,使其继承自BorderPage,并定义一个title字段。
publicclassHomePageextendsBorderPage{
publicStringtitle="Home";
}
修改home.htm,将页面borber去掉。home.html内容如下:
<b>Welcome</b>toHomepageyourapplicationstartingpoint.
其他都加载模版border-template.htm上的。
修改后的web应用程序文件如下:
图3.2框架模版目录
现在,如果你将浏览器请求定位到更新后的页面,你应该能够看到和前面同样的页面。
3.6日志
Click有一些自带的日志功能,它们可以帮助你显示页面模板何时自动映射到页面class。可以在click.xml中添加debug模块来激活debug日志。
<?xmlversion="1.0"encoding="UTF-8"?>
<click-app>
<pagespackage="com.quickstart.page"/>
<modevalue="debug"/>
</click-app>
当click应用启动的时候,它将打印如下日志信息:
[Click][debug]automappedpages:
[Click][debug]/border-template.htm->CLASSNOTFOUND
[Click][debug]/home.htm->com.quickstart.page.HomePage
[Click][info]initializedindebugmode
click告诉我们border-template.htm模板没有映射到任何page类,但是home.htm模板被映射到HomePage类,我们还可以得出click正运行在debug模式下。当向我们的主页发送一个请求时,我们可以得到如下输出:
[Click][debug]GEThttp://localhost:8080/quickstart/home.htm
[Click][info]renderTemplate:/home.htm,border-template.htm-46ms
[Click][info]handleRequest:/home.htm-62ms
它告诉我们ClickServlet收到的http请求。然后我们看到绘制页面home.htm和模板border-template.htm用掉了41毫秒。最后,我们可以看到处理请求共用掉了62毫秒。如果你想获得更多的debuging信息,你可以将应用模式设置为trace。现在,我们向浏览器发送一个请求:
http://localhost:8080/quickstart/home.htm?user=malcolm&password=secret
我们可以看到请求参数被记录下来,这对调试post方式提交的表单很有用处。
[Click][debug]GEThttp://localhost:8080/quickstart/home.htm
[Click][trace]requestparam:password=secret
[Click][trace]requestparam:user=malcolm
[Click][trace]invoked:HomePage.<<init>>
[Click][trace]invoked:HomePage.onSecurityCheck():true
[Click][trace]invoked:HomePage.onInit()
[Click][trace]invoked:HomePage.onGet()
[Click][trace]invoked:HomePage.onRender()
[Click][info]renderTemplate:/user/home.htm,border-template.htm-6ms
[Click][trace]invoked:HomePage.onDestroy()
[Click][info] handleRequest:/home.htm-24ms
4.ApacheClick主要类介绍
4.1Page类
图4.1Page类类图
所有的传统页面的映射类都是Page类的子类,Page类与Context类、Control类关系类图如上图所示。Page类主要为Velocity模版上生成的各类组件提供了一个模型,这个模型也包括提供给用户接口控制组件的Control类。而Context类则提供了接收HttpServletRequest属性、参数和HttpSesssion类的接口。
Page类主要有以下方法:
•onSecurityCheck():用于检测用户是否足够权限访问该网站
•onInit():页面初始化,包括Control类组件等。
•onGet():用于接收get动作
•onPost():用于接收post动作
•onRender():页面渲染生成
•onDestroy():销毁
图4.2Page类顺序图
其中页面生成这步,会添加以下信息到模型中:
context-theServletcontextpath,e.g./mycorp
format-theFormatobjectforformattingthedisplayofobjects.
headElements-theHEADelements,excludingJavaScript,toincludeinthepageheader.
jsElements-theJavaScriptimportsandscriptblockstoincludeinthepagesfooter.
messages-theMessagesMapadaptorforthePagegetMessage()method
path-thepathofthepagetemplatetorender
request-thepagesHttpServletRequestobject
response-thepagesHttpServletResponseobject
session-theSessionMapadaptorfortheusersHttpSession
图4.3Page类活动图
Page主要有涉及以下功能:
4.1.1请求参数自动绑定
请求路径:http://localhost:8080/mycorp/customer-details.htm?customerId=7203对应的Page类:
packagecom.mycorp.page;
publicclassCustomerDetailsextendsPage{
@BindableprotectedIntegercustomerId;
}
对应的页面:
<html>
<body>
CustomerID:$customerId
</body>
</html>
结果显示:
CustomerID:7203
此外还有请求类型转换自动绑定等功能。
4.1.2用户权限检查
publicclassSecureextendsPage{
publicbooleanonSecurityCheck(){
if(getContext().hasSession()){//是否有会话的Session
//if(getContext().getRequest().getRemoteUser()!=null){//客户端用户是否存在
//if(getContext().getRequest().isUserInRole("admin")){//访问客户是否是admin级别
returntrue;
}else{
setRedirect(LoginPage.class);
returnfalse;
}
}
}
4.1.3页面导航
Forward跳转:主要利用servlet类RequestDispatcher,
用法:setForward("index.htm");
带参数跳转:getContext().setRequestAttribute("customer",customer);
setForward("view-customer.htm");
带页面跳转:EditPageeditPage=(EditPage)getContext().createPage("/edit-customer.htm");
//EditPageeditPage=(EditPage)getContext().createPage(EditPage.class);
editPage.setCustomer(customer);
setForward(editPage);
模版路径:addModel("customer",customer);
setPath("view-customer.htm");
Redirect跳转:setRedirect("/logout.htm");
Stringpath=getContext().getPagePath(Logout.class);
setRedirect(path);
带参数跳转:setRedirect("trans-complete.htm?transid="+transId);
接收:StringtransId=getContext().getRequest().getParameter("transId");
4.1.4.模版页面
3.简易入门程序已写
4.1.5.错误处理:
在web.xml设置:
<pagepath="click/error.htm"classname="com.mycorp.page.ErrorPage"/>
注:其中click/error.htm页面在网站部署后自动生成,同时该文件夹还包括常用的页面和Css.
出现的错误主要是以下两类:
NullPointerException-inapagemethod
ParseErrorException-inapagetemplate
4.1.6信息资源文件
类似于struts中资源文件。比如说有个Page类/com/mycorp/page/Login,对应的properties文件名对应为:/com/mycorp/page/Login.properties。信息属性文件设计的方法主要有:
getMessage(String)
getMessage(String,Object)
getMessage(String,Object[])
getMessages()
setErrorMessage(String)
setErrorMessage(String,Object)
4.2.Control类
图4.4Control类顺序图
图4.5Control接口类图
Control类主要方法:
getHeadElements()-definesthecontrolsHTMLheaderimports.
getMessages()-definesthecontrolslocalizedmessagesmap.
getName()/setName()-definesthecontrolsnameinthePagemodelorFormfields.
getParent()/setParent()-definesthecontrolsparent.
onDeploy()-deployresourcesonstartup.
onInit()-oninitializeeventhandler.
onProcess()-processrequesteventhandler.
onDestroy()-ondestroyeventhandler.
render()-generatethecontrol'sHTMLrepresentation.
4.2.1Control回馈:
主要有两种方法:ActionListenerinterfacesetListener(Object,String)method
4.2.2Control类集:
图4.6Control类集
ActionLink-providesananchorlinkwhichcaninvokecallbacklisteners.
Field-providestheabstractformfieldcontrol.
Form-providesaformcontrolforprocessing,validationandrendering.
Submit-providesaninputtypesubmitcontrolwhichcaninvokecallbacklisteners.
TextField-providesaninputtypetextcontrolwhichcaninvokecallbacklisteners.
4.2.3Control类的头部组件
Control类利用getHeadElements()方法获得PageHEADelements。如JsImport,JsScript,CssImport和CssStyle.
4.2.4Container类
Form-anHTMLformwhichprovidesdefaultlayoutoffieldsanderrorfeedback.
Panel-similartoPage,thisContainerprovidesitsowntemplateandmodel.
FieldSet-drawsalegend(border)arounditschildControls.
图4.7Container类图
主要涉及的抽象类有:
AbstractContainer
AbstractContainerField
5.配置
•WEB-INF/click.xml[51]-ApplicationConfiguration(required)
•WEB-INF/web.xml[50]-ServletConfiguration(required)
5.1ServletConfiguration:Servlet设置
web.xml:
<web-app>
<servlet>
<servlet-name>ClickServlet</servlet-name>
<servlet-class>org.apache.click.ClickServlet</servlet-class>
<load-on-startup>0</load-on-startup>
<init-param>
<param-name>type-converter-class</param-name>
<param-value>com.mycorp.util.CustomTypeConverter</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ClickServlet</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
</web-app>
注:LoadOnStartup:启动优先权
TypeConverterClass:类型转换类
5.2ConfigServiceClass:服务类设置
<context-param>
<param-name>config-service-class</param-name>
<param-value>com.mycorp.service.CustomConfigSerivce</param-value>
</context-param>
5.3ApplicationConfiguration:应用设置
<pagespackage="com.mycorp.page"/>
<modevalue="profile"/>
高级设置:
<click-appcharset="UTF-8"locale="de">
<!--SpecifytheJavapackagewherePageclassescanbefound-->
<pagespackage="com.mycorp.banking.page">
<pagepath="index.htm"classname="Home"/>
</pages>
<!--SpecifyasecondJavapackagewherePageclassescanbefound-->
<pagespackage="com.mycorp.common.page"/>
<formatclassname="com.mycorp.util.Format"/>
<modevalue="profile"/>
<log-serviceclassname="org.apache.click.extras.service.Log4JLogService"/>
</click-app>
5.4Page:页面设置
1.将自动映射automapping设为false后,要手动指定。
<click-app>
<pagespackage="com.mycorp.page"automapping="false">
<pagepath="index.htm"classname="Home"/>
<pagepath="search.htm"classname="Search"/>
<pagepath="contacts/contacts.htm"classname="contacts.Contacts"/>
<pagepath="security/login.htm"classname="security.Login"/>
<pagepath="security/logout.htm"classname="security.Logout"/>
<pagepath="security/change-password.htm"classname="security.ChangePassword"/>
</pages>
</click-app>
2.automapping默认设置为true后,名称不对应的要手动指定。
<click-app>
<pagespackage="com.mycorp.page"automapping="true">
<pagepath="index.htm"classname="Home"/>
</pages>
</click-app>
3.自动绑定autobinding设置为false后,Page类中的Control类不会自动绑定到页面中。
<pagespackage="com.mycorp.page"autobinding="false"/>
4.autoloading:自动载入,可以实现不用重启服务器也更新页面。
5.5Headers:页头设置
<headers>
<headername="Pragma"value="no-cache"/>
<headername="Cache-Control"
value="no-store,no-cache,must-revalidate,post-check=0,pre-check=0"/>
<headername="Expires"value="1"type="Date"/>
</headers>
5.6Mode:模式设置
图5.1Mode模式比较
5.7AutoDeployedFiles:自动部署的文件
click/error.htm-thePageErrorHandling[30]template
click/control.css-theControlscascadingstylesheet
click/control.js-theControlsJavaScriptlibrary
click/not-found.htm-thePageNotFound[31]template
6.与其他框架集成
6.1与struts2集成
6.1.1web.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<web-appid="WebApp_ID"version="2.4"xmlns=http://java.sun.com/xml/ns/j2eexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>click</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>click-servlet</servlet-name>
<servlet-class>org.apache.click.ClickServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>click-servlet</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
6.1.2click.xml
<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?>
<click-appcharset="UTF-8">
<pagespackage="demo.page"autobinding="true"></pages>
<modevalue="development"/>
</click-app>
6.1.3struts.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constantname="struts.enable.DynamicMethodInvocation"value="false"/>
<constantname="struts.devMode"value="false"/>
<packagename="struts2.action"extends="struts-default">
<actionname="HelloWorld"class="struts2.action.HelloWorld">
<result>HelloWorld.jsp</result>
</action>
</package>
</struts>
6.2与Spring集成
Web.xml:
<servlet>
<servlet-name>click-servlet</servlet-name>
<servlet-class>org.apache.click.ClickServlet</servlet-class>
<init-param>
<param-name>spring-path</param-name>
<param-value>/applicationContext.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
7.ApacheClick应该注意的几个方面
7.1Click中文显示问题。
Click显示中文时候,按默认的配置会显示乱码,你可以在click.xml中配置编码:
<click-appcharset="UTF-8">
<pagespackage="page"automapping="true">
</pages>
<headers>
<headername="Content-Type"value="text/html;charset=UTF-8"/>
</headers>
<modevalue="debug">
</mode>
</click-app>
推荐使用万国码UTF-8,记住workspace的编码也相应设置为UTF-8.同时可以载模版资源文件velocity.properties设置:
input.encoding=UTF-8
注意编码要统一,如果用UTF-8就要全部配置为UTF-8。
7.2在Click中使用FCKEditor控件。
FCKEditor控件的JAVA版本可以有三种使用方式,在Click中大约只能是JAVASCRIPT方式。至于FCKEditor的具体配置方式请参考网上资料。
在Click中使用时候首先需要在Page类中申明一个TextArea控件。
7.3使用Click的页面权限验证:
Click的整个Page周期中有个onSecurityCheck()事件,你可以通过重写这个函数定义你的权限验证,如:
publicbooleanonSecurityCheck(){
if(getContext().getSessionAttribute("user")!=null){
returntrue;
}else{
setRedirect(Login.class);
returnfalse;
}
}
7.4@Bindable属性
在开发过程中,根据文档所给的@Bindableprotected来设置属性,在前台如果采用$+属性名无法读取。因此最好改为@Bindablepublic.
7.5页面命名
网页名称与Page类名称对应问题,有些网页名称过长或者单词不规范的,建议中间都采用“-”来给隔离,同时在logger事件中观察是否页面和Page已经配对,实在不行的可以进行手动配对。
7.6Mock
涉及到mock生成div标签时,记得加入click-mock-2.1.0.jar,可以看到虽然说可以在java类中进行页面布局,但是并不直观。
8.ApacheClick框架优缺点
8.1优点
(1)Click是基于事务编程的思想,与Struts、Spring、Tapestry等泛滥使用XML相比,采用java文件编译的速度要快得多。
(2)click包含40种左右的控件,这些控件对应了大部分主要的HMTL元素。click表单和控件提供了自动验证和页面呈现,使程序开发变得更加快速和健壮。
(3)Click使用Velocity引擎来呈现HTML。Velocity有一组非常容易学习和使用的简单指令集。
(4)简单易学:click被设计的很简单以便于学习,新开发者在一天内就可上手并运行出来。这对技术层次跨度很大的开发团队是非常关键的。文档齐全,而且例子很多,容易上手。
8.2缺点
(1)作为一门流行度不广的框架,其成熟度无法与struts、webwork等相比,因此在遇到问题时难以有参考;
(2)虽然说利用Page类来render页面的思想很大程度上提高了网页生成的速度,但是这让网页设计变得更不直观。
()与现有的框架吻合度并不是很好。
附:Velocity简介
Velocity是一个基于java的模板引擎(templateengine)。它允许任何人仅仅简单的使用模板语言(templatelanguage)来引用由java代码定义的对象。当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。
Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被当作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。Velocity也可以为Turbineweb开发架构提供模板服务(templateservice)。Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。