`

Apache Click framework测试报告

阅读更多
Apache Click Framework 测试报告

1.Apache Click框架简介 3
2.开发环境配置 3
2.1常规配置 3
2.2 Apache Click IDE安装 3
3.quickstart简易入门程序 5
3.1 web应用结构 5
3.2添加Jar包 6
3.3 Welcome File 6
3.4 Home Page 6
3.5框架模板 8
3.6日志 9
4.Apache Click主要类介绍 11
4.1 Page类 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.1 Control回馈: 17
4.2.2 Control类集: 18
4.2.3 Control类的头部组件 18
4.2.4 Container类 18
5.配置 19
5.1 Servlet Configuration:Servlet设置 19
5.2 Config Service Class:服务类设置 20
5.3 Application Configuration:应用设置 20
5.4 Page:页面设置 20
5.5 Headers:页头设置 21
5.6 Mode:模式设置 21
5.7 Auto Deployed Files:自动部署的文件 21
6.与其他框架集成 22
6.1与struts2集成 22
6.1.1 web.xml 22
6.1.2 click.xml 22
6.1.3 struts.xml 23
6.2与Spring集成 23
7.Apache Click应该注意的几个方面 23
7.1 Click中文显示问题。 23
7.2 在Click中使用FCKEditor控件。 24
7.3 使用Click的页面权限验证: 24
7.4 @Bindable属性 24
7.5 页面命名 24
7.6 Mock 25
8.Apache Click框架优缺点 25
8.1优点 25
8.2 缺点 25
附:Velocity简介 25



1.Apache Click框架简介
Click是一个高性能的J2EE Web应用程序框架适用商业Java开发者,它是基于页面和组件的java web框架,基于事件编程模型,使用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.2 Apache Click IDE安装
下载Click IDE clickide-2.1.0.0.zip,解压后将plugins和 features两个文件夹放置你的Eclipse安装目录,然后开启Eclipse程序。
1. 新建 Dynamic Web Project,其中的configuration选择Apache Click 2.1.0 project;
2. Click IDE提供了对click.xml文件的可视化编辑器,可以更方便的进行编辑。
3. 可以直接新建click Page,如下图所示。
4. 提供了对Velocity Template模版的编辑器,带有自动提示功能。
5. MyEclipse8+暂时不支持该IDE。

图2.1 新建 Dynamic Web Project 项目

图2.2 新建click Page页面
3.quickstart简易入门程序
接下去的主题将涵盖:
 web应用结构
 Jar文件
 Welcome File
 Home Page
 框架模板
 日志
3.1 web应用结构
首先在你的web程序WEB-INF 目录下添加click.xml 和web.xml 配置文件。

• WEB-INF/ click.xml [51] - Application Configuration ( required)
• WEB-INF/ web.xml [50] - Servlet Configuration ( required)


click.xml:
<?xml version="1.0" encoding="UTF-8"?>
<click-app>
  <pages package="com.quickstart.page"/>
</click-app>

web.xml:
<?xml version="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.3 Welcome File

 
为确保默认的请求被转发到 home page, 我们将在web程序根目录下新建redirect.html。 文件内容:
<html>
<head><meta http-equiv="Refresh" content="0;URL=home.htm"></head>
</html>
在web.xml中配置redirect.html, 使默认的请求都由该文件来提供服务。当浏览器执行redirect.html 时, 它将被转发到home.html页面。
3.4 Home Page
1. 现在开始创建页面类。创建包com.quickstart.page,在该包下创建类HomePage.代码如下:
Package com.quickstart.page;  
import java.util.Date;  
import org.apache.click.Page;  
@SuppressWarnings("serial")  
public class HomePage extends Page {  
    //声明一个私有的时间变量。  
    private Date time = new Date();  
    public HomePage () {  
        addModel("time", time);//将该时间变量添加到页面模型map里  
    }  

2. 创建页面home.htm,这里我们将home.htm直接放在webRoot下。代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Insert title here</title>  
</head>  
<body>  
<h1>home--now time : $time</h1>  
</body>  
</html> 
注:$time 对应HomePage.java、addModel("time", time)中的time
3. 修改click.xml文件,确保home.htm能对应到类HomePage.java。在<click-app></click-app>中添加代码:
<click-app charset="UTF-8">  
    <pages package="com.quickstart.page" />  
    <mode value="debug" />  
</click-app> 
注:
(1).这里使用了Click框架的一个重要功能,Automapping即自动映射功能,在请求某页面时,Click将请求自动映射到与页面命名对应的Page类上进行处理,关于Page类在后面有进一步的解释。
(2).<mode value="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
除自动映射外可以强制配置:
<pages package="com.quickstart.page">  
<page path="home.htm" classname="HomePage"/></pages>  
如果我们将页面home.htm不直接放在webRoot下,而是放在page/home.htm下,那么要想让Click自己知道对应的类,则我们需要将click.xml文件修正为<pages package="com.quickstart"/>。以此类推如果是放在quickstart/page/home.htm下,则我们的click.xml文件只需要配置成<pages package="com"/>即可。如果不遵循该规则,则只能在click.xml配置文件中显示声明出来。
显示结果如下:

图3.1 home.htm 显示结果
3.5框架模板
现在我们打算建立一个页面框架模板,以便应用程序页面有一个统一的风格。
首先在web根目录下建立文件border-template.htm。 此文件包含如下内容。
<html>
<head>
<title>Click Quickstart - $title</title>
<link rel="stylesheet" type="text/css" href="$context/assets/style.css" title="Style"/>
</head>
<body>
  <div id="header">
    <span class="title">$title</span>
  </div>
  <div id="container">
    #parse($path)
  </div>
</body>
</html>
注:这里的$context就是网站根目录
现在我们定义BorderPage 类, 并将border-template.htm 文件指定为他的模板。
package com.quickstart.page;
import net.sf.click.Page;
public class BorderPage extends Page {
   public String getTemplate() {
      return "border-template.htm";
   }
}
我们命名模板文件为border-template.htm , 以便它不会自动地被Click映射我们的BorderPage 类。我们修改HomePage 类, 使其继承自BorderPage , 并定义一个title字段。
public class HomePage extends BorderPage {
    public String title = "Home";
}
修改home.htm, 将页面borber去掉。 home.html内容如下:
<b>Welcome</b> to Home page your application starting point.
其他都加载模版border-template.htm上的。
修改后的web应用程序文件如下:

图3.2 框架模版目录
现在, 如果你将浏览器请求定位到更新后的页面,你应该能够看到和前面同样的页面。
3.6日志
Click有一些自带的日志功能, 它们可以帮助你显示页面模板何时自动映射到页面class。 可以在click.xml中添加debug模块来激活debug日志。
<?xml version="1.0" encoding="UTF-8"?>
<click-app>
  <pages package="com.quickstart.page"/>
  <mode value="debug"/>
</click-app>
当click应用启动的时候,它将打印如下日志信息:
[Click] [debug] automapped pages:
[Click] [debug] /border-template.htm -> CLASS NOT FOUND
[Click] [debug] /home.htm -> com.quickstart.page.HomePage
[Click] [info ] initialized in debug mode 
click告诉我们 border-template.htm 模板没有映射到任何page类,但是home.htm 模板被映射到HomePage 类,我们还可以得出click正运行在debug模式下。当向我们的主页发送一个请求时, 我们可以得到如下输出:
[Click] [debug] GET http://localhost:8080/quickstart/home.htm
[Click] [info ] renderTemplate: /home.htm,border-template.htm - 46 ms
[Click] [info ] handleRequest:  /home.htm - 62 ms 
它告诉我们ClickServlet收到的http请求。然后我们看到绘制页面home.htm和模板border-template.htm 用掉了41毫秒。最后,我们可以看到处理请求共用掉了62毫秒。如果你想获得更多的debuging信息, 你可以将应用模式设置为trace。现在, 我们向浏览器发送一个请求:
http://localhost:8080/quickstart/home.htm?user=malcolm&password=secret
我们可以看到请求参数被记录下来,这对调试post方式提交的表单很有用处。
[Click] [debug] GET http://localhost:8080/quickstart/home.htm
[Click] [trace]    request param: password=secret
[Click] [trace]    request param: 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 - 6 ms
[Click] [trace]    invoked: HomePage.onDestroy()
[Click] [info ]  handleRequest:  /home.htm - 24 ms 










4.Apache Click主要类介绍
4.1 Page类

图4.1 Page类 类图
所有的传统页面的映射类都是Page类的子类,Page类与Context类、Control类关系类图如上图所示。Page类主要为Velocity模版上生成的各类组件提供了一个模型,这个模型也包括提供给用户接口控制组件的Control类。而Context类则提供了接收HttpServletRequest属性、参数和HttpSesssion类的接口。
Page类主要有以下方法:
• onSecurityCheck():用于检测用户是否足够权限访问该网站
• onInit():页面初始化,包括Control类组件等。
• onGet():用于接收get动作
• onPost():用于接收post动作
• onRender():页面渲染生成
• onDestroy():销毁

图4.2 Page类顺序图

其中页面生成这步,会添加以下信息到模型中:
 context - the Servlet context path, e.g. /mycorp
 format - the Format object for formatting the display of objects.
 headElements - the HEAD elements, excluding JavaScript, to include in the page header.
 jsElements - the JavaScript imports and script blocks to include in the pages footer.
 messages - the MessagesMap adaptor for the Page getMessage() method
 path - the path of the page template to render
 request - the pages HttpServletRequest object
 response - the pages HttpServletResponse object
 session - the SessionMap adaptor for the users HttpSession


图4.3 Page类活动图
Page主要有涉及以下功能:
4.1.1请求参数自动绑定
 请求路径:http://localhost:8080/mycorp/customer-details.htm?customerId=7203对应的Page类:
package com.mycorp.page;
public class CustomerDetails extends Page {
@Bindable protected Integer customerId;
}
 对应的页面:
<html>
<body>
Customer ID: $customerId
</body>
</html>
 结果显示:
Customer ID: 7203
此外还有请求类型转换自动绑定等功能。
4.1.2用户权限检查
public class Secure extends Page {
public boolean onSecurityCheck() {
if (getContext().hasSession()) { //是否有会话的Session
//if (getContext().getRequest().getRemoteUser() != null) { //客户端用户是否存在
//if (getContext().getRequest().isUserInRole("admin")) { //访问客户是否是admin级别
return true;
} else {
setRedirect(LoginPage.class);
return false;
}
}
}
4.1.3页面导航
 Forward跳转:主要利用servlet 类RequestDispatcher,
用法:setForward("index.htm");
带参数跳转:getContext().setRequestAttribute("customer", customer);
setForward("view-customer.htm");
带页面跳转:EditPage editPage = (EditPage) getContext().createPage("/edit-customer.htm");
       //EditPage editPage = (EditPage) getContext().createPage(EditPage.class);
editPage.setCustomer(customer);
setForward(editPage);
 模版路径:addModel("customer", customer);
setPath("view-customer.htm");
 Redirect跳转:setRedirect("/logout.htm");
String path = getContext().getPagePath(Logout.class);
setRedirect(path);
带参数跳转: setRedirect("trans-complete.htm?transId=" + transId);
接收:       String transId = getContext().getRequest().getParameter("transId");    
4.1.4.模版页面
3.简易入门程序已写
4.1.5.错误处理:
在web.xml设置:
<page path="click/error.htm" classname="com.mycorp.page.ErrorPage"/>
注:其中click/error.htm页面在网站部署后自动生成,同时该文件夹还包括常用的页面和Css.
出现的错误主要是以下两类:
 NullPointerException - in a page method
 ParseErrorException - in a page template
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.4 Control类顺序图

图4.5Control接口类图
Control类主要方法:
 getHeadElements() - defines the controls HTML header imports.
 getMessages() - defines the controls localized messages map.
 getName() / setName() - defines the controls name in the Page model or Form fields.
 getParent() / setParent() - defines the controls parent.
 onDeploy() - deploy resources on startup.
 onInit() - on initialize event handler.
 onProcess() - process request event handler.
 onDestroy() - on destroy event handler.
 render() - generate the control's HTML representation.
4.2.1 Control回馈:
主要有两种方法:ActionListener interface  setListener(Object, String) method
4.2.2 Control类集:

图4.6 Control类集
 ActionLink - provides an anchor link which can invoke callback listeners.
 Field - provides the abstract form field control.
 Form - provides a form control for processing, validation and rendering.
 Submit - provides an input type submit control which can invoke callback listeners.
 TextField - provides an input type text control which can invoke callback listeners.
4.2.3 Control类的头部组件
Control类利用getHeadElements() 方法获得Page HEAD elements。如JsImport, JsScript, CssImport 和CssStyle.
4.2.4 Container类
 Form - an HTML form which provides default layout of fields and error feedback.
 Panel - similar to Page, this Container provides its own template and model.
 FieldSet - draws a legend (border) around its child Controls.

图4.7 Container类图
主要涉及的抽象类有:
 AbstractContainer
 AbstractContainerField
5.配置
• WEB-INF/ click.xml [51] - Application Configuration ( required)
• WEB-INF/ web.xml [50] - Servlet Configuration ( required)

5.1 Servlet Configuration: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>
注:Load On Startup:启动优先权
Type Converter Class:类型转换类

5.2 Config Service Class:服务类设置
<context-param>
<param-name>config-service-class</param-name>
<param-value>com.mycorp.service.CustomConfigSerivce</param-value>
</context-param>
5.3 Application Configuration:应用设置
<pages package="com.mycorp.page"/>
<mode value="profile"/>
高级设置:
<click-app charset="UTF-8" locale="de">
<!-- Specify the Java package where Page classes can be found -->
<pages package="com.mycorp.banking.page">
<page path="index.htm" classname="Home"/>
</pages>
<!-- Specify a second Java package where Page classes can be found -->
<pages package="com.mycorp.common.page"/>
<format classname="com.mycorp.util.Format"/>
<mode value="profile"/>
<log-service classname="org.apache.click.extras.service.Log4JLogService"/>
</click-app>
5.4 Page:页面设置
1.将自动映射automapping设为false后,要手动指定。
<click-app>
<pages package="com.mycorp.page" automapping="false">
<page path="index.htm" classname="Home"/>
<page path="search.htm" classname="Search"/>
<page path="contacts/contacts.htm" classname="contacts.Contacts"/>
<page path="security/login.htm" classname="security.Login"/>
<page path="security/logout.htm" classname="security.Logout"/>
<page path="security/change-password.htm" classname="security.ChangePassword"/>
</pages>
</click-app>
2.automapping默认设置为true后,名称不对应的要手动指定。
<click-app>
<pages package="com.mycorp.page" automapping="true">
<page path="index.htm" classname="Home"/>
</pages>
</click-app>
3.自动绑定autobinding设置为false后,Page类中的Control类不会自动绑定到页面中。
<pages package="com.mycorp.page" autobinding="false"/>
4.autoloading:自动载入,可以实现不用重启服务器也更新页面。
5.5 Headers:页头设置
<headers>
<header name="Pragma" value="no-cache"/>
<header name="Cache-Control"
value="no-store, no-cache, must-revalidate, post-check=0, pre-check=0"/>
<header name="Expires" value="1" type="Date"/>
</headers>
5.6 Mode:模式设置

图 5.1 Mode模式比较
5.7 Auto Deployed Files:自动部署的文件
 click/error.htm - the Page Error Handling [30] template
 click/control.css - the Controls cascading stylesheet
 click/control.js - the Controls JavaScript library
 click/not-found.htm - the Page Not Found [31] template
6.与其他框架集成
6.1与struts2集成
6.1.1 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns=http://java.sun.com/xml/ns/j2ee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://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.2 click.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<click-app charset="UTF-8">

<pages package="demo.page" autobinding="true"></pages>
<mode value="development" />
</click-app>
6.1.3 struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" /> 

<package name="struts2.action" extends="struts-default">
  <action name="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.Apache Click应该注意的几个方面
7.1 Click中文显示问题。
Click显示中文时候,按默认的配置会显示乱码,你可以在click.xml中配置编码:
<click-app charset="UTF-8">
<pages package="page" automapping="true">
</pages>
<headers>
   <header name="Content-Type" value="text/html;charset= UTF-8"/>
</headers>
<mode value="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()事件,你可以通过重写这个函数定义你的权限验证,如:
public boolean onSecurityCheck() {
         if (getContext().getSessionAttribute("user")!=null) {
             return true;
         }else{
             setRedirect(Login.class);
             return false;
         }
     }
7.4 @Bindable属性
在开发过程中,根据文档所给的@Bindable protected 来设置属性,在前台如果采用$+属性名无法读取。因此最好改为@Bindable public.
7.5 页面命名
网页名称与Page类名称对应问题,有些网页名称过长或者单词不规范的,建议中间都采用“-”来给隔离,同时在logger事件中观察是否页面和Page已经配对,实在不行的可以进行手动配对。
7.6 Mock
涉及到mock生成div标签时,记得加入click-mock-2.1.0.jar,可以看到虽然说可以在java类中进行页面布局,但是并不直观。
8.Apache Click框架优缺点
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的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。
Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被当作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务(template service)。Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。

分享到:
评论
1 楼 mxmredfox 2010-07-13  
好东西  长期关注您的博客!我在学习
  问一下,我按照你说的方法处理中文问题,问题却依然存在,没有得到解决,能否更详细一些

相关推荐

    click-book apache click framework介绍

    ### Apache Click Framework 介绍 #### 一、简介 Apache Click 是一个用于开发 Web 应用程序的 Java 框架,旨在提供一个简洁且高效的 API 来构建动态 Web 页面。Click 的设计目标是减少开发时间并提高代码的可读性...

    Apache Click User Guide

    ### Apache Click 用户指南知识点概述 #### 一、Apache Click 概览 - **定义与特点**:Apache Click 是一个专为商业 Java 开发者设计的简单 JEE Web 应用框架。它采用事件驱动的编程模型来处理 Servlet 请求,并...

    通过PrototypeJS的Apache Click Framework PickList控制客户端JavaScript

    "通过PrototypeJS的Apache Click Framework PickList控制客户端JavaScript"这个主题主要探讨的是如何利用PrototypeJS库来增强Apache Click Framework中的PickList控件在客户端的行为。在传统的服务器端渲染模式下,...

    axon-auction-example:AxonFramework 拍卖示例

    2011-06-13 新项目“Meta CQRS”正在进行中(尚未发布) 2011-04-08 切换到 Axonframework 1.0-rc3 2010-12-25 从 CQRS 模型生成样板代码 2010-11-21 开始使用 Apache Click Client 2010-11-06 添加了新的 Axon ...

    JavaSelenium_POM_Framework

    8. **Report Generation**:为了追踪测试结果,框架可能会集成extentreports或其他报告生成工具,以生成详细的测试报告,包括测试步骤、结果和日志。 9. **异常处理**:测试脚本应包含适当的异常处理机制,以确保在...

    JavaEye新闻月刊 - 2009年2月 - 总第12期.pdf

    9. **Apache Click 2.0.1发布**:开源Web框架Apache Click发布了2.0.1版本,提供了一个简单易用的模型视图控制器(MVC)架构,便于快速开发企业级Web应用。 10. **Sun轻量级开源GlassFish组合**:Sun Microsystems...

    websocket整合spring

    此时可以通过浏览器访问项目的首页,测试WebSocket功能是否正常工作。 #### 六、聊天室页面 创建一个简单的聊天室页面,用于展示WebSocket功能。 ```html &lt;!DOCTYPE html&gt; &lt;title&gt;Chat Room ...

    apktool documentation

    For the most part any apk in /system/framework on a device will be a framework file. On some devices they might reside in /data/system-framework and even cleverly hidden in /system/app or /system/priv...

    javaAPI合集

    在MyBatis中,`org.apache.ibatis.session.SqlSession`是与数据库交互的主要接口,而`org.apache.ibatis.builder.AnnotationBuilder`用于构建基于注解的SQL映射器。`@Select`、`@Insert`、`@Update`和`@Delete`是...

    公司招聘异地笔试题.doc

    &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop=...

    基于python的博客设计与开发.doc

    精华帖 (top 5 posts with the highest click-through rates) can be viewed by users regardless of whether they're logged in or not. Users can delete their own blog posts upon logging in, and when ...

    Ajax Starter Kit

    Plug-n-play source code and popular Ajax framework libraries to help you reduce tedious typing and shorten programming tasks. Learn how to… Build better, more interactive interfaces for your web ...

    vb创建PDF文件(已处理乱码)

    在VB(Visual Basic)编程环境中,创建PDF文件是一项常见的任务,尤其在生成报告、文档或电子书籍时。PDF(Portable Document Format)格式因其跨平台性和易于阅读性而被广泛使用。在VB中处理PDF文件时,可能会遇到...

    读取excel文件,生成java文件.pdf

    - 使用Microsoft.Office.Interop库来与Excel交互,这是.NET Framework中的一个组件,允许程序员在不启动Excel应用程序的情况下读取、写入和修改Excel文件。这部分涉及的主要类是`Microsoft.Office.Interop.Excel....

    在Spring Boot中实现大文件的分片上传功能教程

    &lt;groupId&gt;org.apache.commons &lt;artifactId&gt;commons-io ``` 其中,`spring-boot-starter-web`提供了Web应用的基础支持;`spring-boot-starter-thymeleaf`用于实现HTML页面的渲染;而`commons-io`库则用于文件...

    springmvc上传文件controller,vue

    你还可以使用`CommonsMultipartFile`,它基于Apache Commons FileUpload库,提供了更多功能。 在前端,Vue.js可以通过`FormData`对象来构造包含文件的HTTP请求。以下是一个简单的Vue组件示例: ```html ...

    C#计算器++VS2005

    9. **版本控制与开源**:鼓励用户自行修改代码,意味着该项目可能使用了版本控制系统(如Git),并且遵循开源协议(如MIT或Apache),允许他人自由使用和改进。 通过这个项目,不仅可以学习到C#编程的基本技巧,还...

    c# 托盘程序 开源

    3. **事件处理**: C#托盘程序需要监听各种事件,如鼠标点击事件(Click事件)、菜单项选择事件(MenuItem.Click事件)等。在事件处理函数中编写相应的逻辑代码。 4. **隐藏主窗口**: 如果你的程序有主窗口,为了将...

Global site tag (gtag.js) - Google Analytics