打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Apache Click framework测试报告

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模型进行开发。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Apache java项目全介绍
SSH实现的增删改查实例
tomcat的web.xml设置问题:<servlet-name>Action</servlet-name><url-pattern>*.do的含义
Struts教程
Velocity初体验
struts2 报错:freemarker.log.JDK14LoggerFactory$JDK14Logger error
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服