




已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Tapestry 开发基础姚旭平1、Tapestry背景知识历史:作者 Howard Lewis Ship ,创建于2000Tapestry 3 发布于 2004-04Tapestry 4 发布于 2006-1-7Howard Lewis Ship 是个有天分的架构师和程序员,把面向对象的理念和jsp的页面展示完美的结合了起来,熟练的利用Tapestry进行Web应用编程,犹如黑夜中给了你一双明亮的眼睛,并赐给你一双想像的翅膀。资料:l Tapestry in Action该书是介绍Tapestry的权威著作,作者 Howard Lewis Ship是Tapestry的创始人。讲解Tapestry 3.0,但是仍普遍适用于Tapestry 4.0。l Enjoy Web Development with Tapestry作者Kent Tong,介绍Tapestry 4.0,廖盛有其影印版本l Tapestry开发指南0.9作者董黎伟,该书是介绍tapestry 3.0 l Tapestry4开发指南作者董黎伟,该书是介绍tapestry 4.0l Tapestry自身发布的doc包。利用tapestry开发的范例workbeanch 3.0 & 4.0:基于tapestry 3.0 和4.0的实现,基本囊括了tapestry的各个组件。onet:基于tapestry4 论坛软件luntbuild:基于tapestry4的日常构建软件基于tapestry的一些框架:trails:Trails是一个领域驱动开发框架,它使用了Hibernate、Spring和Tapestry。其中,Hibernate 被用作数据访问层,Tapestry用来给用户显示数据。而Spring 则是把Hibernate和Tapestry连接在一起,并通过aspectJ搭建了一个功能强大的AOP框架,(Howard在blog发表声明,aspectJ将和tapestry5整合)类似Rails on Ruby,Trails帮你整合了从前端表示层到服务层到O/R映射层,是你更加关注自己的业务逻辑。Trails目前集成了tapestry 3 和tapestry 4的版本。cognition:主要整合了Hibernate、Spring、Tapestry,利用eclipse的插件框架,提供方便的GUI工具。目前是基于Tapestry42、Tapestry特点Tapestry是一个基于组件的框架致力于开发Web应用,引用Tapestry网站上的一句话:Tapestry用对象(objects),方法(methods),属性(properties)替代以往的URLs和查询参数, 重新诠释Web应用开发。简单性Tapestry应用与传统的Servlet/JSP应用相比代码量更少。一致性Tapestry为开发Web应用的页面提供了一致的方式。这样有助于消除传统Servlet应用开发中臆测。由于所有Tapestry应用中的页面都是用相同的可复用的控件组织而成,所以工作方式是相似的。效率Tapestr应用拥有高度的可升级性,它利用缓存和对象池使每个请求的处理时间最小化。Tapestry应用拥有跟传统Servlet应用相仿的性能。错误反馈提供了良好的可视界面向开发者指出了哪行出现了问题,并把当前环境打印出来,供开发者分析判断。3、环境搭建选择Eclipse作为开发平台,使用myEclipse 4.03作为通用插件,该版本插件已经把tapestry整合在内。软件:eclipse-SDK-3.1.1-win32.zipEclipse 3.1.1 程序包NLpack1-eclipse-SDK-3.1.1a-win32.zip配套的中文资源包EnterpriseWorkbenchInstaller_4.0.3GA_E3.1.exeMyEclispe 4.0.3 通用的eclipse 插件 for eclipse 3.1配置:安装完毕,需要对eclipse进行配置,应用服务器的配置,数据库的配置当前环境为: windows 2000 sp4 jdk 1.4.24、Tapestry的基础设置1、如何通过myEclipse引入Tapestry,建立框架环境。A、通过myEclipse创建web项目 b、输入一个项目名称,点击完成即可C、右健点击刚刚建立的项目,通过myEclipse找到添加tapestry特性的标签 d、完成后的框架文件2、测试tapestry3选择tomcat5作为应用服务器的发布。再在eclipse中启动tomcat服务器,在ie中输入tapestry项目的url,即可3、Tapestry 3 和Tapestry 4的主要差别目前主要使用的是tapestry 3 和tapestry 4,其中tapestry4有2个主要的改进:1. 利用了jdk5的annotations功能,简化了程序。在Tapestry4.0中,引入了单独的功能:JDK 5的annotation。但是Tapestry本身是支持jdk1.3以上JDK版本,所以即便不使用JDK 5,不使用Tapestry annotation包,完全可以达到同样的开发效果(写法就和tapestry3 的类似)。2. tapestry自己带了一个类似IoC的容器:hivemind,类似于spring目前在实际项目采用的是tapestry3,在这里主要讲述tapestry3的功能。5、Tapestry编程在我们理解了tapestry的编程思想和风格后,用tapestry编写web项目,是一件很愉快的事情;就象我们学习国际标准舞一样:过程是辛苦的,但舞伴是美丽的;曲线是陡峭的,但舞姿是典雅的。设置我们的应用服务器,我们这里选择的是tomcat 5.0.28,jdk 1.4.2设置tomcat 5.0.28然后我们要确保JDK的版本是否正确,并且加载两条JVM参数:-Dorg.apache.tapestry.disable-caching=true-Dorg.apache.tapestry.enable-reset-service=true设置tapestry开发模式参数它们的作用是关闭Tapestry的页面缓存,这样在开发项目的时候,修改html和page之后,不需要频繁地重新启动项目。但是在加载这两条参数之后,内存消耗比较大,所以在项目发布的时候,我们就不再使用这两条参数了。Tapestry的思想Tapestry应用程序由N个页面组成,这些页面都是由独立的,可重复使用,可配置的组件组成,tapestry把它们整合成一个统一的整体。Tapestry项目的重要成员Page页面1个html文件,用来页面的展示1个java文件,用于定义业务的逻辑1个page文件,用于关联html文件和java文件,3个文件统称一个Tapestry页面(下面简称页面),该页面是tapestry 项目中定义好的一个命名空间,tapestry 项目能找到该页面。我们在利用插件功能的时候,系统会帮助你生成一个page文件,一个html文件,并在application帮你申请了一个命名空间,我们需要定义一个java文件,并和page文件中的有关属性定义起来。Twork1.application (假定我们的项目为Twork1)定义了一个命名空间,由插件帮你生成定义了对应的java文件Hello.page add a description1、 属性定义2、 组件定义3、 效验定义4、 服务定义Hello.html hello,you name.Hello.javapublic abstract class Hello extends BasePage 我们的业务代码该3个类都在application文件中进行申明Engine类:这是系统缺省定义的tapestry engine,能满足大部分的要求在我们有特殊要求,比如需要和spring集成,需要自定义错误页面,修改tapestry缺省的行为等等,就需要我们自定义engineglobal类:类似application全局变量,在整个tapestry运行期间,都有效比如:建立和数据库的连接,加载缺省的应用参数,等等Visit类:类似一个session变量,用户登陆系统后,得到的用户信息就可以存储在这里UserContext ucxt = (UserContext)this.getVisit(); /得到该visit对象在这里自定义了自己的visit和global类Tapestry 系统组件Tapestry自身提供了不少实用的组件,比如pagelink,insert,Form, table,学习tapestry很大一部分就是对tapestry的组件的熟悉过程,以及相互配合使用。1、机器翻译输入框输入010的数字点击翻译,下面的输出框就能显示成大写的数字该程序涉及到了3个文件:Translate.page:Translate.html:Translate.java:该程序要注意2个变量的声明,5个隐含组件的使用。Translate.htmlTapestry的html模板:页面模板的绝大部分是普通的HTML,只有少部分Tapestry特有的属性和标签。这种模板机制的优势就是Tapestry页面模板可以在一个可见即所得的编辑器里创建和预览。数字翻译器 输入数字值: /tr翻译成大写: 返回home1、申明了2个变量(注意大小写):inputvalue;outvalue,需要在page页面中进行类型声明,具体写法看下面Translate.page页面规范文件是一个扩展名为page的XML文件,这个文件有许多职责,在众多职责中最基本是指定页面对应的Java类。页面规范文件存放在webapp的WEB_INF目录. 1、 对模板页面申明的两个变量,进行类型申明2、 申明了该页面使用哪个class,这里定义了使用=” examples.Translate”Translate.javapackage examples;import org.apache.tapestry.html.BasePage;import org.apache.tapestry.IRequestCycle;public abstract class Translate extends BasePage /html中:jwcid=TextField value=ognl:inputvalue;page中申明:inputvaluepublic abstract String getInputvalue(); public abstract void setInputvalue(String inputvalue);/html中:jwcid=Insert value=ognl:outvalue;page中申明:outvaluepublic abstract String getOutvalue();public abstract void setOutvalue(String outvalue);/ 监听translate方法public void translate(IRequestCycle cc)String text = getInputvalue(); if(text.equals(0) setOutvalue(零); else if(text.equals(1) setOutvalue(一); else if(text.equals(2) setOutvalue(二); else if(text.equals(3) setOutvalue(三); else if(text.equals(4) setOutvalue(四); else if(text.equals(5) setOutvalue(五); else if(text.equals(6) setOutvalue(六); else if(text.equals(7) setOutvalue(七); else if(text.equals(8) setOutvalue(八); else if(text.equals(9) setOutvalue(九); else if(text.equals(10) setOutvalue(十); else setOutvalue(翻译不出); 1、该类为抽象类,对于模板中申明的变量,这里只要按照规则申明就可以使用,不需要写代码,因为具体实现由Tapestry来实现。对于某个变量,outvalue - Outvalue -getOutvalue();setOutvalue()组件说明1: ”Shell”:2:” Form”;可以理解为一个组件的容器,能容纳textfield,insert,submit等组件。这里没有我们在jsp中常见的name,action等东西,取而代之的是tapestry的标记。其中最关键的是该Form申明了使用“translate”方法,该方法在translate.java文件中定义;为什么是translate.java文件,则是通过page文件的class定义好了。3: ”TextField”:Tapestry提供的文本输入框,并利用ognl可以和某个变量进行帮定,并通过page页面定义其类型,由java文件进行处理。4:”Insert”:在该处插入一个Tapestry组件,其效果就是在该处输入了该组件的显示内容。在此处输出outvalue值的内容。4: “Submit”:Tapestry提供的提交器,一般放在Form组件类使用5:” PageLink”:类似url的地址连接翻译器tapestry会去找文件名为“translate”的页面文件。我这里说的页面文件实际包括两个实际文件:1个html文件和1个page文件,可以通过spindle来生成。实际的效果:http:/localhost/action/app?service=page/translate (action是目录)2、创建简单的login From显示一个登陆界面,密码正确“timeson”“123”则显示登陆正确的提示否则显示错误登陆的消息写法和translate一样,都是使用3个文件。稍微不同的是使用的tapestry组件有所区别1、 login.html文件定义的隐含属性该处实现了密码的输入框调用login.java文件:userlogin方法错误信息在此输出 登陆: 密码: 返回homeForm组件定义的监听类方法必须为public,并且要带一个IRequestCycle的参数,IRequestCycle是一个接口,它是由tapestry提供的一个对于用户而言管理当前会话的工具,2、login.java文件package examples;import org.apache.tapestry.html.BasePage;import org.apache.tapestry.IRequestCycle;public abstract class login extends BasePage public abstract String getLogin_name();public abstract void setLogin_name(String login_name);public abstract String getPassword();public abstract void setPassword(String password);public abstract String getMessage();public abstract void setMessage(String message);public void userlogin(IRequestCycle cc)if(getLogin_name().equals(timeson)&getPassword().equals(123)cc.activate(login); setMessage(正确登陆。); return;setMessage(用户名或密码错误!);3、lognin.page文件 3、列表框中选择第一个页面 第二个页面(简单处理,在console中打印内容)该应用包括2个界面。从列表框中选择一项(可以多选),点击选择,在随后的页面中显示刚才的选择。包括如下文件:Toppings.html Toppings.page Toppings.java 实现了列表框多行选择功能Toppings.html循环组件:用all_toppings得到所有的项目,在java中对应 getAll_toppings()。该属性没有在page文件中申明。注意:source 参数可以接收List 类型或者Object;value的属性需要在page文件中申明,在foreach每次遍历list时,得到的值SelectedToppings 没有在页面中申明,是在java文件中申明用来存储用户选择的项目。/*在Topping.java文件中定义 public void userSelected(IRequestCycle cycle),为了实现让java文件相应该事件,需要在事件加入参数:IrequestCycle */列表框组件,设定multiple为true,支持多行选择选择如下物品: 用ToppingIsSelected来确定用户的选择,(用foreach来遍历),没有在page中申明isToppingIsSelected() 在list框显示内容时需要setToppingIsSelected(boolean ss) 选中时需要 返回Home page./* Foreach是一个循环组件,它遍历source参数,并在表现其内容前更新value参数。将一个属性与一个组件参数绑定,组件不仅读取被绑定的属性,而且更新属性。Foreach 组件使用标签,当其表现(render)时,并不直接生成任何HTML 代码。它仅仅是将其包含的HTML 标签和包含的组件重复表现。这里的source 参数通过OGNL 从Toppings.java 里面的获取getAll_toppings(),就是得到所有的列表。source 参数可以接收List 类型或者Object;value=ognl:topping通过OGNL 表达式,获取topping,而topping 的值就是Foreach 在每次循环遍历得到的值. */Toppings.page Toppings.javapackage examples;import java.util.*;import org.apache.tapestry.IRequestCycle;import org.apache.tapestry.event.PageEvent;import org.apache.tapestry.event.PageRenderListener;import org.apache.tapestry.html.BasePage;public abstract class Toppings extends BasePage implements PageRenderListener private static String TOPPINGS = 莴笋, 西红柿, 干奶酪, 洋葱, 饼干, 泡菜虫, 芥末, 调味蕃茄酱 ; public String getAll_toppings() return TOPPINGS; 实现该接口, public abstract String getTopping(); public abstract void setTopping(String topping); public abstract void setSelectedToppings(Set toppings);public abstract Set getSelectedToppings();/在列表框中显示内容的时候,需要该函数,此时都是false,用户没有选择 public boolean isToppingIsSelected() return getSelectedToppings().contains(getTopping(); /用户对列表框中某(几)项,进行选择的时候,需要该函数, public void setToppingIsSelected(boolean isselect) if (isselect) getSelectedToppings().add(getTopping(); else getSelectedToppings().remove(getTopping(); /由html中申明为Form的组件来负责调用该方法public void userSelected(IRequestCycle cycle) String toppings = getToppingsList(); System.out.println(选择了:+toppings); private String getToppingsList() if (getSelectedToppings().isEmpty() return 什么都没有选择.; StringBuffer buffer = new StringBuffer(); int count = getSelectedToppings().size(); int x = 0; Iterator i = getSelectedToppings().iterator(); while (i.hasNext() if (+x 1) if (x = count) buffer.append( and ); else buffer.append(, ); String topping = (String) i.next(); buffer.append(topping); buffer.append(.); return buffer.toString(); 程序首先执行该方法,进行初始化 public void pageBeginRender(PageEvent event) setSelectedToppings(new HashSet(); 4、时间控件的使用时间控件的使用但在文本框中显示的时间为:“04 一月 2006”可能在显示风格上还要调整一下申明为日期控件该组件必须在 body内,否则抛出异常DatePicker.html 输入时间: 返回 Home page.DatePicker.page DatePicker.javapackage examples;import java.util.*;import org.apache.tapestry.IRequestCycle;import org.apache.tapestry.html.BasePage;public abstract class DatePicker extends BasePage public abstract Date getCurrDate();public abstract void setCurrDate(Date currDate);public void selectDate(IRequestCycle cc)System.out.println(选择的时间为:+getCurrDate();5、登陆(客户端效验)普通登陆Required类型效验Required类型效验申明delegateLogin2.html 错误信息这2个地方的Input_Name命名要一致,并且在page文件中引用到该id;“用_户_名:”在页面上并不显示,由page页面指定显示 输入用户名和密码. 用_户_名: 密_码: “input_Name”为组件id,html中引用到了该id,1:显示提示2:表明使用必选效验3:指定使用的变量声明使用效验,为必填写效验: requiredValidator ,并利用客户端效验功能Login2.page利用客户端效验,在page文件中需要设置很多属性。 /为了方便显示中文, add a description最基础的效验类 申明2个变量,在java文件中会用到 /显示在页面上 /显示在页面上 Login2.javapackage examples; import org.apache.tapestry.html.BasePage;import org.apache.tapestry.IRequestCycle;import org.apache.tapestry.valid.ValidationConstraint;import org.apache.tapestry.valid.IValidationDelegate;public abstract
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 茉莉花茶创新创业项目商业计划书
- 流程改进咨询创新创业项目商业计划书
- 红枣枸杞补血养颜酒行业跨境出海项目商业计划书
- 运动健身APP广告与赞助合作创新创业项目商业计划书
- 资本结构动态调整创新创业项目商业计划书
- 企业社会责任报告撰写示范文本
- 互联网公司产品策划方案
- 幼儿园春天主题儿歌导入与教学设计
- 快消品行业运营风险识别与管理
- 健身房会员管理流程标准
- GA 1524-2018射钉器公共安全要求
- 组织学与胚胎学:6 肌组织
- 企业降本增效培训课件
- 邀请函模板完整
- 分则第二章危害国家安全罪课件
- 汽车分类课件
- 电费分割单模板
- 消防应急预案 消防安全应急预案
- 宏观经济学-高鸿业-最新版
- DB11-T 527-2021配电室安全管理规范
- 元音老人略论明心见性
评论
0/150
提交评论