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./。 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./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./xml/ns/j2ee xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://java./xml/ns/j2ee http://java./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./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模型进行开发。 |
|
来自: 用勿龍潛 > 《apache click》