ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品国产精品亚洲毛片 ,在线一区二区三区四区,国产精品高颜值在线观看http://www.aygfsteel.com/sdkdsyy/zh-cnThu, 19 Jun 2025 01:46:58 GMTThu, 19 Jun 2025 01:46:58 GMT60什么是j2ee【è{ã€?/title><link>http://www.aygfsteel.com/sdkdsyy/archive/2007/03/16/104347.html</link><dc:creator>寿业å‹?/dc:creator><author>寿业å‹?/author><pubDate>Fri, 16 Mar 2007 12:13:00 GMT</pubDate><guid>http://www.aygfsteel.com/sdkdsyy/archive/2007/03/16/104347.html</guid><wfw:comment>http://www.aygfsteel.com/sdkdsyy/comments/104347.html</wfw:comment><comments>http://www.aygfsteel.com/sdkdsyy/archive/2007/03/16/104347.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sdkdsyy/comments/commentRss/104347.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sdkdsyy/services/trackbacks/104347.html</trackback:ping><description><![CDATA[ <font color="#000000" size="2">J2EE: ç”?sh¨´)子商务和信息技术的快速发展以å?qi¨¢ng)对它们的需求给应用½E‹åºå¼€å‘äh员带来了(ji¨£n)新的压力ã€?br />必须以比以前更少的金钱、更ž®‘çš„èµ„æºæ¥æ›´å¿«åœ°è®¾è®¡ã€å¼€å‘ä¼ä¸šåº”ç”¨ç¨‹åºã€‚äØ“(f¨´)äº?ji¨£n)降低成本,òq¶åŠ å¿«ä¼ä¸šåº”ç”¨ç¨‹åºçš„è®¾è®¡å’Œå¼€å‘ï¼Œ J2EE òq›_°æä¾›äº?ji¨£n)一个基于组件的æ–ÒŽ(gu¨©)³•åQŒæ¥è®¾è®¡ã€å¼€å‘、装配及(qi¨¢ng)部çÖv企业应用½E‹åºã€‚J2EE òq›_°æä¾›äº?ji¨£n)多层的分布式的应用模型、组件再用、一致化的安全模型以å?qi¨¢ng)灵‹zȝš„事务控制。æ?zh¨¨n)¨ä¸ä»…可以用比以前更快的速度向市(j¨¬ng)场推出创造性的客户解决æ–ÒŽ(gu¨©)¡ˆåQŒè€Œä¸”æ‚(zh¨¨n)¨çš„òq›_°ç‹¬ç«‹çš„、基于组件的J2EE 解决æ–ÒŽ(gu¨©)¡ˆä¸ä¼š(x¨¬)被束¾~šåœ¨ä»ÖM½•一个厂商的产品和API 上ã€?br />1. J2EE 规范定义äº?ji¨£n)以下种¾cȝš„¾l„äšg<br />â€?应用客户¾l„äšgã€?br />â€?Enterprise JavaBeans ¾l„äšgã€?br />â€?S e r v l e tå?qi¨¢ng)JavaServer PagesåQˆJSP ™åµé¢åQ‰ç»„ä»Óž¼ˆä¹Ÿè¢«¿UîC½œWeb ¾l„äšgåQ‰ã€?br />â€?Appletã€?br />一个多层的分布式的应用模型意味着应用逻辑被根据功能划分成¾l„äšgåQŒåƈ且可以在同一ä¸?br />服务器或不同的服务器上安装组成J2EE 应用的这些不同的¾l„äšg。一个应用组件应被安装在什ä¹?br />地方åQŒå–决于该应用组件属于该多层的J2EE 环境中的哪一层。这些层是客户层、We b层、业åŠ?br />层及(qi¨¢ng)企业信息¾pȝ»Ÿå±‚( EIS åQ‰ç­‰ã€?br />(1) 客户å±?br />J2EE 应用可以是基于Web 的,也可以是不基于Web 的。在一个基于Web çš„J2EE 应用中,用户的浏览器在客户层中运行,òq¶ä»Žä¸€ä¸ªWe b服务器下载Web 层中的静(r¨´n)态HTML ™åµé¢æˆ–ç”±J S P或Servlet 生成的动态HTML ™åµé¢ã€‚在一个不åŸÞZºŽWeb çš„J2EE 应用½E‹åºä¸­ï¼Œä¸€ä¸ªç‹¬ç«‹å®¢æˆïL(f¨¥ng)¨‹åºä¸˜qè¡Œåœ¨ä¸€ä¸ªHTML ™åµé¢ä¸­ï¼Œè€Œæ˜¯˜qè¡Œåœ¨å…¶ä»–一些基于网¾lœçš„¾pȝ»ŸåQˆæ¯”如手持设备或汽èžRç”?sh¨´)话åQ‰ä¸­åQŒApplet ½E‹åºåQŒåœ¨å®¢æˆ·å±‚中˜qè¡ŒåQŒåƈ在不¾lè¿‡Web 层的情况下访问Enterprise Beans。这个不åŸÞZºŽWeb 的客户层可能也包括一个JavaBeans ¾cÀL¥½Ž¡ç†ç”¨æˆ·è¾“å…¥åQŒåƈž®†è¯¥è¾“入发送到在企业层中运行的Enterprise Beans¾cÀL¥˜q›è¡Œå¤„理。根据J2EE 规范åQŒJavaBeans ¾cÖM¸è¢«è§†ä¸ºç»„ä»¶ã€‚äØ“(f¨´)J2EE òq›_°¾~–写的JavaBeans ¾cÀLœ‰å®žä¾‹å˜é‡å’Œç”¨äºŽè®¿é—®å®žä¾‹å˜é‡ä¸­çš„æ•°æ®çš„â€?get å’Œset æ–ÒŽ(gu¨©)³•”。以˜q™ç§æ–¹å¼ä½¿ç”¨çš„JavaBeans ¾cÕdœ¨è®¾è®¡å’Œå®žçŽîC¸Šé€šå¸¸éƒ½æ˜¯½Ž€å•çš„åQŒä½†æ˜¯å®ƒä»¬å¿…™åȝ¬¦åˆJavaBeans 规范中列出的命名和设计约定ã€?br />(2) Web å±?br />        J2EE Web ¾l„äšg可以由JSP ™åµé¢ã€åŸºäºŽWeb çš„A p p l e t以及(qi¨¢ng)昄¡¤ºHTML ™åµé¢çš„S e r v l e t¾l„成。调用S e r v l e t或者JSP ™åµé¢çš„HTML ™åµé¢åœ¨åº”用程序组装时与Web ¾l„äšg打包在一赗÷€‚å°±åƒå®¢æˆ·å±‚ä¸€æ øP¼ŒW(xu¨¦)eb 层可能包括一个JavaBeans ¾cÀL¥½Ž¡ç†ç”¨æˆ·è¾“å…¥åQŒåƈž®†è¾“入发送到在业务层中运行的Enterprise Beans ¾cÀL¥˜q›è¡Œå¤„理。运行在客户层的Web ¾l„äšg依赖容器来支持诸如客戯‚¯·æ±‚和响应å?qi¨¢ng)Enterprise Bean 查询½{‰ã€?br />(3) 业务å±?br />     Â Â Â ä½œäØ“(f¨´)解决或满­‘ÏxŸä¸ªç‰¹å®šä¸šåŠ¡é¢†åŸŸï¼ˆæ¯”å¦‚é“¶è¡Œã€é›¶å”®æˆ–é‡‘èžä¸šï¼‰(j¨ª)需要的逻辑的业务代码由˜qè¡Œåœ¨ä¸šåŠ¡å±‚çš„Enterprise Beans 来执行。一个Enterprise Bean 从客æˆïL(f¨¥ng)¨‹åºå¤„接收数据åQŒå¯¹æ•°æ®˜q›è¡Œå¤„理åQˆå¦‚果需要)(j¨ª)åQŒå†ž®†æ•°æ®å‘送到企业信息¾pȝ»Ÿå±‚存储è“v来。一个Enterprise Beans ˜q˜ä»Žå­˜å‚¨ä¸­æ£€ç´¢æ•°æ®ï¼Œòq¶å°†æ•°æ®é€å›žå®¢æˆ·½E‹åºã€‚运行在业务层的Enterprise Beans ä¾èµ–äºŽå®¹å™¨æ¥ä¸ø™¯¸å¦‚事务、生命期、状态管理、多¾U¿ç¨‹å?qi¨¢ng)资源存储池½{‰æä¾›é€šå¸¸éƒ½éžå¸¸å¤æ‚çš„¾pȝ»Ÿ¾U§ä»£ç ã€‚业务层¾lå¸¸è¢«ç§°ä½œEnterprise JavaBeans åQˆEJB åQ‰å±‚。业务层和W(xu¨¦)eb 层一èµähž„成了(ji¨£n)3 层J 2 E E应用的中间层åQŒè€Œå…¶ä»–两层是客户层和企业信息¾pȝ»Ÿå±‚ã€?br />(4) 企业信息¾pȝ»Ÿå±?br />企业信息¾pȝ»Ÿå±‚运行企业信息系¾lŸèÊYä»Óž¼Œ˜q™å±‚包括企业基础设施¾pȝ»ŸåQŒä¾‹å¦‚企业资源计划(E R PåQ‰ã€å¤§åž‹æœºäº‹åŠ¡å¤„ç†åQ?mainframe transactionprocessing åQ‰ã€æ•°æ®åº“¾pȝ»Ÿå?qi¨¢ng)其他遗留信息系¾lŸï¼ˆlegacy informationsystems åQ‰ã€‚J2EE 应用¾l„äšg因䨓(f¨´)某种原因( 例如讉K—®æ•°æ®åº? 可能需要访问企业信息系¾lŸã€‚J2EE òq›_°çš„æœªæ¥ç‰ˆæœ¬å°†æ”¯æŒConnector æž¶æž„åQŒè¯¥æž¶æž„是将J2EE òq›_°˜qžæŽ¥åˆîC¼ä¸šä¿¡æ¯ç³»¾lŸä¸Šçš„一个标准A P Iã€?br />(5) 查询服务<br />因䨓(f¨´)一个J2EE 应用½E‹åºçš„组件是单独˜qè¡Œçš„,òq¶ä¸”往往在不同的讑֤‡ä¸Šè¿è¡Œï¼Œå› æ­¤åQŒéœ€è¦ä¸€¿Uèƒ½è®©å®¢æˆ·å±‚å’ŒW(xu¨¦)eb å±‚ä»£ç æŸ¥è¯¢åÆˆå¼•ç”¨å…¶ä»–ä»£ç å’Œèµ„æºçš„æ–ÒŽ(gu¨©)³•。客户层和W(xu¨¦)eb 层代码ä‹É用Java 命名和目录接口(JNDI åQ‰æ¥æŸ¥è¯¢ç”¨æˆ·å®šä¹‰çš„对象(例如Enterprise Beans åQ‰ã€çŽ¯å¢ƒæ¡ç›®ï¼ˆä¾‹å¦‚ä¸€ä¸ªæ•°æ®åº“é©±åŠ¨å™¨çš„ä½ç½®åQ‰ã€ä¼ä¸šä¿¡æ¯ç³»¾lŸå±‚中用于查找资源的JDBC DataSource对象åQŒä»¥å?qi¨¢ng)消息连接ã€?br />(6) 安全和事务管ç?br />诸如安全和事务管理这æ ïL(f¨¥ng)š„åº”ç”¨è¡ŒäØ“(f¨´)可以在部¾|²æ—¶åœ¨Web å’ŒEnterprise Beans ¾l„äšg上进行配¾|®ã€‚这个特征将应用逻辑从可能随装配而变化的配置讑֮šä¸­åˆ†å¼€äº?ji¨£n)。J2EE 安全模型允许配置一个Web 或Enterprise Beans ¾l„äšgåQŒä‹É¾pȝ»Ÿèµ„源只能由授权的用户讉K—®ã€‚例如,一个Web ¾l„äšg可以被配¾|®æˆæç¤ºè¾“入用户名和密码。一个Enterprise Beans ¾l„äšg可以被配¾|®æˆåªè®©ç‰¹å®šå›¢ä½“中的成员调用其某些方法。或者,一个Servlet ¾l„äšg可以被配¾|®æˆè®©æŸä¸ªç»„¾l‡ä¸­çš„æ‰€æœ‰äh都能讉K—®å…¶æŸäº›æ–¹æ³•,同时只让该组¾l‡ä¸­çš„æŸäº›äínæœ‰ç‰¹æƒçš„äºø™®¿é—®å…¶ä¸­ä¸€äº›æ–¹æ³•。同æ äh˜¯è¯¥Servlet ¾l„äšgåQŒå¯ä»¥é’ˆå¯¹å¦å¤–一个环境而被配置成让每个人都能访问其所有方法,或者仅让选定的少æ•îCh讉K—®å…¶æ‰€æœ‰æ–¹æ³•ã€?br />        J2EE 事务模型使得能够在部¾|²æ—¶å®šä¹‰æž„成一个单一事务的方法之间的关系åQŒä»¥ä½¿ä¸€ä¸ªäº‹åŠ¡ä¸­çš„æ‰€æœ‰æ–¹æ³•è¢«å¤„ç†æˆä¸€ä¸ªå•ä¸€çš„å•å…ƒã€‚è¿™æ˜¯æˆ‘ä»¬æ‰€å¸Œæœ›çš„ï¼Œå› äØ“(f¨´)一个事务是一¾pÕdˆ—步骤åQŒè¿™äº›æ­¥éª¤è¦ä¹ˆå…¨éƒ¨å®Œæˆï¼Œè¦ä¹ˆå…¨éƒ¨å–消。例如,一个Enterprise Beans 可能有一¾l„方法,使我们可以通过从第一个è̎户借出òq¶å­˜å…¥ç¬¬äºŒä¸ªè´¦æˆ·çš„æ–¹å¼è€Œå°†é’׃»Ž½W¬ä¸€ä¸ªè̎戯‚{¿UÕdˆ°½W¬äºŒä¸ªè̎戗÷€‚我们希望全部的操作被作ä¸ÞZ¸€ä¸ªå•元对待,˜q™æ ·åQŒå¦‚果在借出之后存入之前发生äº?ji¨£n)故障,该借出操作被取消。事务属性是在装配期间定义在一个组件上的。这使得能将来自多个应用¾l„äšg的方法归åˆîC¸€ä¸ªäº‹åС䏭åQŒè¿™è¯´æ˜ŽåQŒæˆ‘们可以轻易变更一个J2EE 应用½E‹åºä¸­çš„应用¾l„äšgåQŒåƈ重新指定事务属性,而不必改变代码或重新¾~–译。在设计应用¾l„äšgæ—Óž¼Œè¦è®°ä½ï¼Œž®½ç®¡Enterprise Beans 有一个可使应用组件的容器自动启动多步事务的机åˆÓž¼Œä½†æ˜¯Applet 和应用的客户容器可能òq¶ä¸æ”¯æŒ˜q™ä¸€ç‚V€‚然而, Applet 和应用客户容器æ€ÀL˜¯èƒ½å¤Ÿè°ƒç”¨æ”¯æŒ˜q™ä¸€ç‚¹çš„一个Enterprise Beans。还应当注意åQ?JSP ™åµé¢å’ŒServlet 没有被设计成是事务的åQŒå®ƒä»¬é€šå¸¸åº”当ž®†äº‹åŠ¡å·¥ä½œäº¤¾l™ä¸€ä¸ªEnterprise Bean 来完成。然而,如果事务工作在一个JSP ™åµé¢æˆ–Servlet 中是必须的,那么此种工作也应当是非常有限的ã€?br />(7) 可重用应用组ä»?br />J2EE ¾l„äšgåQˆApplet 、应用的客户、Enterprise Beans 、JSP ™åµé¢å?qi¨¢ng)Servlet åQ‰éƒ½è¢«æ‰“包成模块åQŒåƈ以Java Archive åQˆJAR åQ‰æ–‡ä»¶çš„形式交付。一个模块由相关的组件、相关的文äšgå?qi¨¢ng)描˜q°å¦‚何配¾|®ç»„件的配置描述文äšg</font> <img src ="http://www.aygfsteel.com/sdkdsyy/aggbug/104347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sdkdsyy/" target="_blank">寿业å‹?/a> 2007-03-16 20:13 <a href="http://www.aygfsteel.com/sdkdsyy/archive/2007/03/16/104347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Tapestry入门åQˆè¯‘作)(j¨ª)http://www.aygfsteel.com/sdkdsyy/archive/2006/10/07/73609.html寿业å‹?/dc:creator>寿业å‹?/author>Sat, 07 Oct 2006 04:18:00 GMThttp://www.aygfsteel.com/sdkdsyy/archive/2006/10/07/73609.htmlhttp://www.aygfsteel.com/sdkdsyy/comments/73609.htmlhttp://www.aygfsteel.com/sdkdsyy/archive/2006/10/07/73609.html#Feedback1http://www.aygfsteel.com/sdkdsyy/comments/commentRss/73609.htmlhttp://www.aygfsteel.com/sdkdsyy/services/trackbacks/73609.html ½Ž€ä»?br />
Jakarta Tapestry是一个开源的Java Web应用框架。你或许ä¼?x¨¬)说åQ?大同ž®å¼‚的东西çÅžäº?"多数

情况下,我同意你的观点,然而,只要èŠ×ƒ¸Šäº›è®¸æ—‰™—´ç ”究一下,你会(x¨¬)发现Tapestry跟别的框架大ä¸ÞZ¸åŒï¼Œå®ƒæ˜¯å€¼å¾—严肃对待的ã€?br />
Tapestry是一个基于控件的框架以致于用它开发Web应用¾cÖM¼¼å¼€å‘ä¼ ¾lŸçš„GUI应用。你用Tapestry开发Web应用时你无需å…Ïx³¨ä»¥æ“ä½œäØ“(f¨´)中心(j¨©)çš?operation-centric) Servlet API.引用Tapestry¾|‘站上的一句话åQ?Tapestry用对è±?objects),æ–ÒŽ(gu¨©)³•åQˆmethodsåQ?属性(propertiesåQ‰æ›¿ä»£ä»¥å¾€çš„URLs和查询参敎ͼŒ 重新诠释Web应用开å?Tapestry 3.0卛_°†å‘布åQŒå®ƒæœ‰å¤§é‡çš„æ”¹è¿›å’Œæ–°çš„特性ã€?br />
Tapestry的目�br />
½Ž€å•æ€?br />
Tapestry应用与传¾lŸçš„Servlet应用相比代码量更ž®‘。大多数传统的Servlet应用包含如下厌烦(ch¨³)å’?br />
重复的ä“Q务:(x¨¬)解析查询参数åQŒå¤„理HttpSession对象åQŒæž„建URLs。Tapestry消除äº?ji¨£n)ä¼ ¾lŸServelt应用中许多无­‘£çš„"衔接"代码("plumbing" code)使开发者把¾_‘ÖŠ›é›†ä¸­åˆ°åº”用逻辑上来ã€?br />
一致�br />
Tapestry为开发Web应用的页面提供了(ji¨£n)一致的方式。这æ ähœ‰åŠ©äºŽæ¶ˆé™¤ä¼ ç»ŸServlet应用开发中臆测。由于所有Tapestry应用中的™åµé¢éƒ½æ˜¯ç”¨ç›¸åŒçš„可复用的控äšg¾l„织而成åQŒæ‰€ä»¥å·¥ä½œæ–¹å¼æ˜¯ç›æ€¼¼çš„ã€?br />
效率

Tapestr应用拥有高度的可升çñ”性,它利用缓存和对象池ä‹É每个è¯äh±‚的处理时间最ž®åŒ–。Tapestry应用拥有跟传¾lŸServletåº”ç”¨ç›æ€»¿çš„æ€§èƒ½ã€?br />
错误反馈

ä»ÖM½•开发过Servlet/JSP应用的äh毫无质疑有类似经历:(x¨¬)ä¸ÞZº†(ji¨£n)扑ևºWeb.xmlæ–‡äšg有什么错误,不得不花费大量时间察看浏览器中的堆栈信息。Tapestry拥有优秀的错误报告方式,最值得一提的是它ä¼?x¨¬)指出哪个文件以及(qi¨¢ng)那一行导致了(ji¨£n)错误ã€?br />
与Struts比较

既然Apache Struts可能是当今应用最òq¿æ³›çš„Web应用框架åQŒæ‹¿Tapestry与它比较是唯一公åã^çš„ã€‚ä»¥ä¸‹æ˜¯ä¸€äº›è§‚å¯Ÿæ¯”è¾ƒï¼Œå®ƒä»¬æ¥æºäºŽäØ“(f¨´)˜q™ç¯‡æ–‡ç« å¼€å‘的几个½Ž€å•çš„Tapestryåº”ç”¨å’ŒäØ“(f¨´)几个Struts工程的工作经历ã€?br />
Struts的优�br />
1 一个Servlet/JSP开发者熟æ‚(zh¨¨n)‰Struts无需太久。然而Tapestry的学ä¹?f¨¤n)曲¾U¿ä¼š(x¨¬)é•¿ä¸€ç‚¹ï¼Œå› äØ“(f¨´)它与‹¹è¡Œçš„Web应用框架不太相同 ã€?br />
2 Struts在Java½C‘ÖŒºé‡Œè¢«òq¿æ³›æŽ¥å—å’Œä‹Éç”¨ã€‚äØ“(f¨´)ä½ çš„™å¹ç›®æ‰¾ä¸€ä¸ªå¥½çš„Struts开发ähå‘˜åÆˆéžéš¾äº‹ï¼ŒTapestry˜q‘来在开发者社区里 赢得一些关注,然而仍有许多Java老手不知道Tapestryä¸ÞZ½•物ã€?br />
3 既然Struts被如此广泛的使用åQŒæ‰€ä»¥æœ‰å¾ˆå¤šStruts资源可供参考。相比大多数开源èÊYä»Óž¼ŒTapestry拥有非常可观的资源和文档åQŒä½†è·ŸStruts相比仍有差距ã€?br />
Tapestry的优�br />
1 你开发一个Tapestry应用无需å…Ïx³¨Servlet API,你也无须ä¸ÞZ½ çš„Servlet应用写一些典型的"衔接"代码。虽然Struts½Ž€åŒ–了(ji¨£n)工作åQŒç„¶è€ŒServlet API 仍是你需面对的ã€?br />
2 Tapestry的页面模杉K™¤äº?ji¨£n)几个特别属性和标识ž®±æ˜¯ä¸€ä¸ªæ ‡å‡†çš„HTMLæ–‡äšgã€?如果你是一个开发小¾l„中的HTML设计高手åQŒç„¶è€Œä½ ä¸æ‡‚Java或JSP,˜q™å°±¾l™ä½ å¸¦æ¥å¾ˆå¤§æ–¹ä¾¿ã€?br />
3 因䨓(f¨´)Tapestry™åµé¢æ˜¯æ ‡å‡†çš„HTML,所以可以用HTML所见即所得(WYSIWYGåQ‰ç¼–辑器¾~–辑和预览该™åüc(di¨£n)€‚å½“ä¸€ä¸ªé¡µéœ€è¦ä¿®æ”¹å®ƒçš„å¤–è§‚åÆˆä¸éœ€è¦é€šçŸ¥æœåŠ¡å™¨è®©å®ƒé‡æ–°ç¼–è¯‘JSP.

4 Tapestry不需要一个至高的åQŒæ•´ä¸ªåº”用范围的配置文äšg。Tapestry应用中的每一™å‰|˜¯ç‹¬ç«‹çš„,改变一™åµä¸ä¼?x¨¬)åª?ji¨£ng)响开发其ä»?™åµé¢çš„å¼€å‘è€…ï¼Œå› äØ“(f¨´)òq¶æ²¡æœ‰ä¸€ä¸ªé…¾|®æ–‡ä»¶æŠŠæ‰€æœ‰é¡µé¢çš„‹¹è§ˆ¾_˜è¿žåœ¨ä¸€èµ—÷€?br />
5 Tapestry拥有极好的错误报告。如果你在一个页的模板或™åµé¢è§„范犯了(ji¨£n)一个错误,Tapestryä¼?x¨¬)指出导致错误的行号ã€?br />
6 用Tapestry开发是¿Uä¹­‘£ã€‚这栯‚¯´å¬ä¸ŠåŽÖM¼¼ä¹Žè€è°ƒåQŒç„¶è€Œç”¨Tapestry开发一个Web应用相比应用其他‹¹è¡Œçš„æ¡†æž¶æ›´ä¸ø™‡ªç„¶æœ‰­‘£ã€‚用Tapestry开发是应用äº?ji¨£n)一¿UåŸºäºŽæŽ§ä»¶çš„æž¶æž„åQŒä¸Žå¼€å‘ä¼ ¾lŸçš„GUIåº”ç”¨éžå¸¸ç›æ€¼¼ã€?br />
Tapestry æž¶æž„

Tapestry框架是标准Servlet API的一¿Uæ‰©å±•。它需要J2SDK1.2或更高版本的J2SDK和一个与Servlet API 2.2(或更é«?兼容的应用服务器/Servlet容器ã€?br />
一个Tapestry应用ç”Þp®¸å¤šæ‹¥æœ‰å”¯ä¸€åç§°çš„页面组成。一个页面由一个模板和一些可复用的控件构成。模板由标准的HTML标签和一些额外的属性和标签构成åQŒè¿™äº›é¢å¤–çš„å±žæ€§å’Œæ ‡ç­¾æ˜¯äØ“(f¨´)äº?ji¨£n)告诉Tapestry框架˜q™ä¸ª™åµé¢çš„那些部分是由Tapestry控äšg¾l„成ã€?br />
½Ž€å•çš„Tapestry应用

ä¸ÞZº†(ji¨£n)最好的描述构徏一个Tapestry™åµé¢çš„æ–¹æ–šw¢é¢ï¼Œæˆ‘们可以看看˜q™ä¸ªPig Latin¾˜»è¯‘器应用的代码。这个应用只有一个页面,在这™åµé‡Œè¾“入一个text值把它翻译成Pig Latin,然后把翻译好的值显½Cºç»™ç”¨æˆ·ã€?br />
在Tapestry应用中每个页ç”?个部分组成:(x¨¬)一个HTML模板åQŒä¸€ä¸ªé¡µé¢è§„范文ä»Óž¼Œä¸€ä¸ªJava¾c…R€?

˜q™é‡Œæœ‰è¿™ä¸ªé¡µé¢å±òq•抓图:(x¨¬)

/Develop/ArticleImages/27/27850/CSDN_Dev_Image_2004-5-15226281.jpg


™åµé¢æ¨¡æ¿ç”±æ ‡å‡†çš„HTML标签和一些额外的属性和标签构成åQŒè¿™äº›é¢å¤–çš„å±žæ€§å’Œæ ‡ç­¾æ˜¯äØ“(f¨´)äº?ji¨£n)告诉Tapestry框架˜q™ä¸ª™åµé¢çš„那些部分是由Tapestry控äšg¾l„成。页面模板存攑֜¨Web应用的根context目录下。通常åQŒTapestry在启动时ä¼?x¨¬)寻扑֒Œå‘ˆçŽ°ä¸€ä¸ªåå?Home"的页。虽然我们可以改变这¿Uè¡Œä¸ºï¼Œä½†ä¾ç…§Tapestry的惯例会(x¨¬)更简单ã€?br />
Home.html
    <html>
    <head>
      <title>Tapestry Pig Latin Translator</title>
    </head>
    <body>
      <h1>Pig Latin Translator</h1>
      <form jwcid="@Form"�listener="ognl:listeners.submit"�gt;
      <table border="1">
        <tr>
          <td>Value to Translate:</td>
          <td>
            <input type="text" jwcid="@TextField"�value="ognl:inputValue"/>
          </td>
        </tr>
        <tr>
          <td>Pig Latin:</td>
          <td>
            <jwcid="@Insert"�value="ognl:pigLatinValue"/>
          </td>
        </tr>
      </table>
      <input type="submit" jwcid="@Submit"�value="Translate"/>
      </form>
    </body>
    </html>
   

™åµé¢æ¨¡æ¿çš„绝大部分是普通的HTML,只有ž®‘部分Tapestryç‰ÒŽ(gu¨©)œ‰çš„属性和标签。这¿Uæ¨¡æ¿æœºåˆ¶çš„优势ž®±æ˜¯Tapestry™åµé¢æ¨¡æ¿å¯ä»¥åœ¨ä¸€ä¸ªå¯è§å³æ‰€å¾—çš„¾~–辑器里创徏和预览。描˜q°Tapestry控äšg部分的标识是有限的和½Hå‡ºçš„ã€?br />
标识里的jwcid所指是被应用的Tapestry控äšgçš„Java Web Component ID.在上面代码断里,我们是隐式地使用控äšg。隐式的控äšg是指直接在页面模杉K‡Œå£°æ˜Žä½¿ç”¨çš„æŽ§ä»Óž¼Œã€‚jwcid的前¾~€ '@ '½W¦å·ž®±æ˜¯é€šçŸ¥Tapestry˜q™é‡Œå£°æ˜Žä½¿ç”¨äº?ji¨£n)一个隐式控件ã€?br />
在上面的Pig Latin Translator™åµé¢æ¨¡æ¿é‡Œç”¨äº?ji¨£n)四个控ä»Óž¼?x¨¬)Formâ‘? TextFieldâ‘? Insertâ‘?å’ŒSubmit⑤。它们只是Tapestry框架提供的包含超˜q?0个控件的控äšg库里的四个。在后面的范例中åQŒæˆ‘们将ä¼?x¨¬)看到如何ä‹É用显式控件。显式控件是指控件在™åµé¢è§„范文äšg里声明后再ä‹É用的控äšgã€?br />
在前面的HTML模板里,使用控äšg的同æ—Óž¼Œä¹ŸäØ“(f¨´)控äšg指定äº?ji¨£n)参数。例如控件Form①有一个listener②参数它指定äº?ji¨£n)当表单提交时对应的™åµé¢¾c»è°ƒç”¨çš„æ–ÒŽ(gu¨©)³•名称。那个ognl:前缀的ä‹É用诏½I‰K¡µé¢çš„HTML模板åQŒæŒ‡å‘çš„æ˜?a >Object Graph Navigation Language (OGNL)。OGNL是一个强大的开源的表达式语­a€åQŒç”¨äºŽå°†™åµé¢å†…控件的属性绑定到™åµé¢¾cȝš„属性ã€?br />
现在我们看看™åµé¢è§„范文äšg。页面规范文件是一个扩展名为pageçš„XMLæ–‡äšgåQŒè¿™ä¸ªæ–‡ä»¶æœ‰è®¸å¤šèŒè´£åQŒåœ¨ä¼—多职责中最基本是指定页面对应的Java¾c…R€‚页面规范文件存攑֜¨webappçš„WEB_INF目录ã€?br />
Home.page
    <?xml version="1.0"?>
    <!DOCTYPE page-specification PUBLIC
        "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
        "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd>
    <page-specification class="Home">
        <property-specification name="inputValue" type="java.lang.String"/>
        <property-specification name="pigLatinValue" type="java.lang.String"/>
    </page-specification>

   
™åµé¢è§„范文äšg的根元素有一个class的属性,它指定了(ji¨£n)˜q™ä¸ª™åµå¯¹åº”çš„Java¾c…R€‚这个类必须要实现org.apache.tapestry.Ipage接口。页面规范同旉™¡µå®šä¹‰äº?ji¨£n)两个属æ€?property)元素åQŒä»¥ä¾¿Tapestry在页面类里创建新的属性ã€?br />
Tapestry框架提供äº?ji¨£n)org.apache.tapestry.html.BasePage class,它实çŽîCº†(ji¨£n)Ipage接口。页面类被存攑֜¨Web-INF/classes目录下,跟你的Web应用的所需要的其他¾cÀL”¾åœ¨ä¸€èµ—÷€?br />
Home.java
    import org.apache.tapestry.html.BasePage;
    import org.apache.tapestry.IRequestCycle;

    public abstract class Home extends BasePage {
        public abstract String getInputValue();
        public abstract void setInputValue(String inputValue);

        public abstract String getPigLatinValue();
        public abstract void setPigLatinValue(String pigLatinValue);

        public void submit(IRequestCycle cycle) {
            String inputValue = getInputValue();
            String pigLatinValue = new PigLatinTranslator().translate(inputValue);
            setPigLatinValue(pigLatinValue);
        }
    }
   

你要提醒的第一件事或许是这个类ä¸ÞZ»€ä¹ˆæ˜¯æŠ½è±¡¾c…R€‚它˜q˜æœ‰å‡ ä¸ªæŠ½è±¡æ–ÒŽ(gu¨©)³•讉K—®inputValueåQŒpigLatinValue属性。这里利用了(ji¨£n)Tapestryä¼?x¨¬)在˜qè¡Œæ—¶åˆ»åˆ›å¾å­ç±»çš„功能,˜q™ä¸ªå­ç±»ä¼?x¨¬)创å»ÞZ½ åœ¨é¡µé¢è§„范里声明的属性和生成相应的访问方法ã€?br />
在表单提交时™åµé¢¾cȝš„submitæ–ÒŽ(gu¨©)³•ä¼?x¨¬)è¢«è°ƒç”¨ã€‚äØ“(f¨´)什么会(x¨¬)˜q™æ ·åQŸå› ä¸ºæˆ‘们在™åµé¢æ¨¡æ¿é‡Œå°†Form控äšgçš„listenerå±žæ€§æŒ‡å®šäØ“(f¨´)åQšognl:listeners.submit。这ž®±æ„å‘³ç€ä¸€ä¸ªåå«submitçš„listenerä¼?x¨¬)通过™åµé¢¾cȝš„listeners被访问ã€?br />
所有的™åµé¢¾cÕd’ŒæŽ§äšg¾c»éƒ½ä»Žorg.apache.tapestry.AbstractComponent˜q™ä¸ª¾cȝ‘ô承来一个叫listeners的属性。当submitæ–ÒŽ(gu¨©)³•完成后,™åµé¢ä¼?x¨¬)显½Cø™¢«¾˜»è¯‘好的词ã€?br />
最后讲讲Web.xml˜q™ä¸ªWeb发布描述文äšg。Tapestry,像许多其他的‹¹è¡Œçš„Webåº”ç”¨æ¡†æž¶ä¸€æ øP¼Œç”׃¸€ä¸ªServlet构成åQŒä½†æ˜¯è¿˜éœ€è¦ä¸€ä¸ªå‘布描˜q°æ–‡ä»¶ã€‚那个发布描˜q°æ–‡ä»¶åº”该被存放在WEB-INF目录ã€?br />
web.xml
    <?xml version="1.0"?>
    <!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd>
    <web-app>
        <display-name>Tapestry Pig Latin Translator</display-name>

        <servlet>
            <servlet-name>tapestry</servlet-name>
            <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>

        <servlet-mapping>
            <servlet-name>tapestry</servlet-name>
            <url-pattern>/app</url-pattern>
        </servlet-mapping>
    </web-app>
   

虽然Pig Latin¾˜»è¯‘应用非常½Ž€å•,但是它会(x¨¬)让你对在Tapestry应用中一个页面的3个组成部分有äº?ji¨£n)基本的了(ji¨£n)解。它也展½CÞZº†(ji¨£n)创徏一个Tapestry应用的一个页面只需写多么少的代码ã€?br />
表单输入验证

Tapestry 提供äº?ji¨£n)一些控件以便校验用æˆïL(f¨¥ng)š„输入。校验子¾pȝ»Ÿæ˜¯ValidField控äšg的核å¿?j¨©)。在下面的登录应用中我们ž®†ä‹É用ValidField控äšg。ValidField控äšg位于表单内,对用户在客户端的校验提供äº?ji¨£n)有用的反馈和视觉上的错误提½Cºã€?br />
区域�br />
在Tapestry中,区域化是相当½Ž€å•的。Tapestryå…è®¸æ–‡å­—å’Œå›¾å½¢çš„åŒºåŸŸåŒ–ã€‚äØ“(f¨´)äº?ji¨£n)区域化™åµé¢çš„内容,你可以äØ?f¨´)每一个添加一个propertiesæ–‡äšgåQŒæˆ–者提供一个区域化的模æÑ€‚䨓(f¨´)每个™åµé¢æä¾›ä¸€ä¸ªèµ„源文件的方式˜qœæ¯”½Ž¡ç†å’Œç»´æŠ¤ä¸€ä¸ªå·¨å¤§çš„全局的应用范围的资源文äšg½Ž€å•ã€‚å¦‚æžœé¡µé¢çš„åŒºåŸŸåŒ–åÆˆä¸ä»…ä»…åªæ˜¯æ–‡å­—ä¿¡æ¯çš„åŒºåŸŸåŒ–ï¼Œä¾‹å¦‚™åµé¢çš„布局不同或者组成的控äšg不同åQŒè¿™æ ähƒ…冉|ä¾›åŒºåŸŸåŒ–的页面模板就能派上用åœÞZº†(ji¨£n)。我们会(x¨¬)在下面的ç™Õd½•应用的ä‹É用Tapestry区域化ã€?br />
创徏控äšg

Tapestry发布时提供了(ji¨£n)40多个自带的控件。如果你想知道更多的关于Tapestry自带控äšg的信息,请参è€?a >Tapestry Component Reference.想看看Tapestry的控件的应用范例可访é—?a >Tapestry Component Workbench.如果你发çŽîC½ éœ€è¦ä¸€ä¸ªTapestry本èín没提供的控äšgåQŒä½ å¯ä»¥è‡ªå·±åˆ›å¾ä¸€ä¸ªã€‚创å»ÞZ½ è‡ªå·±çš„Tapestry控äšg跟创å»ÞZ¸€ä¸ªé¡µé¢æ˜¯ç›æ€¼¼çš„。一个典型的Tapestry控äšgç”׃¸€ä¸ªæŽ§ä»¶è§„范文ä»Óž¼ˆXML文档åQ‰ï¼Œä¸€ä¸ªHTML控äšg模板åQŒä¸€ä¸ªå®žçŽîCº†(ji¨£n)org.apache.tapestry.Icomponent接口的Java¾c…R€‚这个议题有点超出本文的范围åQŒä½†æ˜¯å¦‚果你有兴­‘£å­¦ä¹?f¨¤n)如何创å»ÞZ½ è‡ªå·±çš„Tapestry控äšgåQŒä½ å¯ä»¥å‚考Tapestry的原创ähåQ?a >Tapestry In Action 一书的作è€?-Howard Lewis Ship写的 Designing Tapestry Mega-Components ã€?br />
Tapestry ç™Õd½•应用

你在Pig latin¾˜»è¯‘器应用中看到äº?ji¨£n)Tapestry的一些基本特性。与其用一个复杂的应用展示Tapestry所有的ç‰ÒŽ(gu¨©)€§ä»¥è‡´äºŽåŽ‹å¾—ä½ æ£ä¸è¿‡æ°”æ¥åQŒè¿˜ä¸å¦‚通过一些简单的应用让你扑ֈ°ä¸€ç‚¹å¯¹Tapestry的感觉。下面这个应用展½CºTapestry如何处理™åµé¢å¯ÆDˆªåQŒåŒºåŸŸåŒ–åQŒéªŒè¯å’Œå…¶ä»–一些特性ã€?/p>

˜q™é‡Œæœ‰ä¸€ä¸ªHome™å늚„屏幕抓图åQŒä¸‹é¢è·Ÿç€å®ƒçš„™åµé¢æ¨¡æ¿ã€?br />
/Develop/ArticleImages/27/27850/CSDN_Dev_Image_2004-5-15226283.jpg

Home.html
    <html>
    <head>
        <title>Welcome to the Tapestry Login Application</title>
    </head>

    <body>
        <h1>Welcome to the Tapestry Login Application</h1>
        <span jwcid="@PageLink"�page="Login">Login</span>
    </body>
    </html>
   
˜q™ä¸ªHome™å늚„™åµé¢æ¨¡æ¿é™¤äº†(ji¨£n)一个jwcid属性定义ä‹É用一个Tapestry PageLink①控件以外都是标准的HTMLã€?br />
PageLink控äšg生成äº?ji¨£n)一个指向Login™å늚„­‘…链接。既然Home™å‰|²¡æœ‰ä“Qä½•åŠ¨æ€çš„è¡ŒäØ“(f¨´)所以它不需要页面规范和™åµé¢å¯¹åº”çš„Java¾c…R€?br />
˜q™é‡Œæ˜¯Login™å늚„屏幕抓图åQŒåŽé¢è·Ÿç€æ˜¯å®ƒçš„页面模æÑ€?br />
/Develop/ArticleImages/27/27850/CSDN_Dev_Image_2004-5-15226285.jpg

Login.html
    <html>
    <head>
        <title>
            <span key="title">①Login</span>
        </title>
    </head>

    <body jwcid="@Body">�br />        <span jwcid="@Conditional" condition="ognl:beans.delegate.hasErrors">�br />            <div style="color: red">
                <span jwcid="@Delegator" delegate="ognl:beans.delegate.firstError">�br />                    Error Message
                </span>
            </div>
        </span>
        <p style="font-weight: bold" >
            <span key="hint">Hint: Your password is your username spelled backwards.</span>
        </p>
       
        <form jwcid="@Form" listener="ognl:listeners.login" delegate="ognl:beans.delegate">

�br />            <table>
                <tr>
                    <td align="right">
                        <span jwcid="@FieldLabel" field="ognl:components.inputUsername"�gt;
                            Username:
                        </span>
                    </td>
                    <td>
                        <input type="text" jwcid="inputUsername"�value="simpson_h"

size="30"/>
                    </td>
                </tr>

                <tr>
                    <td align="right">
                        <span jwcid="@FieldLabel" field="ognl:components.inputPassword">
                            Password:
                        </span>
                    </td>
                    <td>
                        <input type="text" jwcid="inputPassword" hidden="true" value=""

size="30"/>
                    </td>
                </tr>

                <tr>
                    <td colspan="2" align="center">
                        <input type="submit" jwcid="@Submit" value="message:login"/>
                    </td>
                </tr>
            </table>
        </form>
    </body>
    </html>
   

˜q™ä¸ª™åµé¢æ¨¡æ¿å¤§å¤šæ•°æ˜¯é€šå¸¸çš„HTML。我们从™åµé¢æ¨¡æ¿ä¸­å¯ä»¥çœ‹åˆ°Tapestry的区域化ç‰ÒŽ(gu¨©)€§ï¼š(x¨¬)它ä‹É用一个span元素åQŒè¿™ä¸ªspan元素带有一个叫key的属性,key的值映ž®„到Login.propertiesæ–‡äšg里一个属性。一个Body控äšg被声明ä‹Éç”¨ï¼Œå› äØ“(f¨´)它对客户端的JavaScript校验是必需的ã€?br />
为Form component⑤设定delegate属性激‹z»è¡¨å•输入验证。delegate属性是我们在页面规范里声明的org.apache.tapestry.valid.IvalidationDelegate的实现类。如果验证错误发生了(ji¨£n)åQŒæˆ‘们用Conditional component③控件判断delegate是否有ä“Q何错误,如果有就把第一个错误④昄¡¤º¾l™ç”¨æˆ—÷€‚如果ognl 表达式ognl:beans.delegate.hasErrors 为true,Conditional控äšgž®†æ˜¾½Cºå®ƒçš„内容实体。所有的™åµé¢¾cÕd’ŒæŽ§äšg¾c»éƒ½ä»ŽAbstractComponent¾l§æ‰¿æ¥ä¸€ä¸ªå«beans的属性。这个beans属性是一个org.apache.tapestry.IbeanProvider的实例,利用它可以通过名字取得在页面规范文仉™‡Œå®šä¹‰çš„beans.FieldLabel⑥被用于为inputuserName validField控äšg昄¡¤ºæ ‡ç­¾åQŒè¿™ä¸ªFieldLabel控äšg也被用来与表单的验证代理协作åQŒæŒ‡å‡ºåŒ…含错误的输入域ã€?br />InputUserName⑦控件是一个显½CºæŽ§ä»¶çš„例子。显式控件是指在™åµé¢è§„范文äšg声明的控件。InputUsernameå’ŒinputPassword控äšg都是昑ּçš„,它们与FieldLabel联合昄¡¤ºå®ƒä»¬çš„displayName属性ã€?br />
下面的是Login™å늚„资源文äšg。Login.properties跟页面规范一òq¶å­˜æ”‘Öœ¨WEB-INF目录ã€?br />
Login.properties
    title = Login to the Application
    hint = Hint: Your password is your username spelled backwards.
    login = Login
    username = Username:
    password = Password:
    invalidpassword = Invalid Password
   
Here is the page specification for the Login page.
Login.page
    <?xml version="1.0"?>
    <!DOCTYPE page-specification PUBLIC
        "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
        "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd>

    <page-specification class="com.ociweb.tapestry.Login">
        <bean name="delegate" class="org.apache.tapestry.valid.ValidationDelegate"/>�br />
        <bean name="requiredValidator"�br />            class="org.apache.tapestry.valid.StringValidator">
            <set-property name="required" expression="true"/>
            <set-property name="clientScriptingEnabled" expression="true"/>
        </bean>

        <property-specification name="username" type="java.lang.String"/>
        <property-specification name="password" type="java.lang.String"/>

        <component id="inputUsername" type="ValidField"> �br />            <message-binding name="displayName" key="username"/> �br />            <binding name="validator" expression="beans.requiredValidator"/> �br />            <binding name="value" expression="username"/> �br />        </component>

        <component id="inputPassword" type="ValidField"> �br />            <message-binding name="displayName" key="password"/>
            <binding name="validator" expression="beans.requiredValidator"/>
            <binding name="value" expression="password"/>
        </component>

    </page-specification>
   

Page-specification元素的class属性和两个property-specification元素与Pig Latin¾˜»è¯‘å™¨åº”ç”¨æ˜¯ç›æ€¼¼çš„ã€?br />
你会(x¨¬)发现½W¬ä¸€ä¸ªæ–°ä¸œè¥¿-bean元素①,bean元素把一个org.apache.tapestry.valid.ValidationDelegate

的实例指定了(ji¨£n)名称"delegate"。页面HTML模板里的Form控äšg把它的参数delegate讑֮šä¸?br />ognl:beans.delegate,ž®±æ˜¯æŒ‡å‘äº?ji¨£n)这个org.apache.tapestry.valid.ValidationDelegate实例ã€?br />Bean元素②把一个org.apache.tapestry.valid.StringValidator的实例指定了(ji¨£n)名称"
requiredValidator",以用于验证。这个beançš„requiredå±žæ€§è¢«è®¾äØ“(f¨´)true表明使用˜q™ä¸ªbean的域是必™å»è¢«éªŒè¯çš„。这个beançš„clientScriptingEnabled属性被讑֮šä¸ºture,表明使用˜q™ä¸ªbean的域客户端的JavaScript验证功能是激‹zȝš„。RequiredValidator bean被用于验证inputUsernameå’ŒinputPassword的内宏V€?br />
控äšginputUsername③被控äšg规范声明为ValidFieldåQŒValidField是一¿Uç”¨äºŽTapestry验证子系¾lŸçš„ç‰ÒŽ(gu¨©)®Šç‰ˆæœ¬çš„TextField控äšg。Message-binding元素被用于指定inputUsername控äšgçš„displayName参数的å€û|¼Œ˜q™ä¸ªå€¼æ˜¯ç”?username"为关键字从login.properties④文仉™‡Œå¾—到。InputUsername控äšgçš„validatorå‚æ•°è¢«è®¾å®šäØ“(f¨´)requiredValidator bean,˜q™æ˜¯æˆ‘们在页面规范里声明˜q‡çš„⑤。控件的value参数跟页面Java¾cȝš„username属性绑定在一起⑥。控件inputPassword的控件规范跟控äšginputUsernameå‡ ä¹Žç›æ€¼¼åQŒé™¤äº?ji¨£n)用于取得displayName的关键字和绑定的™åµé¢Java¾cȝš„属性不同ã€?br />
通过使用ValidField控äšgå’ŒäØ“(f¨´)表单(form)提供一个ValidationDelegate, 我们‹È€‹zÖMº†(ji¨£n)Login表单的验证功能。除äº?ji¨£n)服务器端的验证åQŒTapestry也提供了(ji¨£n)客户端的验证åQˆåˆ©ç”¨JavaScriptåQ‰ã€‚ä¸‹é¢å°±æ˜¯å½“ç”¨æˆ·æäº¤ä¸€ä¸ªè¡¨å•è€Œæ²¡æœ‰äØ“(f¨´)UserName域提供值时åQŒä¸€ä¸ªJavaScript错误对话框弹出时的屏òq•抓图ã€?br />
/Develop/ArticleImages/27/27850/CSDN_Dev_Image_2004-5-15226287.jpg

下面ž®±æ˜¯å½“用æˆähäº¤ä¸€ä¸ªè¡¨å•è€Œæ²¡æœ‰äØ“(f¨´)Password域提供值时åQŒä¸€ä¸ªJavaScript错误对话框弹出时的屏òq•抓图ã€?br />

/Develop/ArticleImages/27/27850/CSDN_Dev_Image_2004-5-15226289.jpg


下面ž®±æ˜¯Login™åµå¯¹åº”çš„Java ¾c…R€?br />
Login.java
    package com.ociweb.tapestry;

    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 class Login extends BasePage {
        public abstract String getUsername();
        public abstract void setUsername(String username);

        public abstract String getPassword();
        public abstract void setPassword(String password);

        public void login(IRequestCycle cycle) {
            String username = getUsername();
            String password = getPassword();
            StringBuffer sb = new StringBuffer(username);
            String validPassword = sb.reverse().toString();
            if (password.equals(validPassword)) {
                cycle.activate("Success");�br />            } else {
                String errorMessage = getMessage("invalidpassword");�br />                IValidationDelegate validationDelegate =
                        (IValidationDelegate) getBeans().getBean("delegate");�br />                validationDelegate.record(errorMessage,
                                          ValidationConstraint.CONSISTENCY);�br />            }
        }
    }
   
è·ŸPig Latin¾˜»è¯‘å™¨åº”ç”¨ä¸€æ øP¼Œæˆ‘们的页面类也是抽象的,它有抽象æ–ÒŽ(gu¨©)³•讉K—®åœ¨é¡µé¢è§„范里定义的属æ€?properties)。Tapestryä¼?x¨¬)在˜qè¡Œæ—¶åˆ»åˆ›å¾usernameå’Œpassword属性。Loginæ–ÒŽ(gu¨©)³•只是½Ž€å•的验证一下用戯‚¾“入的密码值是否刚好是用户名的反向。如果密码通过验证åQŒç”¨æˆ·å°†è¢«å¼•领导Success pageâ‘ ã€?br />
如果密码输入有误åQŒæˆ‘们用关键å­?invalidPassword"通过从org.apache.tapestry.AbstractComponent里ç‘ô承来的getMessage()æ–ÒŽ(gu¨©)³•从Login.properties②里查找对应的资源。我们需要把密码错误信息¾Uªå½•到我们在™åµé¢è§„范中定义的™åµé¢validation delegate中去。我们可以利用我们在™åµé¢è§„范中指定的名称åQŒä»Ž™åµé¢çš„beans属性中扑֛žvalidationDelegate③。最后,我们调用org.apache.tapestry.valid.IvalidationDelegateçš„recordæ–ÒŽ(gu¨©)³•把将要显½Cºç»™ç”¨æˆ·çœ‹çš„错误信息保存èµäh¥ã€‚下面就是当用户输入错误密码的提交后的屏òq•抓图ã€?br />
/Develop/ArticleImages/27/27850/CSDN_Dev_Image_2004-5-152262811.jpg

下面ž®±æ˜¯Success™å늚„™åµé¢æ¨¡æ¿ã€‚Success™å늚„™åµé¢æ¨¡æ¿ä»…仅包含HTML标识åQŒæ‰€ä»¥å®ƒä¸éœ€è¦é¡µé¢è§„范和™åµé¢

Java¾c…R€?br />
Success.html
    <html>
    <head>
        <title>Successful Login</title>
    </head>
    <body>
        <p>
            Congratulations! You have successfully logged on.
        </p>
    </body>
    </html>
   
æ€È»“

我希望这½‹‡æ–‡ç« å·²¾lå‘你展½CÞZº†(ji¨£n)Tapestry框架在构建Web应用的是多么½Ž€å•,然而优雅。Tapestry与大多数ä¸ÀLµWebåº”ç”¨æ¡†æž¶æœ€å¤§ä¸åŒåœ¨äºŽå®ƒè®©ä½ ç”¨åŸºäºŽæŽ§ä»¶çš„æ–¹å¼å¼€å‘ï¼Œè€Œéžä»¥æ“ä½œäØ“(f¨´)中心(j¨©)的方式开发。如果这½‹‡æ–‡ç« æ¿€èµ·äº†(ji¨£n)你的兴趣åQŒæˆ‘廸™®®ä½ æŠŠå®ƒä¸‹è½½ä¸‹æ¥åˆ©ç”¨å®ƒä½ è‡ªå·Þqš„½Ž€å•çš„Web应用。通过感受½Ž€å•的应用åQŒè¿™æ˜¯ä½ äº?ji¨£n)è§£˜q™ä¸ªæ¡†æž¶çš„优点的唯一途径。如果你惛_œ¨ä½ çš„下一个项目里使用Tapestry,我强烈徏议你购买
Tapestry In Action ˜q™æœ¬ä¹¦ã€‚我拥有˜q™æœ¬ä¹¦ï¼Œå¯¹å®ƒæˆ‘感到很满意ã€?br />
References
1 Zip file with all source code and war files from the article. (12K)

                 http://www.ociweb.com/jnb/jnb2004_05.zip
2 Tapestry Home Page http://jakarta.apache.org/tapestry/
3 Tapestry In Action Page http://www.manning.com/lewisship/
4 Tapestry Wiki http://jakarta.apache.org/tapestry/wiki_frame.html
5 OGNL page http://www.ognl.org/
6 Tapestry Component Reference

                 http://jakarta.apache.org/tapestry/doc/ComponentReference/index.html
7 Tapestry Component Workbench http://www.t-deli.com/app
8 Designing Tapestry Mega-Components

                 http://www.onjava.com/pub/a/onjava/2001/11/21/tapestry.html


注:(x¨¬)原文地址åQ?a >http://www.inspiresky.com/Article/java/2006-02-14/412.html



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÇìÔÆÏØ| ÂÀÁºÊÐ| ½­°²ÏØ| ¾¸ÓîÏØ| Æ½Ë³ÏØ| ¾°ºéÊÐ| ¸§ÄþÏØ| Çå·áÏØ| Ð˺£ÏØ| ÇɼÒÏØ| ¿â³µÏØ| ´óÌïÏØ| ¹ÅÀËÏØ| ÔÀÆÕºþÏØ| ³çÎÄÇø| µÂ°²ÏØ| ·½É½ÏØ| ˾·¨| ³É¶¼ÊÐ| ³çÐÅÏØ| Â¹ÒØÏØ| Í©è÷ÏØ| ×ñÒåÏØ| ³üÖÝÊÐ| ɽÑôÏØ| Â«É½ÏØ| ÏÉÓÎÏØ| ÓñÆÁ| ÐËÒµÏØ| Õò½­ÊÐ| Èʲ¼ÏØ| ÄϾ©ÊÐ| ÕòÄþ| ÏÃÃÅÊÐ| ÍòÔ´ÊÐ| Î÷ÎÚ| ³¤Ì©ÏØ| ÎäÄþÏØ| Áø½­ÏØ| ÄþÇ¿ÏØ| ¼ÎÒåÏØ|