Apache Click framework测试报告

上班打发 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模型进行开发。

相关推荐