ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久成人黄色影片,久九九久频精品短视频,国产ts一区二区http://www.aygfsteel.com/svg_007/zh-cnSun, 27 Jul 2025 21:03:22 GMTSun, 27 Jul 2025 21:03:22 GMT60web应用åQˆè{自Sun½C‘ÖŒºåQ?/title><link>http://www.aygfsteel.com/svg_007/archive/2005/11/09/19022.html</link><dc:creator>svg_007</dc:creator><author>svg_007</author><pubDate>Wed, 09 Nov 2005 10:01:00 GMT</pubDate><guid>http://www.aygfsteel.com/svg_007/archive/2005/11/09/19022.html</guid><wfw:comment>http://www.aygfsteel.com/svg_007/comments/19022.html</wfw:comment><comments>http://www.aygfsteel.com/svg_007/archive/2005/11/09/19022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/svg_007/comments/commentRss/19022.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/svg_007/services/trackbacks/19022.html</trackback:ping><description><![CDATA[Web应用是Web服务的一¿UåŠ¨æ€æ‰©å±•ã€‚Web应用可分ä¸ÞZ¸¤¾c»ï¼š <div align="left"> <ul type="disc"><li style="color: black; text-align: left;"><a name="wp77266"></a> 面向表示的Web应用。在响应è¯äh±‚æ—Óž¼Œé¢å‘表示的Web应用产生动态的Web™åµé¢åQŒè¿™¿Ué¡µé¢åŒ…含了各种不同的标记语­a€(如HTML, XML, ½{‰ç­‰)ã€?/li><li style="color: black; text-align: left;"><a name="wp77267"></a>面向服务的Web应用。面向服务的Web应用实现¾l†ç²’度Web服务的端炏V€‚面向服务Web应用通常为面向表½Cºåº”用所调用ã€?/li></ul> </div> <p class="pbody" align="left"><a name="wp77268"></a>在Java2òq›_°ä¸Šï¼Œ<i>Web</i><i>¾l„äšg</i>为Web 服务器提供了动态扩展能力。Web¾l„äšg可以是Java Servlets或者JSP™åµé¢ã€‚Servlets是Java¾~–程语言中用于动态地处理è¯äh±‚和徏立响应的一¿Uç±»ã€‚JSP™åµé¢æ˜¯åŸºäºŽæ–‡æœ¬çš„æ–‡æ¡£åQŒå®ƒåƒ? servlets一æ äh‰§è¡Œï¼Œä½†æ˜¯å…è®¸ä½¿ç”¨æ›´è‡ªç„¶çš„æ–ÒŽ³•来创建静态内宏V€‚å°½½Ž¡servletå’ŒJSP™åµé¢å¯ä»¥äº¤æ›¿åœîC‹É用,但是它们各有千秋ã€? Servlets最适合于面向服务的Web应用åQŒåŒæ—¶è¿˜æ“…长于管理面向表½Cºçš„Web服务的控制功能,例如发送请求和处理非原文的数据。而JSP™åµé¢åˆ™æ›´é€? 合于产生åŸÞZºŽæ–‡æœ¬çš„æ ‡è®ŽÍ¼Œä¾‹å¦‚åQšHTML、SVG、WML以及XML½{‰ã€?/p> <p class="pbody" align="left"><a name="wp77335"></a>Web¾l„äšg以一个名ä¸?i>Web</i><i>容器</i><i> </i>的运行时òq›_°ä¸­çš„æœåŠ¡ä½œäØ“æ”¯æ’‘ã€‚åœ¨Java Web服务开发包åQˆJava Web Services Developer Pack, Java WSDPåQ‰ä¸­çš„Web¾l„äšg在Tomcat Web容器内运行。Web容器提供了一些服务,例如è¯äh±‚å‘é€ã€å®‰å…¨ã€åÆˆå‘ä»¥åŠç”Ÿå‘½å‘¨æœŸç®¡ç†ã€‚å®ƒ˜q˜ä‹Éå¾—Web¾l„äšg可以讉K—®å¤šç§APIåQ? 例如命名、事务处理以及e-mail½{‰æ–¹é¢çš„APIã€?/p> <p class="pbody" align="left"><a name="wp75560"></a>本章里描˜qîCº†Web应用的组¾l‡ã€é…¾|®ä»¥åŠå®‰è£…和部çÖv˜q‡ç¨‹ã€‚第11ç« å’Œ½W?2章中讲述如何开发面向服务的Web应用的Web¾l„äšg。第14ç« å’Œ½W?5章讲˜q°å¦‚何开发面向表½CºWeb的应用的Web¾l„äšg。JSP技术的许多特征是由Java Servlet技术决定的åQŒå› æ­¤å³ä½¿ä½ ä¸æ‰“½Ž—编写servletåQŒä¹Ÿåº”该熟悉˜q™æ–¹é¢çš„知识ã€?/p> <p class="pbody" align="left"><a name="wp64517"></a>大多数Web应用都ä‹É用HTTP协议åQŒè€Œä¸”对HTTP的支持也正是Web¾l„äšg的一个主要方面。对于HTTP协议特征的简要æ€È»“åQŒå‚è§?a >HTTP概述</a>ã€?/p> <p style="text-align: left;" align="left"><a name="wp64550"></a><b>Web</b><b>应用的生命周æœ?a name="2"></a></b></p> <p style="text-align: left;" align="left"><a name="wp64551"></a>Web应用由Web¾l„äšg、静态资源文ä»Óž¼ˆå¦‚图像)、帮助类和库¾l„成。Java WSDP提供许多支持服务åQŒç”¨äºŽå¢žå¼ºWeb¾l„äšg的性能òq¶ä‹É得它们更易于开发。不˜q‡ï¼Œç”׃ºŽè¦å……分考虑˜q™äº›æ”¯æŒæœåŠ¡åQŒæ‰€ä»¥Web应用在创建和˜qè¡Œ˜q‡ç¨‹ä¸Šä¸Žä¼ ç»Ÿçš„stand-alone式的Java¾cÀLœ‰æ‰€ä¸åŒã€?/p> <p style="text-align: left;" align="left"><a name="wp77333"></a>在Web应用被部¾|²ä»¥åŽï¼Œž®±å¯ä»¥å¯¹å…¶è¡Œä¸ºçš„æŸäº›æ–šw¢˜q›è¡Œé…ç½®ã€‚配¾|®ä¿¡æ¯é€šè¿‡<i>Web</i><i>应用部çÖv描述文äšg</i>来维护,该文件是一¿UXML格式的文本文件。部¾|²æ˜q°æ–‡ä»¶å¿…™å»éµä»?a target="_blank">Java Servlet规范</a>中描˜q°çš„æ¨¡å¼ã€?/p> <p style="text-align: left;" align="left"><a name="wp64561"></a>创徏、部¾|²å’Œæ‰§è¡ŒWeb应用的过½E‹å¯ä»¥æ€È»“ä¸ÞZ»¥ä¸‹å‡ æ­¥ï¼š</p> <p style="text-align: left;" align="left"><a name="wp64562"></a>1åQŽå¼€å‘Web¾l„äšg代码åQˆå¯èƒ½è¿˜åŒ…括部çÖv描述文äšgåQ‰ã€?/p> <p style="text-align: left;" align="left"><a name="wp64563"></a>2åQŽå¾ç«‹Web应用¾l„äšg˜qžåŒæ‰€æœ‰é™æ€èµ„源(例如<a name="wp64564"></a>囑փåQ‰å’Œ¾l„äšg要引用到的帮助类ã€?/p> <p style="text-align: left;" align="left">3åQŽå°†åº”用安装或部¾|²åˆ°Web容器中ã€?/p> <p style="text-align: left;" align="left"><a name="wp64565"></a>4åQŽè®¿é—®æŒ‡å‘该Web应用的URLã€?/p> <p style="text-align: left;" align="left"><a name="wp75485"></a>å¼€ 发Web¾l„äšg代码˜q™æ–¹é¢çš„知识ž®†åœ¨ä»¥åŽçš„章节中讲述。接下来的几节将å¯ÒŽ­¥éª?到步éª?作出详细的讲解,òq¶ç»™å‡ÞZ¸€ä¸ªHelloåQŒWorld式的面向表示的应 用的例子。该应用允许用户输入名字到HTML表单中(见图4åQ?åQ‰ï¼Œòq¶ä¸”在名字提交之后显½CÞZ¸€æ¡é—®å€™ä¿¡æ¯ï¼ˆè§å›¾4â€?åQ‰ã€?/p> <p style="text-align: left;" align="left"><img src="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/4/4/image001.gif" alt="Greeting Form" v:shapes="_x0000_i1028" border="0" height="168" width="313"> </p> <p style="text-align: left;" align="left"><b>å›?-1 问候表å?/b></p> <p style="text-align: left;" align="left"><img src="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/4/4/image002.gif" alt="Response" v:shapes="_x0000_i1029" border="0" height="163" width="323"> </p> <p style="text-align: left;" align="left"><a name="64577"></a><b>å›?-2 响应</b></p> <p style="text-align: left;" align="left"><a name="wp64578"></a>˜q™ä¸ªHello应用包含了两个Web¾l„äšgåQŒç”¨äºŽäñ”生问候信息和响应。在本指南中åQŒè¯¥åº”用有两个版本:一个是servletç‰ˆï¼ŒåäØ“Hello1åQŒå®ƒçš„组仉™€šè¿‡ä¸¤ä¸ªservlet¾c»ï¼ˆ<a target="_blank">GreetingServlet.java</a>å’?a target="_blank">ResponseServlet.java</a>åQ‰æ¥å®žçŽ°ã€‚å¦ä¸€ä¸ªæ˜¯JSPç‰ˆï¼ŒåäØ“Hello2åQŒå®ƒçš„组仉™€šè¿‡ä¸¤ä¸ªJSP™åµé¢åQ?a target="_blank">greeting.jsp</a> å’?<a target="_blank">response.jsp</a>åQ‰æ¥å®žçŽ°ã€‚è¿™ä¸¤ä¸ªç‰ˆæœ¬çš„ä¾‹å­å±•½CÞZº†ä¸€ä¸ªåŒ…含Web¾l„äšg的应用在大包、部¾|²å’Œ˜qè¡Œæ—¶æ‰€æ¶‰åŠåˆ°çš„ä»ÕdŠ¡ã€‚å¦‚æžœä½ æ˜¯åœ¨¾U¿æµè§ˆæœ¬æŒ‡å—åQŒè¯·åŠ¡å¿…ä¸‹è²æœ¬æŒ‡å—çš„æ†ç»‘åŒ…ï¼Œä»¥èŽ·å¾—è¿™ä¸ªç¤ºä¾‹çš„æºä»£ç ã€?/p> <h2 align="left"><a name="wp64585"></a>Web应用归档文äšg<a name="3"></a></h2> <p class="pbody" align="left"><a name="wp64587"></a>如果要发布一个Web应用åQŒä½ å¯ä»¥ž®†å…¶æ‰“包åˆîC¸€ä¸ªWeb应用归档文äšgåQˆWeb application archiveåQŒWARåQ‰ä¸­åQŒWAR与JAR¾cÖM¼¼åQŒéƒ½æ˜¯ç”¨ä½œJava¾cÕdº“的包。除了应用的Web¾l„äšg外,Web应用的归档文件还包含其他的一些文ä»Óž¼ŒåŒ…括åQ?/p> <p style="text-align: left;" align="left"><a name="wp64588"></a> ·   服务器端的实用工å…ïL±»åQˆå¦‚数据库bean、购物èžR½{‰ç­‰åQ‰ã€‚这些类通常与JavaBeans¾l„äšg的结构一致ã€?/p> <p style="text-align: left;" align="left"><a name="wp64590"></a> ·   静态Web表示内容åQˆå¦‚HTMLåQŒå›¾åƒå’Œå£°éŸ³æ–‡äšg½{‰ï¼‰</p> <p style="text-align: left;" align="left"><a name="wp64591"></a> ·   客户端类åQˆapplet和实用工å…ïL±»åQ?/p> <p class="pbody" align="left"><a name="wp64593"></a>Web¾l„äšg和静态Web内容文äšg叫做<i>Web</i><i>资源</i>ã€?/p> <p class="pbody" align="left"><a name="wp75587"></a>Web应用的运行可以通过一个WARæ–‡äšgåQŒæˆ–者通过一个同为WAR格式的解包目录ã€?/p> <p align="left"><a name="wp72795"></a><b>WAR</b><b>目录¾l“æž„</b></p> <p class="pbody" align="left"><a name="wp64595"></a>WAR的顶¾U§ç›®å½•是该应用的<i>文档根目å½?/i>。这个文档根目录下存攄¡€JSP™åµé¢ã€å®¢æˆïL«¯¾cÕd’Œå½’档文äšgåQŒä»¥åŠé™æ€Web资源ã€?/p> <p class="pbody" align="left"><a name="wp64596"></a>文档根目录下含有一个名为WEB-INF的子目录åQŒå…¶ä¸­åŒ…含了以下文äšg和目录:</p> <p style="text-align: left;" align="left"><a name="wp64597"></a> ·   <code>web.xml </code>—â€?Web应用的部¾|²æ˜q°æ–‡ä»¶ã€?/p> <p style="text-align: left;" align="left"><a name="wp64601"></a> ·   标签库描˜q°æ–‡ä»¶ã€?/p> <p style="text-align: left;" align="left"><a name="wp64602"></a> ·   <code>classes </code>—â€?一个子目录åQŒåŒ…含了服务器端¾c»ï¼šservletsåQŒå®žç”¨å·¥å…ïL±»å’ŒJavaBeans¾l„äšgã€?/p> <p style="text-align: left;" align="left"><a name="wp64603"></a> ·   <code>lib </code>—â€?一个子目录åQŒåŒ…含了库(标签库和所有作为服务器端类的实用工å…ïL±»åQ?/p> <p class="pbody" align="left"><a name="wp64604"></a>˜q˜å¯ä»¥åˆ›å»ºåº”用专用(application-specificåQ‰çš„子目录(卛_Œ…目录åQ‰ï¼Œå¯ä»¥åœ¨æ–‡æ¡£æ ¹ç›®å½•下创建,或者在<code>WEB-INF/classes</code>目录下创建ã€?/p> <p align="left"><a name="wp70814"></a>指南½CÞZ¾‹çš„目录结æž?/p> <p class="pbody" align="left"><a name="wp72401"></a>ä¸ÞZº†ä¾¿äºŽ˜q­ä»£å¼€å‘åÆˆä¸”å°†Web应用的源代码与已¾~–译的文件分开åQŒå®žä¾‹çš„æºä»£ç å­˜å‚¨åœ¨æ¯ä¸ªåº”用目录<code><i>mywebapp</i></code>下,其结构如下:</p> <p style="text-align: left;" align="left"><a name="wp74951"></a> ·   <code>build.xml</code>—â€?Ant生成文äšg</p> <p style="text-align: left;" align="left"><a name="wp74971"></a> ·   <code>context.xml</code>——可选应用配¾|®æ–‡ä»?/p> <p style="text-align: left;" align="left"><a name="wp74958"></a> ·   <code>src </code>—â€?servlerå’ŒJavabeans¾l„äšgçš„Java源代码ã€?/p> <p style="text-align: left;" align="left"><a name="wp74975"></a> ·   <code>web </code>—â€?JSP™åµé¢å’ŒHTML™åµé¢ã€å›¾åƒã€?/p> <p class="pbody" align="left"><a name="wp72402"></a>随示例一起发布的Ant buildæ–‡äšgåQˆbuild.xmlåQ‰ä¸­åŒ…含了一些目æ ?åQˆtargetåQ‰ï¼Œç”¨ä»¥åœ?code><i>mywebapp</i></code>çš?code><i>build</i></code>子目录中创徏解包的WAR¾l“æž„åQŒå°†æ–‡äšg拯‚´å’Œç¼–译到那个目录中,òq¶ä¸”通过专门的Antä»ÕdŠ¡è°ƒç”¨<code>manager</code>命ä×oåQŒæ¥å®‰è£…、重新装载、移除、部¾|²å’Œè§£éƒ¨¾|²åº”用。该指南½CÞZ¾‹çš„Ant目标是:</p> <p style="text-align: left;" align="left"><a name="wp72974"></a> ·   <code>prepare</code>åQˆå‡†å¤‡ï¼‰ —â€?创徏build目录和WAR子目录ã€?/p> <p style="text-align: left;" align="left"><a name="wp72542"></a> ·   <code>build</code>åQˆç¼–译) —â€?¾~–译和拷è´?code><i>mywebapp</i></code> Web应用文äšg到build目录下ã€?/p> <p style="text-align: left;" align="left"><a name="wp72543"></a> ·   <code>install</code>åQˆå®‰è£…)—â€?使用<code>Ant install</code>ä»ÕdŠ¡é€šçŸ¥Tomcat安装应用åQˆè§<a >安装Web应用</a>åQ‰ã€?/p> <p style="text-align: left;" align="left"><a name="wp72802"></a> ·   <code>reload</code>åQˆé‡æ–°è£…载)—â€?使用<code>Ant reload</code>ä»ÕdŠ¡é€šçŸ¥Tomcat重新装蝲应用åQˆè§<a >æ›´æ–°Web应用</a>åQ‰ã€?/p> <p style="text-align: left;" align="left"><a name="wp78142"></a> ·   <code>deploy</code>åQˆéƒ¨¾|ÔŒ¼‰ —â€?使用Ant deployä»ÕdŠ¡é€šçŸ¥Tomcat部çÖv应用åQˆè§<a >部çÖvWeb应用</a>åQ‰ã€?/p> <p style="text-align: left;" align="left"><a name="wp78166"></a> ·   <code>undeploy</code>åQˆè§£é™¤éƒ¨¾|ÔŒ¼‰â€”—ä‹É用Ant undeployä»ÕdŠ¡é€šçŸ¥Tomcat解除部çÖv应用åQˆè§<a >解除部çÖvWeb应用</a>åQ?/p> <p style="text-align: left;" align="left"><a name="wp72544"></a> ·   <code>remove</code>åQˆç§»é™¤ï¼‰ —â€?使用<code> Ant remove</code>ä»ÕdŠ¡é€šçŸ¥Tomcat¿U»é™¤åº”用åQˆè§<a >¿U»é™¤Web应用</a>åQ?/p> <p align="left"><a name="wp75043"></a>创徏WAR</p> <p class="pbody" align="left"><a name="wp75060"></a>手工的创建WARæ–‡äšg有两¿Uæ–¹æ³•:</p> <p style="text-align: left;" align="left"><a name="wp78614"></a> ·   使用随J2SE SDK一起发布的JAR工具。只需½Ž€å•地在指南示例的build目录下执行如下命令:</p> <p style="text-align: left;" align="left">jar cvf <code><i>mywebapp</i></code>.war .<a name="wp75064"></a></p> <p style="text-align: left;" align="left"><a name="wp75044"></a> ·   使用<code>Ant war</code>ä»ÕdŠ¡</p> <p class="pbody" align="left"><a name="wp75227"></a>˜q™ä¸¤¿Uæ–¹æ³•都要求有创建好的Web应用部çÖv描述文äšgã€?/p> <h2 align="left">配置Web应用<a name="4"></a></h2> <p class="pbody" align="left"><a name="wp71940"></a>Web 应用的配¾|®æ˜¯é€šè¿‡åŒ…含在Web应用部çÖv描述文äšg中的元素的设¾|®æ¥å®žçŽ°çš„ã€‚ä½ å¯ä»¥ä½¿ç”¨æ–‡æœ¬¾~–辑器来手工创徏˜q™äº›æè¿°æ–‡äšg。接下来的章节将对你想配¾|®çš„Web 应用特征作一个简要的介绍。其中,许多的安全参数都可以在配¾|®æ—¶æŒ‡å®šåQŒè¿™äº›å†…容在½W?8章可以看到。如果你惛_¾—到这些特征的完整列表和描˜qŽÍ¼Œå‚见Java Servlet规范ã€?/p> <p class="pbody" align="left"><a name="wp77391"></a>在接下来的几节中åQŒå°†¾l™å‡ºä¸€äº›ç¤ºä¾‹æ¥æ¼”示HelloåQŒWorld应用的配¾|®è¿‡½E‹ã€‚如果HelloåQŒWorld没有使用指定的配¾|®ç‰¹å¾ï¼Œé‚£ä¹ˆæœ¬èŠ‚ž®†ç»™å‡ºå…¶ä»–çš„½CÞZ¾‹æ¥å±•½Cºéƒ¨¾|²æ˜q°æ–‡ä»¶çš„元素òq¶æ˜q°æŒ‡å®šè¿™¿Uç‰¹å¾çš„一般过½E‹ã€?/p> <div style="text-align: center;" align="left"> <hr align="left" size="2" width="100%"> </div> <div style="text-align: center;" align="left"><a name="wp69263"></a> <hr align="left" size="2" width="100%"> </div> <p align="left">æ³? 意:描述½W¦å…ƒç´ å¿…™åÕdœ¨éƒ¨çÖv描述文äšg中按照下列顺序出玎ͼšicon,display,description,distributable,context -param,filter,filter-mapping,listener,servlet,servlet-mapping,session-config,mime-mapping,welcome-file-list,error-page,taglib,resource-env-ref,resource-ref,security-contraint,login-config,seurity-role,env-entry.</p> <div style="text-align: center;" align="left"> <hr align="left" size="2" width="100%"> </div> <p align="left"><a name="wp68825"></a>序言</p> <p class="pbody" align="left"><a name="wp68826"></a>既然部çÖv描述文äšg是一¿UXML文档åQŒå®ƒž®±éœ€è¦ä¸€ä¸ªåº­a€ã€‚Web应用的部¾|²æ˜q°æ–‡ä»¶çš„序言如下所½Cºï¼š</p> <div align="left"> <pre><?xml version="1.0" encoding="ISO-8859-1"?></pre> <pre><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web </pre> <pre>Application 2.3//EN" "http://java.sun.com/dtd/web-</pre> <pre>app_2_3.dtd"> <a name="wp68891"> </a></pre> <pre><?xml version="1.0" encoding="ISO-8859-1"?></pre> <pre><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web </pre> <pre>Application 2.3//EN" "http://java.sun.com/dtd/web-</pre> <pre>app_2_3.dtd">  </pre> <pre> </pre> </div> <p align="left"><a name="wp75149"></a>别名路径</p> <p class="pbody" align="left"><a name="wp75150"></a>当Tomcat收到一个请求时åQŒå®ƒå¿…须军_®šä½¿ç”¨å“ªä¸ªWeb¾l„äšg来处理请求。这一步是通过ž®†åŒ…含在è¯äh±‚中的URL路径映像åˆîC¸€ä¸ªWeb¾l„äšg来实现的。URL路径包含上下文根目录åQˆå‚见Installing Web ApplicationåQŒhttp://java.sun.com/webservices/docs/1.1/tutorial/doc/WebApp5.html#wp75667åQ‰å’Œä¸€ä¸?i>别名</i>路径ã€?/p> <div align="left"> <pre>http://<<em>host></em>:8080/<code><i>context_root</i></code>/<code><i>alias_path</i></code><a name="wp75154"> </a></pre> <pre>http://<<em>host></em>:8080/<code><i>context_root</i></code>/<code><i>alias_path</i></code> </pre> <pre> </pre> </div> <p class="pbody" align="left"><a name="wp75155"></a>在servlet 可以被访问前åQŒWeb容器必须最ž®‘有一个该¾l„äšg的别名èµ\径。别名èµ\径必™åÖM»¥ä¸€ä¸ªâ€?”开始,以一个字½W¦ä¸²æˆ–者一个带扩展名的通配½W¦ï¼ˆä¾‹å¦‚åQšï¼Š.jspåQ‰ç»“ 束。既然Web容器自动地映像到ä»?.jsp¾l“束的别名èµ\径,你无需为JSP™åµé¢æŒ‡å®šåˆ«åè·¯å¾„åQŒé™¤éžä½ æƒ³é€šè¿‡ä¸€ä¸ªå¿UŽÍ¼Œè€Œä¸æ˜¯å…¶æ–‡äšg名来引用JSP™åµé¢ã€? 在更新Web应用中讨论的实例中,问候页面有一个别名response.jspåQŒä½†å®ƒä»ç„¶æ˜¯é€šè¿‡å…¶æ–‡ä»¶åæ¥å¼•用的ã€?/p> <p class="pbody" align="left"><a name="wp75159"></a>在Web 部çÖv描述文äšg中设¾|®servlet版的Hello应用的映像,必须æ·ÕdŠ ä¸‹åˆ—servletå’Œservlet-mapping元素到Web应用部çÖv描述文äšg ä¸­ã€‚äØ“äº†å®šä¹‰JSP™åµé¢çš„别名,必须替换在servlet元素中的servlet-class子元素和jsp-file子元素ã€?/p> <div align="left"> <pre><servlet></pre> <pre>  <servlet-name>greeting</servlet-name></pre> <pre>  <display-name>greeting</display-name></pre> <pre>  <description>no description</description></pre> <pre>  <servlet-class>GreetingServlet</servlet-class></pre> <pre></servlet></pre> <pre><servlet></pre> <pre>  <servlet-name>response</servlet-name></pre> <pre>  <display-name>response</display-name></pre> <pre>  <description>no description</description></pre> <pre>  <servlet-class>ResponseServlet</servlet-class></pre> <pre></servlet></pre> <pre><servlet-mapping></pre> <pre>  <servlet-name>greeting</servlet-name></pre> <pre>  <url-pattern>/greeting</url-pattern></pre> <pre></servlet-mapping></pre> <pre><servlet-mapping></pre> <pre>  <servlet-name>response</servlet-name></pre> <pre>  <url-pattern>/response</url-pattern></pre> <pre></servlet-mapping><a name="wp75160"> </a></pre> </div> <p align="left"><a name="wp75327"></a>上下文和初始化参æ•?/p> <p class="pbody" align="left"><a name="wp75328"></a>å? 一个WAR中的各Web¾l„äšgå…׃ín一个表½Cºå®ƒä»¬çš„应用上下文的对象åQˆè§è®‰K—®Web上下文)。你可以传递参数到上下文或者Web¾l„äšg。要实现˜q™ä¸€ç‚¹ï¼Œä½ å¿…™åÀL·» 加一个context-param或init-param元素到Web应用部çÖv描述文äšg中。context-param是顶¾U§web-app元素的子å…? 素。init-param是servlet元素的子元素。下面的元素用于声明一个上下文参数åQŒè¯¥å‚数讄¡½®åœ¨ç¬¬17章中讨论的示例的资源束:</p> <div align="left"> <pre><web-app></pre> <pre>  <context-param></pre> <pre>    <param-name></pre> <pre>      javax.servlet.jsp.jstl.fmt.localizationContext</pre> <pre>    </param-name></pre> <pre>    <param-value>messages.BookstoreMessages</param-value></pre> <pre>  </context-param></pre> <pre>  ...</pre> <pre></web-app><a name="wp75335"> </a></pre> </div> <p align="left"><a name="wp75346"></a>事äšg监听å™?/p> <p class="pbody" align="left"><a name="wp75349"></a>要添加事件监听器¾c»ï¼Œå¿…é¡»æ·ÕdŠ ä¸€ä¸ªlistener元素到Web应用部çÖv描述文äšg中。下面的元素描述了在½W?4ç« å’Œ½W?7章用到的监听器类åQ‰ã€?/p> <div align="left"> <pre><listener></pre> <pre>  <listener-class>listeners.ContextListener</listener-class></pre> <pre></listener><a name="wp75357"> </a></pre> </div> <p align="left"><a name="wp75370"></a>˜q‡æ×o器映åƒ?/p> <p class="pbody" align="left"><a name="wp75371"></a>Web 容器使用˜q‡æ×o器映像声明来军_®šåº”用于某个请求的˜q‡æ×o器,òq¶ä¸”军_®š˜q™äº›˜q‡æ×o器的™åºåºã€‚正如在别名路径中描˜q°çš„那样åQŒè¯¥å®¹å™¨ž®†è¯·æ±‚URL与一个servlet 相匹配。要军_®šå¼•用哪个˜q‡æ×o器,容器通过servlet名或者URL模式来匹配过滤器映像声明。过滤器被调用的™åºåºž®±æ˜¯˜q‡æ×o器映像声明在˜q‡æ×o器映像列表中 出现的顺序,˜q‡æ×o器映像声明将è¯äh±‚URI与一个servlet匚w…èµäh¥ã€?/p> <p class="pbody" align="left"><a name="wp73611"></a>要指定过滤器映像åQŒå¿…™åÀL·»åŠ ä¸€ä¸ªfilterå’ŒfilteråQmapping元素到Web应用部çÖv描述文äšg中。下面的元素用于声明有序的过滤器åQŒåƈž®†å…¶æ˜ åƒåˆ°åœ¨½W?4ç« è®¨è®ø™¿‡çš„Receipt servletåQ?/p> <div align="left"> <pre><filter></pre> <pre>  <filter-name>OrderFilter<filter-name></pre> <pre>  <filter-class>filters.OrderFilter<filter-class></pre> <pre></filter></pre> <pre><filter-mapping></pre> <pre>  <filter-name>OrderFilter</filter-name></pre> <pre>  <url-pattern>/receipt</url-pattern></pre> <pre></filter-mapping><a name="wp73615"> </a></pre> </div> <p align="left"><a name="wp69666"></a>错误映像</p> <p class="pbody" align="left"><a name="wp69669"></a>å? 以指定状态代码与Web资源之间的映像,其中的状态代码可以是一个HTTP响应中返回的åQŒä¹Ÿå¯ä»¥æ˜¯ç”±ä»ÖM½•Web¾l„äšg˜q”回的一个Java¾~–程语言异常中返å›? 的。要讄¡½®æ˜ åƒåQŒå¿…™åÀL·»åР䏀ä¸?error-page>元素到部¾|²æ˜q°æ–‡ä»¶ä¸­ã€‚下面的元素用于ž®†OederException映像到第14ç«? 中ä‹É用的™åµé¢errorpage.htmlã€?/p> <div align="left"> <pre><error-page></pre> <pre>  <exception-type>exception.OrderException</exception-type></pre> <pre>  <location>/errorpage.html</location></pre> <pre></error-page><a name="wp69677"> </a></pre> </div> <div style="text-align: center;" align="left"> <hr align="left" size="2" width="100%"> </div> <div style="text-align: center;" align="left"><a name="wp69683"></a> <hr align="left" size="2" width="100%"> </div> <p align="left">注意åQšä½ ä¹Ÿå¯ä»¥äؓ包含在WAR内的JSP™åµé¢å®šä¹‰é”™è¯¯™åµé¢ã€‚如果错误页面是同时为WARå’ŒJSP™åµé¢è€Œå®šä¹‰çš„åQŒåˆ™JSP™åµé¢çš„错误页面居先ã€?/p> <div style="text-align: center;" align="left"> <hr align="left" size="2" width="100%"> </div> <h3 align="left"><a name="wp69158"></a>指向环境条目、资源环境条目或资源的引ç”?/h3> <p class="pbody" align="left"><a name="wp64709"></a>å¦? æžœWeb¾l„äšg需要引用环境条目,资源环境条目或资源(如数据库åQ‰ï¼Œå¿…须通过在Web应用部çÖv描述文äšg中的<env-entry>åQ? resource-env-ref>æˆ?resource-ref>元素来声明引用。下面的元素用于声明一个指向某个数据源的引用,è¯? 数据源在本指南关于Web技术的几章中要用到ã€?/p> <div align="left"> <pre><resource-ref></pre> <pre>  <res-ref-name>jdbc/BookDB</res-ref-name></pre> <pre>  <res-type>javax.sql.DataSource</res-type></pre> <pre>  <res-auth>Container</res-auth></pre> <pre></resource-ref><a name="wp69001"> </a><br><br><br><b>安装</b><b>Web</b><b>应用<a name="5"></a></b></pre> </div> <p style="text-align: left;" align="left"><a name="wp74391"></a><i>上下文(</i><i>context</i><i>åQ?/i>是映ž®„到一个Web应用的名¿U°ã€‚例如,Hello1应用的上下文æ˜?hello1ã€‚äØ“äº†å°†åº”ç”¨å®‰è£…åˆ°TomcatåQŒéœ€è¦é€šçŸ¥Tomcat有一个新的可用上下文ã€?/p> <p style="text-align: left;" align="left"><a name="wp73768"></a>可以使用Ant installä»ÕdŠ¡æ¥é€šçŸ¥Tomcat有一个新的上下文。注意,在Tomcat重新启动之后åQŒå®‰è£…å¥½çš„åº”ç”¨è¿˜ä¸èƒ½ä½¿ç”¨ã€‚è¦æ°æ€¹…地部¾|²åº”用,参见<a >部çÖvWeb应用</a>ã€?/p> <p style="text-align: left;" align="left"><a name="wp74593"></a>Ant installä»ÕdŠ¡å‘Šè¯‰ç”±url属性指定的在本地运行的½Ž¡ç†å™¨å®‰è£…一个应用,其上下文由path属性指定,其安装位¾|®åŒ…含了由war属性指定的该Web应用的文件。war属性的值可以是一个WARæ–‡äšgåQŒå¦‚åQ?/p> <p style="text-align: left;" align="left">jar:file:/path/to/bar.war!/ 或者是一个解包目录:</p> <p style="text-align: left;" align="left"> file:/path/to/fooã€?/p> <p style="text-align: left;" align="left"><install url="<i>url</i>" path="mywebapp" war="file:<i>build</i>"</p> <p style="text-align: left;" align="left">  username="<i>username</i>" password="<i>password</i>" /><a name="wp73809"> </a></p> <p style="text-align: left;" align="left"><a name="wp75704"></a>usernameå’Œpassword属性将åœ?a >Tomcat Web应用½Ž¡ç†½E‹åº</a>中讨论ã€?/p> <p style="text-align: left;" align="left"><a name="wp73822"></a>˜q™é‡Œæ— éœ€æä¾›ä¸€ä¸ªwar属性,你可以ä‹É用config属性来指定配置信息åQ?/p> <p style="text-align: left;" align="left"><install url="<i>url</i>" </p> <p style="text-align: left;" align="left">  path="<i>mywebapp</i>" config="file:build/context.xml"</p> <p style="text-align: left;" align="left">  username="<i>username</i>" password="<i>password</i>"/><a name="wp73828"> </a></p> <p style="text-align: left;" align="left"><a name="wp74439"></a>config属性指å‡ÞZ¸€ä¸ªé…¾|®æ–‡ä»¶åŒ…含上下文条目的格å¼?/p> <p style="text-align: left;" align="left"><Context path="/bookstore1"</p> <p style="text-align: left;" align="left">  docBase="../docs/tutorial/examples/web/bookstore1/build"</p> <p style="text-align: left;" align="left">  debug="0"><a name="wp74452"> </a></p> <p style="text-align: left;" align="left"><a name="wp73814"></a>注意åQŒè¿™ä¸ªä¸Šä¸‹æ–‡æ¡ç›®é€šè¿‡å®ƒçš„docBase属性隐式地指定了Web应用文äšg的位¾|®ã€?/p> <p style="text-align: left;" align="left"><a name="wp75321"></a>本指南示例buildæ–‡äšg包含一个Ant install <i>target</i>åQŒå®ƒž®†è°ƒç”¨Ant install <i>ä»ÕdŠ¡</i>åQ?/p> <p style="text-align: left;" align="left"><target name="install" </p> <p style="text-align: left;" align="left">  description="Install web application" depends="build"></p> <p style="text-align: left;" align="left">  <install url="${<i>url</i>}" path="${<i>mywebapp</i>}"</p> <p style="text-align: left;" align="left">    config="file:build/context.xml"</p> <p style="text-align: left;" align="left">    username="${<i>username</i>}" password="${<i>password</i>}"/></p> <p style="text-align: left;" align="left"></target><a name="wp73815"> </a></p> <p style="text-align: left;" align="left"><a name="wp76450"></a>Ant installä»ÕdŠ¡è¦æ±‚Web应用部çÖv描述文äšgåQˆweb.xmlåQ‰æ˜¯å¯ç”¨çš„。所有的指南½CÞZ¾‹åº”用都是随一个部¾|²æ˜q°æ–‡ä»¶ä¸€èµ·å‘布的ã€?/p> <p style="text-align: left;" align="left"><a name="wp76453"></a>To install the Hello1 application described in <a >Web Application Life Cycle</a>: </p> <p style="text-align: left;" align="left">要安è£?a >Web应用生命周期</a>中描˜q°çš„Hello1应用åQŒéœ€æŒ‰ä¸‹åˆ—步骤:</p> <p style="text-align: left;" align="left"><a name="wp76455"></a> 1åQ?在终端窗口中åQŒè{åˆ?<i>JWSDP_HOME</i>>/docs/tutorial/examples/web/hello1.</p> <p style="text-align: left;" align="left"><a name="wp76195"></a>2åQŽç¡®è®¤Tomcat已启åŠ?/p> <p style="text-align: left;" align="left"><a name="wp74548"></a>3åQŽæ‰§è¡Œant install。install target通知Tomcat新的上下文是可用的ã€?/p> <p class="pbody" align="left"><b>部çÖv</b><b>Web</b><b>应用<a name="6"></a></b></p> <p style="text-align: left;" align="left"><a name="wp74478"></a>如果Tomcat正在˜qè¡ŒåQŒå°±å¯ä»¥ä½¿ç”¨Ant deployä»ÕdŠ¡æ°æ€¹…地将一个上下文部çÖv到Tomcatã€?/p> <p style="text-align: left;" align="left">  <deploy url="<i>url</i>" path="<i>mywebapp</i>"</p> <p style="text-align: left;" align="left">    war="file:/<i>path</i>/<i>to</i>/<i>mywebapp.</i>war"</p> <p style="text-align: left;" align="left">    username="<i>username</i>" password="<i>password</i>" /><a name="wp75200"> </a></p> <p style="text-align: left;" align="left"><a name="wp75253"></a>不同于installä»ÕdŠ¡åQŒinstallä»ÕdŠ¡å¯ä»¥å¼•ç”¨ä¸€ä¸ªè§£åŒ…ç›®å½•ï¼Œdeployä»ÕdŠ¡éœ€è¦ä¸€ä¸ªWAR。该ä»ÕdŠ¡åŠ è²WAR到Tomcatòq¶ä¸”启动应用。也可以通过˜q™ä¸ªä»ÕdŠ¡ž®†å…¶éƒ¨çÖvåˆîC¸€ä¸ªè¿œ½E‹æœåŠ¡å™¨ä¸Šã€?/p> <p style="text-align: left;" align="left"><a name="wp78025"></a>下面是其他一些可用的部çÖvæ–ÒŽ³•åQŒä½†æ˜¯å®ƒä»¬è¦æ±‚重新启动TomcatåQ?/p> <p style="text-align: left;" align="left"><a name="wp78014"></a> ·   ž®†Web应用目录或WAR拯‚´åˆ?JWSDP_HOME>/webappsã€?/p> <p style="text-align: left;" align="left"><a name="wp78032"></a> ·   ž®†åŒ…å«äº†ä¸Šä¸‹æ–‡æ¡ç›®çš„åäØ“mywebapp.xml的配¾|®æ–‡ä»¶æ‹·è´åˆ°<JWSDP_HOME>/webapps。上下文条目的格式在< JWSDP_HOME>/docs/tomcat/config/context.html中的<i> Server Configuration Reference</i>里有描述。注意,上下文条目通过docBase属性隐式地指定了Web应用文äšg的位¾|®ã€‚例如,下面是在½W?4章中讨论的应用的上下文条目:</p> <p style="text-align: left;" align="left">  <Context path="/bookstore1"</p> <p style="text-align: left;" align="left">    docBase="../docs/tutorial/examples/web/</p> <p style="text-align: left;" align="left">      bookstore1/build" debug="0"><a name="wp78019"> </a></p> <p style="text-align: left;" align="left"><a name="wp78337"></a>一些实例buildæ–‡äšgåŒ?a name="wp75711"></a>含一个像Ant deploy <i>ä»ÕdŠ¡</i>一栯‚°ƒç”¨çš„Ant deploy <i>目标</i>ã€?/p> <h2 align="left">列出已安装和部çÖvçš„Web应用<a name="7"></a></h2> <p class="pbody" align="left"><a name="wp75712"></a>如果惛_ˆ—出当前在Tomcat内可使用所有Web应用åQŒä½ å¯ä»¥ä½¿ç”¨Ant listä»ÕdŠ¡åQ?/p> <div align="left"> <pre><list url="<code><i>url</i></code>" username="<code><i>username</i></code>" password="<code><i>password</i></code>" /><a name="wp75713"> </a></pre> </div> <p class="pbody" align="left"><a name="wp75729"></a>指南½CÞZ¾‹buildæ–‡äšg包含一个像调用Ant list <i>ä»ÕdŠ¡</i>一栯‚°ƒç”¨çš„Ant list <i>目标</i>ã€?</p> <p class="pbody" align="left"><a name="wp77910"></a>˜q˜å¯ä»¥é€šè¿‡˜qè¡ŒManager Application来查看列出的应用åQ?/p> <p class="pbody" align="left">http://<code><i><host></i></code>:8080/manager/list<a name="wp77938"> </a></p> <h2 align="left"><a name="wp64807"></a>˜qè¡ŒWeb应用<a name="8"></a></h2> <p class="pbody" align="left"><a name="wp71735"></a>Web应用是在Web‹¹è§ˆå™¨å¼•用映像到¾l„äšgçš„URL时执行的。一旦安装了或者部¾|²äº†Hello1应用åQŒä¾¿å¯é€šè¿‡ž®†æµè§ˆå™¨æŒ‡å‘</p> <div align="left"> <pre>http://<code><i><host></i></code>:8080/hello1/greeting<a name="wp71737"> </a></pre> <pre>来运行Web应用ã€?/pre> </div> <p class="pbody" align="left"><a name="wp71738"></a>用运行Tomcat的主机名替代<host>。如果浏览器˜qè¡Œåœ¨ä¸ŽTomcat相同的主æœÞZ¸ŠåQŒå°±å¯ä»¥ç”¨localhost替代<host>ã€?/p> <h2 align="left"><a name="wp64813"></a>æ›´æ–°Web应用<a name="9"></a></h2> <p class="pbody" align="left"><a name="wp64815"></a>在开发期é—ß_¼Œ¾lå¸¸éœ€è¦å¯¹Web应用˜q›è¡Œä¿®æ”¹ã€‚在修改servlet之后åQŒå¿…™å»ï¼š</p> <p style="text-align: left;" align="left"><a name="wp72209"></a>1åQŽé‡æ–°ç¼–译servlet¾c…R€?/p> <p style="text-align: left;" align="left"><a name="wp72219"></a>2åQŽæ›´æ–°æœåŠ¡å™¨ä¸Šçš„åº”ç”¨ã€?/p> <p style="text-align: left;" align="left"><a name="wp72220"></a>3åQŽé‡æ–°åœ¨å®¢æˆ·ç«¯è£…è½½URLã€?/p> <p class="pbody" align="left"><a name="wp72223"></a>æ›´æ–°JSP™åµé¢æ—Óž¼Œæ— éœ€é‡æ–°¾~–è¯‘æˆ–é‡æ–°è£…è½½åº”ç”¨ï¼Œå› äØ“Tomcat会自动完成这些事情ã€?/p> <p class="pbody" align="left"><a name="wp64816"></a>ä¸ÞZº†ž®è¯•˜q™ä¸€ç‰¹å¾åQŒä¿®æ”¹Hello应用的servlet版本。例如,你可以将<code>GreetingServlet</code>˜q”å›žçš„é—®å€™ä¿¡æ¯ä¿®æ”¹äØ“åQ?/p> <div align="left"> <pre><h2>Hi, my name is Duke. What's yours?</h2><a name="wp64843"> </a></pre> </div> <p class="pbody" align="left"><a name="wp73251"></a>æ›´æ–°æ–‡äšg的过½E‹äØ“åQ?/p> <p style="text-align: left;" align="left"><a name="wp64845"></a> 1åQŽÂ Â?¾~–辑在源码目å½?JWSDP_HOME>/docs/tutorial/examples/web/hello1/src中的GreetingServlet.java<a name="wp64846"></a>æ–‡äšgã€?/p> <p style="text-align: left;" align="left">2åQ?˜qè¡Œant buildä»ÕdŠ¡ã€‚è¯¥ä»ÕdŠ¡ž®†servlet重新¾~–译到build目录中ã€?/p> <p class="pbody" align="left"><a name="wp74806"></a>更新服务器中的应用这一˜q‡ç¨‹å–决于你是否使用Ant installä»ÕdŠ¡æ¥å®‰è£…æˆ–è€…ä‹É用Ant deployä»ÕdŠ¡æ¥éƒ¨¾|²è¿™ä¸ªåº”用ã€?/p> <p align="left"><a name="wp74151"></a>重新装蝲Web应用</p> <p class="pbody" align="left"><a name="wp74702"></a>如果你已¾lä‹É用Ant install命ä×o安装了应用,ž®±å¯ä»¥ä‹É用Ant reloadä»ÕdŠ¡æ¥æ›´æ–°æœåŠ¡å™¨ä¸­çš„åº”ç”¨åQ?/p> <div align="left"> <pre><reload url="<code><i>url</i></code>" path="<code><i>mywebapp</i></code>"</pre> <pre>  username="<code><i>username</i></code>" password="<code><i>password</i></code>" /><a name="wp74710"> </a></pre> </div> <p class="pbody" align="left"><a name="wp75997"></a>½CÞZ¾‹buildæ–‡äšg包含一ä¸? Ant remove<i>目标</i>åQŒè¯¥ç›®æ ‡è°ƒç”¨ Ant removeä»ÕdŠ¡ã€‚ä»Žè€Œæ›´æ–°æœåŠ¡å™¨ä¸­çš„Hello1应用åQŒæ‰§è¡Œant reloadã€‚äØ“äº†è§‚å¯Ÿç»˜q‡æ›´æ–°çš„应用åQŒé‡æ–°è£…载客æˆïL«¯çš„Hello1çš„URL。注意,<code>reload</code>ä»ÕdŠ¡åªæ”¹å˜Java¾c»ï¼Œè€Œä¸ä¼šæ”¹å˜Web.xmlæ–‡äšgã€‚äØ“äº†é‡æ–°è£…è½½web.xmlåQŒéœ€è¦å°†åº”用删除 åQˆå‚è§?a >¿U»é™¤Web应用</a>åQ‰åƈ重新安装ã€?/p> <p class="pbody" align="left"><a name="wp74726"></a>在浏览器上你可以看到如图4-3所½Cºçš„屏幕åQ?/p> <p align="left"><img src="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/4/4/image003.gif" alt="New Greeting" v:shapes="_x0000_i1033" border="0" height="200" width="351"> </p> <p align="left"><a name="74731"></a>å›?-3 新的问候信æ?/p> <p class="pbody" align="left"><a name="wp74679"></a>ä¸ÞZº†åœ¨è¯¥å®žä¾‹çš„JSP版本上尝试这一ç‰ÒŽ€§ï¼Œé¦–先建立和部¾|²JSP版的Hello应用åQ?/p> <p style="text-align: left;" align="left"><a name="wp75508"></a> <code>1åQ?/code> 在终端窗口中åQŒè{åˆ?/p> <p style="text-align: left;" align="left"><code><<i>JWSDP_HOME</i>>/docs/tutorial/examples/web/hello2.</code></p> <p style="text-align: left;" align="left"><a name="wp75509"></a> 2åQŽÂ Â Â?˜qè¡Œ<code>ant build</code>ã€?code>build</code>目标ž®†äñ”ç”Ÿæ‰€æœ‰å¿…éœ€çš„ç¼–è¯‘åÆˆä¸”æ‹·è´æ–‡ä»¶åˆ°</p> <p style="text-align: left;" align="left"><code><<i>JWSDP_HOME</i>>/docs/tutorial/examples/web/hello2/build</code> 目录ã€?/p> <p style="text-align: left;" align="left"><a name="wp75510"></a>3åQ?˜qè¡Œ<code>ant install</code>ã€?code>install</code>目标ž®†build目录拯‚´åˆ?JWSDP_HOME>/webappsbuildòq‰™€šçŸ¥Tomcat有新的应用ã€?/p> <p class="pbody" align="left"><a name="wp76928"></a>修改某一个JSPæ–‡äšg。然后运è¡?code>ant build</code>ž®†ç»˜q‡ä¿®æ”¹çš„æ–‡äšg拯‚´åˆ°docs/tutorial/examples/web/hello2/build。记住,˜q™é‡Œæ— éœ€é‡æ–°è£…è²æœåŠ¡å™¨ä¸­çš„åº”ç”¨ï¼Œå› äØ“å½“æŸä¸ªJSPæ–‡äšg被修æ”ÒŽ—¶åQŒTomcat会自动检‹¹‹åˆ°˜q™ä¸€æƒ…况。要查看¾lè¿‡ä¿®æ”¹çš„应用, 需重新装蝲客户端的Hello2çš„URLã€?/p> <p align="left"><a name="wp74147"></a>重新部çÖvWeb应用</p> <p class="pbody" align="left"><a name="wp78280"></a>如果已经通过使用Ant deployä»ÕdŠ¡éƒ¨çÖv了应用,ž®±å¯ä»¥é€šè¿‡æŽ¥è¿žä½¿ç”¨<code>Ant undeploy</code>ä»ÕdŠ¡åQˆè§<a >解除部çÖvWeb应用</a>åQ‰å’Œ<code>Ant deploy</code>ä»ÕdŠ¡æ¥æ›´æ–°è¿™ä¸ªåº”ç”¨ã€?/p> <h2 align="left">¿U»é™¤Web应用<a name="10"></a></h2> <p class="pbody" align="left"><a name="wp74660"></a>如果想从服务中移除已安装的Web应用åQŒå¯ä»¥è°ƒç”?code> Ant remove</code>ä»ÕdŠ¡åQ?/p> <div align="left"> <pre><remove url="<code><i>url</i></code>" path="<code><i>mywebapp</i></code>"</pre> <pre>  username="<code><i>username</i></code>" password="<code><i>password</i></code>" /><a name="wp74668"> </a></pre> </div> <p class="pbody" align="left"><a name="wp74663"></a>½CÞZ¾‹buildæ–‡äšg包含一ä¸? Ant remove<i>目标</i>åQŒè¯¥ç›®æ ‡è°ƒç”¨ Ant remove<i>ä»?/i>务ã€?/p> <h2 align="left"><a name="wp74659"></a>解除部çÖvWeb应用<a name="11"></a></h2> <p class="pbody" align="left"><a name="wp74664"></a>如果想移除一个已部çÖvçš„Web应用åQŒå¯ä»¥ä‹É用Ant undeployä»ÕdŠ¡åQ?/p> <div align="left"> <pre><undeploy url="<code><i>url</i></code>" path="<code><i>mywebapp</i></code>"</pre> <pre>  username="<code><i>username</i></code>" password="<code><i>password</i></code>" /><a name="wp75235"> </a></pre> </div> <p class="pbody" align="left"><a name="wp78329"></a>一些实例buildæ–‡äšg包含一个Ant undeploy<i>目标</i>åQŒè¯¥ç›®æ ‡è°ƒç”¨Ant undeploy<i>ä»ÕdŠ¡</i>ã€?/p> <p style="text-align: left;" align="left"><a name="wp78324"></a><b>Web</b><b>应用的国际化和本地化<a name="12"></a></b></p> <p style="text-align: left;" align="left"><a name="wp64859"></a>所谓的<i>国际åŒ?/i>是指使得应用能够支持各种语言和数据格式的˜q‡ç¨‹ã€‚所è°?i>本地åŒ?/i>åQŒæ˜¯æŒ‡ä‹É得一个国际化的应用能够支持某¿Uç‰¹å®šçš„æˆ–者本地的语言的过½E‹ã€‚虽然所有客æˆïL«¯ç”¨æˆ·æŽ¥å£éƒ½åº”该被国际化和本地化,但是国际化和本地化对于Web应用来说ž®¤å…¶é‡è¦åQŒå› ä¸ºWeb本èínž®±æ˜¯æ— æ‰€ä¸åŠçš„。如果想要很好地鸟瞰一下国际化与本地化问题åQŒå‚è§?/p> <p style="text-align: left;" align="left"><a target="_blank">http://java.sun.com/docs/books/tutorial/i18n/index.html</a><a name="wp64862"> </a></p> <p style="text-align: left;" align="left"><a name="wp71766"></a>有两¿Uæ–¹æ³•可以用于对Web应用˜q›è¡Œå›½é™…化:</p> <p style="text-align: left;" align="left"><a name="wp71768"></a> ·   在每个目标位¾|®ä¸­æä¾›ä¸€ä¸ªJSP™åµé¢åQŒåƈ且ä‹É用一个控制器servlet来发送请求到适当的页面上åQˆå–决于被请求的位置åQ‰ã€‚如果需要对一个页面或者一个完 æ•´çš„Web应用的数据进行国际化åQŒè¿™¿Uæ–¹æ³•比较有用ã€?/p> <p style="text-align: left;" align="left"><a name="wp71811"></a> ·   ž®†é¡µé¢ä¸Šæ‰€æœ‰çš„æœ¬åœ°æ•æ„Ÿçš„æ•°æ?(例如错误信息åQŒä¸²å­—符或按钮标½{? 分离到资源束内,然后讉K—®˜q™äº›æ•°æ®åQŒæ¥èŽ·å–å“åº”çš„ç¿»è¯‘è¿‡æ¥çš„ä¿¡æ¯òq¶å°†å…¶æ’入到™åµé¢å½“中。这样一来,ž®×ƒ¸æ˜¯åœ¨ä»£ç ä¸­ç›´æŽ¥åˆ›å»ºå­—½W¦ä¸²åQŒè€Œæ˜¯åˆ›å¾ä¸€ä¸ªåŒ…含了¾˜»è¯‘ ˜q‡æ¥çš„信息的资源束,然后使用相应的关键字从该资源束中è¯Õd‡º¾˜»è¯‘˜q‡æ¥çš„信息。资源束可以ç”׃¸€ä¸ªæ–‡æœ¬æ–‡ä»Óž¼ˆå±žæ€§èµ„源束åQ‰æˆ–一个包含了映像的类åQˆåˆ—表资源束åQ? 来支持ã€?/p> <p style="text-align: left;" align="left"><a name="wp64865"></a>åœ? 下面的关于Web技术的几章中,Duke's Bookstore实例被分别国际化和本地化成英语和西班牙语。关键字åQå€¼å¯¹åŒ…含在名为message.BookMessage_*.class的列表资 æºæŸã€‚äØ“äº†äº†è§£åœ¨èµ„æºæŸä¸­çš„å…³é”®å­—åQå€¼å¯¹æ˜¯æ€Žæ ·çš„,è¯ïLœ‹åœ¨æ–‡ä»¶messages.BookMessages.java中添加的几行åQ?/p> <p style="text-align: left;" align="left">{"TitleCashier", "Cashier"},</p> <p style="text-align: left;" align="left">{"TitleBookDescription", "Book Description"},</p> <p style="text-align: left;" align="left">{"Visitor", "You are visitor number "},</p> <p style="text-align: left;" align="left">{"What", "What We"re Reading"},</p> <p style="text-align: left;" align="left">{"Talk", " talks about how Web components can transform the way </p> <p style="text-align: left;" align="left">you develop applications for the Web. This is a must read for </p> <p style="text-align: left;" align="left">any self respecting Web developer!"},</p> <p style="text-align: left;" align="left">{"Start", "Start Shopping"},<a name="wp64866"> </a></p> <p style="text-align: left;" align="left"><a name="wp64868"></a>ä¸ÞZº†èŽ·å¾—å¯¹åº”äºŽæŸä¸ªç»™å®šç”¨æˆïLš„æ­£ç¡®å­—符ä¸ÔŒ¼ŒWeb¾l„äšg从请求中获取位置åQˆç”±‹¹è§ˆå™¨çš„语言首选项讑֮šåQ‰ï¼Œä¸ºé‚£ä¸ªä½¾|®æ‰“开资源束,然后ž®†è¯¥èµ„源束作ä¸ÞZ¼šè¯å±žæ€§ä¿å­˜ï¼š</p> <p style="text-align: left;" align="left">ResourceBundle messages = (ResourceBundle)session.</p> <p style="text-align: left;" align="left">  getAttribute("messages");</p> <p style="text-align: left;" align="left">  if (messages == null) {</p> <p style="text-align: left;" align="left">    Locale locale=request.getLocale();</p> <p style="text-align: left;" align="left">    messages = ResourceBundle.getBundle("WebMessages",</p> <p style="text-align: left;" align="left">      locale); </p> <p style="text-align: left;" align="left">    session.setAttribute("messages", messages);</p> <p style="text-align: left;" align="left">  }<a name="wp64872"> </a></p> <p style="text-align: left;" align="left"><a name="wp64873"></a>Web¾l„äšg从会话中获取资源束:</p> <p style="text-align: left;" align="left">ResourceBundle messages =</p> <p style="text-align: left;" align="left">  (ResourceBundle)session.getAttribute("messages");<a name="wp64874"> </a></p> <p style="text-align: left;" align="left"><a name="wp64875"></a>然后用下面的语句查找与关键字TitleCashier相关的字½W¦ä¸²åQ? </p> <p style="text-align: left;" align="left">messages.getString("TitleCashier");<a name="wp64876"> </a></p> <p style="text-align: left;" align="left"><a name="wp64884"></a>上面对国际化Web应用的介¾léžå¸¸ç®€è¦ã€‚如果要了解更多该主题的相关信息åQŒå‚见Java BluePrints:</p> <a target="_blank">http://java.sun.com/blueprints</a><img src ="http://www.aygfsteel.com/svg_007/aggbug/19022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/svg_007/" target="_blank">svg_007</a> 2005-11-09 18:01 <a href="http://www.aygfsteel.com/svg_007/archive/2005/11/09/19022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>下一步的学习计划http://www.aygfsteel.com/svg_007/archive/2005/11/09/19021.htmlsvg_007svg_007Wed, 09 Nov 2005 09:55:00 GMThttp://www.aygfsteel.com/svg_007/archive/2005/11/09/19021.htmlhttp://www.aygfsteel.com/svg_007/comments/19021.htmlhttp://www.aygfsteel.com/svg_007/archive/2005/11/09/19021.html#Feedback1http://www.aygfsteel.com/svg_007/comments/commentRss/19021.htmlhttp://www.aygfsteel.com/svg_007/services/trackbacks/19021.html

]]>
JSF与Struts的异å?/title><link>http://www.aygfsteel.com/svg_007/archive/2005/11/08/18770.html</link><dc:creator>svg_007</dc:creator><author>svg_007</author><pubDate>Tue, 08 Nov 2005 06:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/svg_007/archive/2005/11/08/18770.html</guid><wfw:comment>http://www.aygfsteel.com/svg_007/comments/18770.html</wfw:comment><comments>http://www.aygfsteel.com/svg_007/archive/2005/11/08/18770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/svg_007/comments/commentRss/18770.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/svg_007/services/trackbacks/18770.html</trackback:ping><description><![CDATA[Strutså’ŒJSF/Tapestry都属于表现层框架åQŒè¿™ä¸¤ç§åˆ†å±žä¸åŒæ€§è´¨çš„æ¡†æžÓž¼ŒåŽè€…是一¿Uäº‹ä»‰™©±åŠ¨åž‹çš„ç»„ä»¶æ¨¡åž‹ï¼Œè€ŒStruts只是单纯的MVC模式框架åQŒè€å¤–æ€ÀL˜¯æ€¥å¼åÆD¯´äº‹äšg驱动型就比MVC模式框架好,何以见得åQŒæˆ‘们下面进行详¾l†åˆ†æžæ¯”较一下到底是怎么回事åQ? <p>  首先事äšg是指从客æˆïL«¯™åµé¢åQˆæµè§ˆå™¨åQ‰ç”±ç”¨æˆ·æ“ä½œè§¦å‘的事ä»Óž¼ŒStruts使用Action来接受浏览器表单提交的事ä»Óž¼Œ˜q™é‡Œä½¿ç”¨äº†Command模式åQŒæ¯ä¸ªç‘ô承Action的子¾c»éƒ½å¿…须实现一个方法executeã€?/p> <p>  在struts中,实际是一个表单Form对应一个Action¾c?或DispatchAction)åQŒæ¢ä¸€å¥è¯è¯ß_¼šåœ¨Struts中实际是一 个表单只能对应一个事ä»Óž¼Œstruts˜q™ç§äº‹äšg方式¿UîCØ“application eventåQŒapplication eventå’Œcomponent event相比是一¿Uç²—¾_’度的事件ã€?/p> <p>  struts重要的表单对象ActionForm是一¿Uå¯¹è±¡ï¼Œå®ƒä»£è¡¨äº†ä¸€¿Uåº”用,˜q™ä¸ªå¯¹è±¡ä¸­è‡³ž®‘包含几个字ŒDµï¼Œ˜q™äº›å­—段是Jsp™åµé¢è¡¨å•中的 input字段åQŒå› ä¸ÞZ¸€ä¸ªè¡¨å•对应一个事ä»Óž¼Œæ‰€ä»¥ï¼Œå½“我们需要将事äšg¾_’度¾l†åŒ–到表单中˜q™äº›å­—段æ—Óž¼Œä¹Ÿå°±æ˜¯è¯´åQŒä¸€ä¸ªå­—ŒDµå¯¹åº”一个事件时åQŒå•¾U¯ä‹Éç”? Strutsž®×ƒ¸å¤ªå¯èƒ½ï¼Œå½“然通过¾l“合JavaScript也是可以转弯实现的ã€?/p> <p>  而这¿Uæƒ…况ä‹É用JSFž®±å¯ä»¥æ–¹ä¾¿å®žçŽŽÍ¼Œ</p> <table bgcolor="#cccccc" border="0" width="90%"> <tbody> <tr> <td><h:inputText id="userId" value="#{login.userId}"><br>  <f:<strong>valueChangeListener</strong> type="logindemo.UserLoginChanged" /><br></h:inputText></td></tr></tbody> </table> <p>  #{login.userId}表示从名为loginçš„JavaBeançš„getUserId获得的结果,˜q™ä¸ªåŠŸèƒ½ä½¿ç”¨struts也可以实玎ͼŒname="login" property="userId" </p> <p>  关键是第二行åQŒè¿™é‡Œè¡¨½Cºå¦‚æžœuserIdçš„å€¼æ”¹å˜åÆˆä¸”ç¡®å®šæäº¤åŽåQŒå°†è§¦å‘调用¾c»UserLoginChangedçš„processValueChanged(...)æ–ÒŽ³•ã€?/p> <p>  JSF可以为组件提供两¿Uäº‹ä»Óž¼šValue Changedå’?Action. 前者我们已¾låœ¨ä¸ŠèŠ‚è§è¯†˜q‡ç”¨å¤„,后者就相当于struts中表单提交Action机制åQŒå®ƒçš„JSF写法如下åQ?/p> <table bgcolor="#cccccc" border="0" width="90%"> <tbody> <tr> <td><h:commandButton id="login" commandName="login"><br>  <f:<strong>actionListener</strong> type=”logindemo.LoginActionListenerâ€?/><br></h:commandButton></td></tr></tbody> </table> <p>  从代码可以看出,˜q™ä¸¤¿Uäº‹ä»¶æ˜¯é€šè¿‡Listerner˜q™æ ·è§‚察者模式脓在具体组件字ŒDµä¸Šçš„,而Struts此类事äšg是原始的一¿Uè¡¨å•提äº? Submit触发机制。如果说前者比较语­a€åŒ–(¾~–程语言习惯做法¾cÖM¼¼Swing¾~–程åQ‰ï¼›åŽè€…是属于WEBåŒ–ï¼Œå› äØ“å®ƒæ˜¯æ¥è‡ªHtml表单åQŒå¦‚果你èµäh­¥æ˜¯ä»Ž Perl/PHP开始,反而容易接受Struts˜q™ç§é£Žæ ¼ã€?/p> <p><strong>基本配置</strong></p> <p>  Strutså’ŒJSF都是一¿Uæ¡†æžÓž¼ŒJSF必须需要两¿UåŒ…JSF核心包、JSTL包(标签库)åQŒæ­¤å¤–,JSF˜q˜å°†ä½¿ç”¨åˆ°Apache™å¹ç›®çš„一些commons包,˜q™äº›Apache包只要部¾|²åœ¨ä½ çš„æœåŠ¡å™¨ä¸­æ—¢å¯ã€?/p> <p>  JSF包下载地址åQ?a target="_blank"><u>http://java.sun.com/j2ee/javaserverfaces/download.html</u></a>选择其中<b>Reference Implementationã€?/b></p> <p>  JSTL包下载在<a target="_blank"><u>http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi</u></a><br><br>  所以,从JSF的驱动包¾l„成看,其开源基因也占据很大的比重,JSF是一个SUNä¼™ä¼´ä»¬å·¥ä¸šæ ‡å‡†å’Œå¼€æºä¹‹é—´çš„ä¸€ä¸ªæØœè¡€å„ѝ€?/p> <p>  上述两个地址下蝲的jaråˆåÆˆåœ¨ä¸€èµ·å°±æ˜¯JSF所需要的全部驱动包了。与Strutsçš„é©±åŠ¨åŒ…ä¸€æ øP¼Œ˜q™äº›é©±åŠ¨åŒ…å¿…™åÖM½äºŽWeb™å¹ç›®çš„WEB-INF/libåQŒå’ŒStruts一æ ïLš„æ˜¯ä¹Ÿå¿…须在web.xml中有如下配置åQ?/p> <table bgcolor="#cccccc" border="0" width="90%"> <tbody> <tr> <td><web-app><br>  <servlet><br>    <servlet-name>Faces Servlet</servlet-name><br>    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class><br>    <load-on-startup>1</load-on-startup><br>  </servlet> <p>  <servlet-mapping><br>    <servlet-name>Faces Servlet</servlet-name><br>    <url-pattern>*.faces</url-pattern><br>  </servlet-mapping> <br></web-app></p></td></tr></tbody> </table> <p>  ˜q™é‡Œå’ŒStrutsçš„web.xmlé…ç½®ä½•å…¶ç›æ€¼¼åQŒç®€ç›´ä¸€æ¨¡ä¸€æ —÷€?/p> <p>  正如Strutsçš„struts-config.xmlä¸€æ øP¼ŒJSF也有¾cÖM¼¼çš„faces-config.xml配置文äšgåQ?/p> <table bgcolor="#cccccc" border="0" width="90%"> <tbody> <tr> <td><br><faces-config><br>  <navigation-rule><br>    <from-view-id>/index.jsp</from-view-id><br>    <navigation-case><br>      <from-outcome>login</from-outcome><br>      <to-view-id>/welcome.jsp</to-view-id><br>    </navigation-case><br>  </navigation-rule> <p>  <managed-bean> <br>    <managed-bean-name>user</managed-bean-name><br>    <managed-bean-class>com.corejsf.UserBean</managed-bean-class> <br>    <managed-bean-scope>session</managed-bean-scope> <br>  </managed-bean><br></faces-config></p> <p> </p></td></tr></tbody> </table> <p>  在Struts-config.xml中有ActionForm Action以及Jsp之间的流½E‹å…³¾p»ï¼Œåœ¨faces-config.xml中,也有˜q™æ ·çš„æµ½E‹ï¼Œæˆ‘们具体解释一下NavigationåQ?/p> <p>  在index.jsp中有一个事ä»Óž¼š</p> <p><h:commandButton label="Login" action="login" /></p> <p>  action的值必™åÕdŒ¹é…form-outcomeå€û|¼Œä¸Šè¿°Navigation配置表示åQšå¦‚果在index.jsp中有一个login事äšgåQŒé‚£ä¹ˆäº‹ä»¶è§¦å‘后下一个页面将是welcome.jsp</p> <p>  JSF有一个独立的事äšg发生和页面导航的‹¹ç¨‹å®‰æŽ’åQŒè¿™ä¸ªæ€èµ\比struts要非常清晰ã€?/p> <p>  managed-bean¾cÖM¼¼Strutsçš„ActionFormåQŒæ­£å¦‚可以在struts-config.xml中定义ActionFormçš„scopeä¸€æ øP¼Œ˜q™é‡Œä¹Ÿå®šä¹‰äº†managed-beançš„scope为sessionã€?/p> <p>ã€€ã€€ä½†æ˜¯å¦‚æžœä½ åªä»¥äØ“JSFçš„managed-beanž®Þp¿™ç‚¹åŠŸèƒ½å°±é”™äº†åQŒJSF融入了新的Ioc模式/依赖性注ž®„等技术ã€?/p> <p><strong>Ioc模式</strong></p> <p>  对于Userbean˜q™æ ·ä¸€ä¸ªmanaged-beanåQŒå…¶ä»£ç å¦‚下åQ?/p> <p>public class UserBean {<br>  private String name;<br>  private String password;</p> <p>  // PROPERTY: name<br>  public String getName() { return name; }<br>  public void setName(String newValue) { name = newValue; }</p> <p>  // PROPERTY: password<br>  public String getPassword() { return password; }<br>  public void setPassword(String newValue) { password = newValue; }<br>}<br></p> <table bgcolor="#cccccc" border="0" width="90%"> <tbody> <tr> <td> <p><managed-bean><br>  <managed-bean-name>user</managed-bean-name><br>  <managed-bean-class>com.corejsf.UserBean</managed-bean-class><br>  <managed-bean-scope>session</managed-bean-scope><br><br>  <managed-property><br>    <property-name>name</property-name><br>    <value>me</value><br>  </managed-property><br><br>  <managed-property><br>    <property-name>password</property-name><br>    <value>secret</value><br>  </managed-property><br></managed-bean></p></td></tr></tbody> </table> <p>  faces-config.xml˜q™æ®µé…ç½®å…¶å®žæ˜¯å°†"me"赋值给nameåQŒå°†secret赋值给passwordåQŒè¿™æ˜¯é‡‡å?a target="_blank"><u>Ioc模式中的Setter注射方式</u></a>ã€?/p> <p><strong>Backing Beans</strong></p> <p>  对于一个web formåQŒæˆ‘们可以ä‹É用一个bean包含其涉及的所有组ä»Óž¼Œ˜q™ä¸ªbeanž®Þq§°ä¸ºBacking BeanåQ?Backing Bean的优ç‚ÒŽ˜¯åQšä¸€ä¸ªå•个类可以ž®è£…相关一¾pÕdˆ—功能的数据和逻辑ã€?/p> <p>  说白了,ž®±æ˜¯ä¸€ä¸ªJavabean里包含其他JavabeanåQŒäº’相调用,属于Facade模式或Adapter模式ã€?/p> <p><br>  对于一个Backing Beans来说åQŒå…¶ä¸­åŒ…含了几个managed-beanåQŒmanaged-bean一定是有scope的,那么˜q™å…¶ä¸­çš„几个managed-beans如何配置它们的scope呢?</p> <table bgcolor="#cccccc" border="0" width="90%"> <tbody> <tr> <td><managed-bean><br>  ...<br>  <managed-property><br>    <property-name>visit</property-name><br>    <value>#{sessionScope.visit}</value><br>  </managed-property><br></td></tr></tbody> </table> <p>  ˜q™é‡Œé…ç½®äº†ä¸€ä¸ªBacking Beans中有一个setVisitæ–ÒŽ³•åQŒå°†˜q™ä¸ªvisit赋å€égØ“session中的visitåQŒè¿™æ ·ä»¥åŽåœ¨½E‹åºä¸­æˆ‘们只½Ž¡è®¿é—®visit对象åQŒä»Žä¸­èŽ·å? 我们希望的数据(如用æˆïL™»é™†æ³¨å†Œä¿¡æ¯ï¼‰åQŒè€Œvisit是保存在session˜q˜æ˜¯application或request只需要配¾|®æ—¢å¯ã€?/p> <p><strong>UI界面</strong></p> <p>  JSFå’ŒStrutsä¸€æ øP¼Œé™¤äº†JavaBeans¾cÖM¹‹å¤–,˜q˜æœ‰™åµé¢è¡¨çŽ°å…ƒç´ åQŒéƒ½æ˜¯æ˜¯ä½¿ç”¨æ ‡ç­¾å®Œæˆçš„,Struts也提供了struts-faces.tld标签库向JSF˜q‡æ¸¡ã€?/p> <p>  使用Struts标签库编½E‹å¤æ‚页面时åQŒä¸€ä¸ªæœ€å¤§é—®é¢˜æ˜¯ä¼šå¤§é‡ä‹É用logic标签åQŒè¿™ä¸ªlogic如同if语句åQŒä¸€æ—¦å†™èµäh¥åQŒæžçš„JSP™åµé¢è±¡ä¿„¾|—æ–¯æ–¹å—ä¸€æ øP¼Œä½†æ˜¯ä½¿ç”¨JSF标签ž®Þq®€‹zä¼˜¾ŸŽï¼š</p> <table bgcolor="#cccccc" border="0" width="90%"> <tbody> <tr> <td> <p><jia:navigatorItem name="inbox" label="InBox"<br>  icon="/images/inbox.gif"<br>  action="inbox"<br>  disabled="#{!authenticationBean.inboxAuthorized}"/><br></p></td></tr></tbody> </table> <p>  如果authenticationBean中inboxAuthorized˜q”回是假åQŒé‚£ä¹ˆè¿™ä¸€è¡Œæ ‡½{‘Ö°±ä¸ç”¨æ˜„¡¤ºåQŒå¤šòq²å‡€åˆ©çƒ¦åQ?/p> <p>  先写到这里,我会¾l§ç®‹å¯¹JSF深入比较下去åQŒå¦‚果研½I¶è¿‡Jdon框架的ähåQŒå¯èƒ½ä¼šå‘现åQŒJdon框架的jdonframework.xmlä¸? service配置和managed-bean一样都使用了依赖注ž®„,看来对Javabean的依赖注ž®„å·²¾lè¿…é€Ÿåœ°æˆäØ“ä¸€¿Uæ–°æŠ€æœ¯è±¡å¾ï¼Œå¦‚果你还不了è§? Ioc模式åQŒèµ¶ç´§è¡¥è¯¾ã€?/p> <p>附Jsf核心教程一个JSF案例:<a target="_blank"><u>login.rar</u></a></p> <img src ="http://www.aygfsteel.com/svg_007/aggbug/18770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/svg_007/" target="_blank">svg_007</a> 2005-11-08 14:35 <a href="http://www.aygfsteel.com/svg_007/archive/2005/11/08/18770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>轻量¾U§å®¹å™¨çš„æ¯”较åQˆSpring FrameworkåQŒHiveMindåQŒPicoContaineråQ‰ï¼ˆè½¬è„“åQ?/title><link>http://www.aygfsteel.com/svg_007/archive/2005/10/23/16483.html</link><dc:creator>svg_007</dc:creator><author>svg_007</author><pubDate>Sun, 23 Oct 2005 08:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/svg_007/archive/2005/10/23/16483.html</guid><wfw:comment>http://www.aygfsteel.com/svg_007/comments/16483.html</wfw:comment><comments>http://www.aygfsteel.com/svg_007/archive/2005/10/23/16483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/svg_007/comments/commentRss/16483.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/svg_007/services/trackbacks/16483.html</trackback:ping><description><![CDATA[轻量¾U§å®¹å™¨å¯ä»¥åŠ¨æ€åœ°ä½¿ç³»¾lŸä¸»è¦ç»„件之间的耦合变松散。不同的容器包含相同的设计模式,但却å…ähœ‰æ ÒŽœ¬ä¸åŒçš„哲学。本文帮助您在下列三¿Uè½»é‡çñ”容器之间作出最佳选择åQšSpring Framework、HiveMind å’?PicoContainerã€?br> <p>2002 òq´åœ¨¿U‘罗拉多的一‹Æ¡æ—…行中åQŒæˆ‘完美地感受了阿肯色河。在三段不同的漂‹¹ä¸­åQŒè¿™æ¡æ²³å±•示了ä×o人惊异的多样性。柔¾ŸŽçš„布朗峡谷有着开阔的急流åQŒç¿»æ»šç€å·¨å¤§çš„æ‡L ‹¹ªã€‚Royal Gorge 别具特色的悬崖峭壁引导着巨大而笔直的峡谷之下的水力,在这条直¾U¿ä¸Šå‘生一点小闪失都会受到镉K€”游泳的惩罚。Numbers å…ähœ‰¾_‘Ö¯†çš„落差,需要äh们在范围狭窄的圆矌™Š±å›­é‡Œ¾_„¡¡®æ“çºµã€‚在一条河里,我有了三‹Æ¡æžä¸ç›¸åŒçš„体验ã€?/p> <p>在我的上一½‹‡æ–‡ç« â€?a ><font color="#5c81a7">轻量¾U§å¼€å‘的成功¿U˜è¯€åQŒç¬¬ 3 部分åQšSpring 露出水面</font></a>”中åQŒæˆ‘们学习了轻量¾U§å®¹å™¨çš„基本原理。本文将向您展示三种最‹¹è¡Œçš„容器:</p> <ul> <li><a ><b><font color="#5c81a7">Spring Framework</font></b></a> å…ähœ‰åŠŸèƒ½é½å…¨çš„å®¹å™¨ã€é¢å‘æ–¹é¢ç¼–½E?(AOP) 模型和企业开发所需的所有集成代码ã€? </li><li><a ><b><font color="#996699">HiveMind</font></b></a> 凸™‡ª <a ><font color="#996699">Jakarta Tapestry</font></a> çš„åˆ›å»ø™€…之手,它允许您ä¸?bean 或比较大的组ä»Óž¼ˆ¿UîC¹‹ä¸?<i>模块</i>åQ‰æ‰§è¡Œä¾èµ–注入ã€? </li><li><a ><b><font color="#5c81a7">PicoContainer</font></b></a> 是最ž®çš„轻量¾U§å®¹å™¨ï¼Œåªæ”¯æŒ?Javaâ„?技术风格配¾|®ï¼Œè€Œä¸æ”¯æŒ XML 配置ã€?/li> </ul> <p>˜q™ä¸‰¿Uå®¹å™¨éƒ½æºäºŽä¾èµ–注入åQŒä½†æ¯ç§å®¹å™¨éƒ½å…·æœ‰æžä¸ç›¸åŒçš„特征。当我介¾læ¯¿Uå®¹å™¨çš„高çñ”描述æ—Óž¼Œæ‚¨å°†çœ‹åˆ°æ­£åœ¨˜qè¡Œçš„æ¯¿Uæ¡†æžÓž¼Œä»¥åŠå¯ä»¥åº”用每种框架的环境ã€?/p> <p><a name="IDAFDUYB"><span id="wmqeeuq" class="atitle"><font face="Arial" size="4">核心哲学</font></span></a></p> <p>˜q™ä¸‰¿Uå®¹å™¨éƒ½æŽ¥å— POJO (plain old Java object)åQŒéƒ½å…ähœ‰å¯¹è±¡ç”Ÿå‘½å‘¨æœŸçš„钩子(所以它们可以在创徏或销æ¯?bean 时调用您的代码)åQŒéƒ½æ‰§è¡Œä¾èµ–æ³¨å…¥ã€‚æ‚¨å¯èƒ½è®¤äØ“˜q™äº›ä¸ÀL—‹å¾‹å°†å¯ÆD‡´ç›æ€¼¼çš„å®¹å™¨ï¼Œä½†äº‹å®žåÆˆéžå¦‚æ­¤ã€‚å°½½Ž¡æ¤å…¥æ¯¿Uå®¹å™¨çš„ä»£ç å¯èƒ½ç›æ€¼¼åQŒä½†å®¹å™¨æœ¬èín反映了不同的èƒ? 力、风格和整体哲学。总而言之,每种容器的作者都忠于他们的哲学ã€?/p> <p><a name="IDALDUYB"><span id="wmqeeuq" class="smalltitle"><strong><font face="Arial">Spring Framework</font></strong></span></a></p> <p>ä½œäØ“å¼€æ”¾æºç æ¡†æž¶çš„ GenevaåQŒSpring Framework 为数百个 Java 2 Platform, Enterprise Edition (J2EE) API 和开放源码框架提供了轻量¾U§å®¹å™¨å’Œèƒ¶æ°´ä»£ç  (glue code)。Spring 有一个最重要的前景:è®? J2EE 更易使用。读完一些示例和书籍之后åQŒæ‚¨ž®†çœ‹åˆîC¸€äº›å¸¸è§çš„主题åQ?</p> <ul> <li>Spring 支持三种依赖注入—â€?i>setter</i>ã€?i>构造函æ•?/i> å’?<i>æ–ÒŽ³•</i> 注入——但æ€Èš„来说åQŒæœ€‹¹è¡Œçš„æ¨¡åž‹æ˜¯ setter 注入ã€? </li><li>在灵‹zÀL€§å’Œ½Ž€å•性之é—ß_¼ŒSpring çš?XML 风格配置更重视灵‹zÀL€§ã€‚您可以做ä“Q何事情,但对于初学者来è¯ß_¼Œé…ç½®æ–‡äšg是晦涩难懂的ã€? </li><li>Spring 的创始ähè®¤äØ“åQŒå®¹å™¨åªæ˜¯æ•´ä½“框架的一ž®éƒ¨åˆ†ã€‚Spring 的大部分价值来源于支持该框架的数千行胶水代码。它易于插入ä»ÖM½•¾pȝ»Ÿä¸­ã€? </li><li>Spring 框架是三¿Uå®¹å™¨å®žçŽîC¸­æœ€å®Œç¾Žçš„。一般来è¯ß_¼Œä¼˜ç§€çš„æ–‡æ¡£éƒ½æ˜¯å®Œ¾ŸŽç¼–写的ã€? </li><li>Spring å…ähœ‰è‡ªåЍ˜qžçº¿ (autowire) 方式åQŒä½†å¤§å¤šæ•°ç¤ºä¾‹éƒ½æ²¡æœ‰ä½¿ç”¨å®ƒã€‚我òq¶ä¸ååˆ†äº†è§£˜q™ä¸ªå†³ç­–åQŒä½†æœ‰æ—¶å€™ï¼Œèƒ½å¤Ÿçœ‹åˆ°æ˜Žç¡®åˆ—出的依赖关¾pÀL˜¯ä¸é”™çš„ã€? </li><li>Spring 提供了完整的 AOP 框架åQŒä‹Éå¾—æ›´å®ÒŽ˜“附加服务。您可以使用 Spring 自己的框架或依赖丰富çš?AspectJ 集成åQˆå‚é˜?<a ><font color="#996699">参考资æ–?/font></a>åQ‰ã€?/li> </ul> <p>如果要用一个短语来形容 SpringåQŒæˆ‘会说<i>让企业更å¼?/i>ã€?/p> <p><a name="IDAIEUYB"><span id="wmqeeuq" class="smalltitle"><strong><font face="Arial">HiveMind</font></strong></span></a></p> <p>Howard Lewis Ship æ˜?Jakarta Tapestry Web æ¡†æž¶çš„åˆ›å»ø™€…,他还创徏äº? HiveMind。作ä¸ÞZ¸€ä¸ªå®¹å™¨ï¼ŒHiveMind 是灵巧、干净且易于ä‹Éç”¨çš„ã€‚ä¸Žå…¶ä»–è®¸å¤šè¾ƒå¥½çš„å¼€æ”¾æºç æ¡†æž¶ä¸€æ øP¼ŒShip 创徏 HiveMind æ˜¯äØ“äº†è®©å®ƒå¸®åŠ©è§£å†³çŽ°å®žé—®é¢˜ã€‚ä½†æ˜¯ï¼ŒHiveMind 向传¾lŸçš„轻量¾U§å®¹å™¨æ·»åŠ äº†ä¸¤ä¸ªåˆ›æ–°åQ?/p> <ul> <li>最重要çš?HiveMind 创新是模块。据 Ship 所è¯ß_¼ŒEclipse 插äšg‹È€å‘了他的 HiveMind 模块的灵感ã€? </li><li>HiveMind 强制您编写接口。(与所有轻量çñ”å®¹å™¨ä¸€æ øP¼Œå®ƒä¸æä¾›æŽ¥å£åQŒè€Œç”±æ‚¨è‡ªå·±æä¾›æŽ¥å£ã€‚) </li><li>HiveMind 是用户友好的åQŒå®ƒæä¾›¿UîCØ“ HiveDoc çš„æ–‡æ¡£å·¥å…øP¼Œå‹å¥½½Ž€æ˜Žçš„ XML 配置åQŒä»¥åŠè¡Œå‡†ç¡®çš„错误报告ã€? </li><li>HiveMind 用户通常优先选择 setter 注入åQŒä½†è¯¥å®¹å™¨è¿˜æ”¯æŒæž„造函数注入ã€?/li> </ul> <p>如果用一个短语来形容 HiveMind 的话åQŒæˆ‘会说它是<i>概念正确</i> çš„ã€?/p> <p><a name="IDAXEUYB"><span id="wmqeeuq" class="smalltitle"><strong><font face="Arial">PicoContainer</font></strong></span></a></p> <p>åˆ°ç›®å‰äØ“æ­¢ï¼ŒPicoContainer 最重要的特征是它的ž®ºå¯¸ã€‚它没有提供许多附加物,但它å…ähœ‰å®Œæ•´çš„依赖注入容器。PicoContainer ˜q˜å…·æœ‰ä¸€äº›æƒŸä¸€ç‰ÒŽ€§ï¼š</p> <ul> <li>PicoContainer 很小åQŒæ‰€ä»¥å®ƒæ²¡æœ‰æ‹¦æˆªå™¨ã€AOP 或相似类型的服务åQŒè€Œé€‰æ‹©äº†è®©å…¶ä»–框架创徏˜q™äº›æœåŠ¡ã€? </li><li>PicoContainer 支持 Java 配置技术,而不支持 XML 配置技术,˜q™ä¸Žå…¶ä»–容器一栗÷€? </li><li>PicoContainer ‹¹è¡Œçš„ä‹É用模型是构造函数注入,但它也支æŒ?setter 注入ã€? </li><li>PicoContainer 没有提供许多文档åQŒè€Œä¸”一些现有文档是不完整的åQŒä½†æ‚¨ä¸ä¼šå¤ªéœ€è¦ã€? </li><li>PicoContainer å…ähœ‰ä¸€ä¸ªè‡ªåŠ¨è¿ž¾U¿æ–¹å¼ï¼Œå®ƒå¾ˆä¸é”™ã€? </li><li>PicoContainer 的发展似乎有点停滞ã€?/li> </ul> <p>如果用一个短语来形容 PicoContainer 的话åQŒæˆ‘会选择<i>理论完美åQŒä½†ä¸å¦‚ Spring æˆ?HiveMind 实用</i>ã€?/p> <br> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td><img alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" width="100%"></td></tr></tbody> </table> <table class="no-print" align="right" cellpadding="0" cellspacing="0"> <tbody> <tr align="right"> <td> <table border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td valign="center"><img alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" width="16"><br></td> <td align="right" valign="top"><a class="fbox" ><b><font color="#996699">回页é¦?/font></b></a></td></tr></tbody></table></td></tr></tbody> </table> <br> <br> <p><a name="IDAIFUYB"><span id="wmqeeuq" class="atitle"><font face="Arial" size="4">¾~–程模型</font></span></a></p> <p>现在我将向您展示½C‘ÖŒºä¸­æµè¡Œçš„¾~–程½CÞZ¾‹åQŒä»¥å¸®åŠ©æ‚¨æ›´å¥½åœ°ç†è§£å®¹å™¨çš„ä½œè€…å¸Œæœ›æ‚¨å¦‚ä½•ä½¿ç”¨å®ƒä»¬ã€‚æˆ‘ä½¿ç”¨ PicoContainer 中的 Kiss ½CÞZ¾‹æ¥å±•½C?autowiring å’?Java 技术风格的配置åQŒä‹Éç”?HiveMind 加法器示例来展示模块能力åQŒä‹Éç”?Spring PetClinic 应用½E‹åºæ¥å±•½C?Hibernate 集成ã€?/p> <p><a name="IDAOFUYB"><span id="wmqeeuq" class="smalltitle"><strong><font face="Arial">Kiss ½CÞZ¾‹ (PicoContainer)</font></strong></span></a></p> <p>在这三个容器中,PicoContainer å…ähœ‰æœ€½Ž€å•çš„¾~–程模型。要查看 Kiss ½CÞZ¾‹åQŒå¯ä»?<a ><font color="#5c81a7">PicoContainer.org</font></a> 下蝲它。安装该½CÞZ¾‹åQŒæµè§ˆåˆ° docs\Two+minute+tutorial.htmåQŒç„¶åŽæ‚¨ä¼šçœ‹åˆîC¸¤ä¸ªç»„ä»Óž¼š</p> <br> <a name="IDA2FUYB"><b>清单 1. 两个 Kiss ¾l„äšg</b></a><br> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td><pre><code class="section"><br><font face="Lucida Console">public class Boy {<br> public void kiss(Object kisser) {<br> System.out.println("I was kissed by " + kisser);<br> }<br>}<br>public class Girl {<br> Boy boy;<br><br> public Girl(Boy boy) {<br> this.boy = boy;<br> }<br><br> public void kissSomeone() {<br> boy.kiss(this);<br> }<br>}<br></font></code></pre></td></tr></tbody> </table> <br> <p>˜q™ä¸¤ä¸ªç±»æ˜¯è‡ªè§£é‡Šçš„。Girl å¯?Boy 有依赖关¾p…R€‚该依赖关系ž®†é€šè¿‡æž„造函数被注入。先实例化一个容器:</p> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td><pre><code class="section"><br><font face="Lucida Console">MutablePicoContainer pico = new DefaultPicoContainer();<br></font></code></pre></td></tr></tbody> </table> <br> <p>然后注册两个¾l„äšgåQ?/p> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td><pre><code class="section"><br><font face="Lucida Console">pico.registerComponentImplementation(Boy.class);<br>pico.registerComponentImplementation(Girl.class);<br></font></code></pre></td></tr></tbody> </table> <br> <p>½EåŽæ‚¨å¯ä»¥å‘ PicoContainer è¯äh±‚一个对象,然后操作它:</p> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td><pre><code class="section"><br><font face="Lucida Console">Girl girl = (Girl) pico.getComponentInstance(Girl.class);<br>girl.kissSomeone();<br></font></code></pre></td></tr></tbody> </table> <br> <p>˜q™æ ·ž®±å·®ä¸å¤šäº†ã€‚ç¼–½E‹æ¨¡åž‹æ˜¯ä¼˜é›…的,åŸÞZºŽæž„造函数的风格意味着您无需包括无参构造函数。对本例中的 Girl 调用˜q™ç§å‡½æ•°ž®†ä¼šä½¿è¯¥å¯¹è±¡å¤„äºŽä¸ä¸€è‡´çš„çŠ¶æ€ï¼Œå› äØ“ <code>kiss</code> æ–ÒŽ³•ž®†æŠ›å‡ºå¼‚常ã€?/p> <p><a name="IDAXGUYB"><span id="wmqeeuq" class="smalltitle"><strong><font face="Arial">加法器示ä¾?(HiveMind)</font></strong></span></a></p> <p>现在åQŒè®©æˆ‘们看一ä¸?HiveMind 的编½E‹ç¤ºä¾‹ã€‚从 <a ><font color="#996699">Apache Jakarta Project</font></a> 下蝲 HiveMindåQŒç„¶åŽæŸ¥çœ‹åŠ æ³•å™¨½CÞZ¾‹ã€‚您会看到接口和实现。(è®îC½åQšHiveMind 强制¾~–写接口。)</p> <br> <a name="IDAFHUYB"><b>清单 2. 加法器示例接口和实现</b></a><br> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td><pre><code class="section"><br><font face="Lucida Console">public interface Adder<br>{<br> public double add(double arg0, double arg1);<br>}<br><br>public class AdderImpl implements Adder<br>{<br> public double add(double arg0, double arg1)<br> {<br> return arg0 + arg1;<br> }<br>}<br></font></code></pre></td></tr></tbody> </table> <br> <p>ž®†è¯¥æœåŠ¡æš´éœ²åœ?XML æ–‡äšg中,如下所½Cºï¼š</p> <br> <a name="IDAPHUYB"><b>清单 3. ž®†è¯¥æœåŠ¡æš´éœ²åœ?XML æ–‡äšgä¸?/b></a><br> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td><pre><code class="section"><br><font face="Lucida Console"><module id="examples" version="1.0.0"><br><br> <service-point id="Adder"<br> interface="org.apache.hivemind.examples.Adder"><br><br> <create-instance<br> class="org.apache.hivemind.examples.impl.AdderImpl"/><br><br> </service-point><br></module><br></font></code></pre></td></tr></tbody> </table> <br> <p>然后åQŒå…¶ä»–应用程序就可以使用该服务了åQŒå¦‚下所½Cºï¼š</p> <br> <a name="IDAZHUYB"><b>清单 4. 其他应用½E‹åºå¯ä»¥ä½¿ç”¨è¯¥æœåŠ?/b></a><br> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td><pre><code class="section"><br><font face="Lucida Console">Registry registry = RegistryBuilder.constructDefaultRegistry();<br> <br>Adder adder = (Adder) registry.getService("examples.Adder",<br> Adder.class);<br><br>... adder.add(arg0, arg1)<br></font></code></pre></td></tr></tbody> </table> <br> <p>注意åQŒHiveMind 的模块让您可以将多个服务¾l„合åˆîC¸€èµ—÷€‚如果您需要向容器中的服务æ·ÕdŠ åŠŸèƒ½åQŒå¯ä»¥ä‹É用拦截器åQ?/p> <br> <a name="IDAGA4YB"><b>清单 5. 使用拦截器添加功èƒ?/b></a><br> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td><pre><code class="section"><br><font face="Lucida Console"><module id="examples" version="1.0.0"><br> <service-point id="Adder"<br> interface="org.apache.hivemind.examples.Adder"><br><br> <create-instance<br> class="org.apache.hivemind.examples.impl.AdderImpl"/><br><br> <interceptor service-id="hivemind.LoggingInterceptor"/><br> </service-point><br></module><br></font></code></pre></td></tr></tbody> </table> <br> <p><a name="IDAMA4YB"><span id="wmqeeuq" class="smalltitle"><strong><font face="Arial">PetClinic 应用½E‹åº (Spring)</font></strong></span></a></p> <p>Spring 处理事情的方法有些不同。因ä¸?Spring 框架不带有简单的应用½E‹åºåQŒæˆ‘从我的书¾c?<i>Spring: A Developer's Notebook</i> 中选择了一个。您可以ä»?<a ><font color="#5c81a7">O'Reilly Media</font></a> 获取该示例代码。解压示ä¾?4åQŒå®ƒå±•示了一个用äº?RentaBike 商店的带有属性的 <code>CommandLineView</code> 对象åQŒè¯¥å¯¹è±¡æœ€¾lˆæˆä¸ø™¯¥åº”用½E‹åºçš„æ•°æ®è®¿é—®å¯¹è±¡ã€?/p> <br> <a name="IDAAB4YB"><b>清单 6. CommandLineView 对象</b></a><br> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td><pre><code class="section"><br><font face="Lucida Console">public class CommandLineView {<br> private RentABike rentaBike;<br> public CommandLineView() {}<br> public void setRentABike(RentABike rentaBike) {this.rentaBike = rentaBike;}<br> public RentABike getRentaBike() { return this.rentaBike; }<br>...<br>}<br><br></font></code></pre></td></tr></tbody> </table> <br> <p>RentaBike 是具有您希望在自行èžR商店对象中看到的各种æ–ÒŽ³•的接口:</p> <br> <a name="IDAOB4YB"><b>清单 7. 接口æ–ÒŽ³•</b></a><br> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td><pre><code class="section"><br><font face="Lucida Console">public interface RentABike { <br> List getBikes(); <br> Bike getBike(String serialNo); <br> void setStoreName(String name); <br> String getStoreName();<br>}<br></font></code></pre></td></tr></tbody> </table> <br> <p>没有昄¡¤º <code>ArrayListBikeStore</code>åQŒå®ƒæ˜?BikeStore 接口的存根实现。注意,Spring 允许¾~–写接口åQŒä½†ä¸å¼ºåˆ¶ç¼–写接口。下面是描述该应用程序中 bean çš?XML 配置文äšgåQ?/p> <br> <a name="IDA3B4YB"><b>清单 8. 描述应用½E‹åº bean çš?XML 配置文äšg</b></a><br> <table bgcolor="#eeeeee" border="1" cellpadding="5" cellspacing="0" width="100%"> <tbody> <tr> <td><pre><code class="section"><br><font face="Lucida Console"><beans><br> <bean id="rentaBike" class="com.springbook.ArrayListRentABike"><br> <property name="storeName"><value>Bruce's Bikes</value></property><br> </bean><br> <bean id="commandLineView" class="com.springbook.CommandLineView"><br> <property name="rentaBike"><br> <ref bean="rentaBike" /> <br> </property><br> </bean><br></beans><br></font></code></pre></td></tr></tbody> </table> <br> <p>该上下文中有两个 beanã€?code>commandLineView</code> bean 依赖äº?<code>rentaBike</code> bean。该应用½E‹åºé€šè¿‡ä¸?<code>rentaBike</code> 属性指å®?<code>rentaBike</code> 名称åQŒæ˜¾å¼è§£æžè¯¥ä¾èµ–关系。注意,PicoContainer 自动˜qžæŽ¥˜q™ç§æ˜‘Ö¼å…³ç³»åQŒSpring 也可以,但大多数用户不ä‹É用它的自动连¾U‰K€‰é¡¹ã€‚Spring ˜q˜å…è®¸æ‚¨é€šè¿‡æ‹¦æˆªå™¨æˆ– AOP 向外观的ä»ÖM½•æ–ÒŽ³•æ·ÕdŠ æœåŠ¡ã€?/p> <br> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td><img alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" width="100%"></td></tr></tbody> </table> <table class="no-print" align="right" cellpadding="0" cellspacing="0"> <tbody> <tr align="right"> <td> <table border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td valign="center"><img alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" width="16"><br></td> <td align="right" valign="top"><a class="fbox" ><b><font color="#996699">回页é¦?/font></b></a></td></tr></tbody></table></td></tr></tbody> </table> <br> <br> <p><a name="IDAVC4YB"><span id="wmqeeuq" class="atitle"><font face="Arial" size="4">比较</font></span></a></p> <p>既然已经看到每种容器的哲学,下面是对每种环境的无形特性的详细比较åQŒæ¯”如市åœÞZ†¾é¢ã€æ•´ä½“质量(fit and finishåQ‰å’Œæ•´ä½“ç‰ÒŽ€§åˆ—表。毕竟,即ä‹É¾~–程模型是完¾ŸŽçš„åQŒä½†å¦‚果没有文档åQŒæˆ–è€…ç”±äºŽç¼ºä¹ç¤¾åŒø™€Œæ‚¨å¿…é¡»è‡ªå·±æ”¯æŒå®ƒï¼Œé‚£ä¹ˆå®ƒä¹Ÿä¸ä¼šæˆäØ“ä¸€ä¸ªå¥½å®¹å™¨ã€?/p> <p><a name="IDA1C4YB"><span id="wmqeeuq" class="smalltitle"><strong><font face="Arial">‹zÕdЍ½C‘ÖŒº</font></strong></span></a></p> <p>Spring 有一个充满活力的½C‘ÖŒºåQŒå’Œä¸€ä¸ªæ”¯æŒè¯¥æ¡†æž¶çš„ç§°ä¸?<a ><font color="#5c81a7">Interface21</font></a> çš„èŒä¸šæœåŠ¡å…¬å¸ã€‚è¿™å¾ˆé‡è¦ï¼Œå› äØ“æ‚¨çŸ¥é“æ‚¨å¯ä»¥èŽ·å¾—è‰¯å¥½çš„æ”¯æŒï¼Œå…¬å¸æ‰æœ‰åŠ¨åŠ›æ¥æ”¯æŒ?Spring 框架。我在社区的¾låކ½Ž€ç›´å¤ª¾ŸŽå¥½äº†ã€‚Spring 贡献者、创始äh和用户都以杰出的内容填满了留­a€æÑ€?/p> <p>HiveMind 框架是一ä¸?Apache Jakarta ™å¹ç›®åQŒæ‰€ä»¥æœ‰ç€æ‰Žå®žçš„基¼‹€ã€‚它有一个正在成长的萌芽½C‘ÖŒºã€‚该框架的创始äh Howard Lewis Ship 是独立顾问、优¿U€å¯¼å¸ˆå’Œä¸å±ˆä¸æŒ çš„æå€¡è€…。但是,要利ç”?HiveMind 的质量帮助或者查扑օ¶ Web 站点之外的内容仍然十分困难。尽½Ž¡å¦‚此,它的在线帮助ä¼ég¹Žä¸é”™åQŒè€Œä¸”½C‘ÖŒºä¼ég¹Žæ­£åœ¨æˆé•¿ã€‚Hibernate 获得了有­‘£çš„胜利åQŒå®ƒè¢«é€‰ä¸­â€”—或者更应该è¯ß_¼ŒShip 被选中——组æˆ?TheServerSide.com 的新基础设施åQŒTheServerSide.com 是最重要çš?Java 技术社åŒÞZ¹‹ä¸€ã€?/p> <p>PicoContainer 也是一ä¸?Apache Jakarta ™å¹ç›®åQŒå®ƒä¼ég¹Žå‘展¾~“慢。截止本文撰½E¿ï¼ŒPicoContainer 的最后一‹Æ¡ä¸»è¦ä»£ç å‘行是åœ?2004 òq?11 月。您看不到太多有å…?PicoContainer 的新文章åQŒè¿™æœ‰ç‚¹æƒ­æ„§åQŒå› ä¸ºæˆ‘喜欢 PicoContainer 的一些哲学。事实上åQŒæˆ‘不太¼‹®å®šæœ‰æ²¡æœ‰ä¸‰¿Uå¼€æ”¾æºç è½»é‡çñ”容器的空é—ß_¼Œž®¤å…¶æ˜¯æœ€˜q‘第四种轻量¾U§å®¹å™¨é¡¹ç›?Avalon 关闭之后ã€?/p> <p>ž®±æ¯ä¸ªç¤¾åŒºç”Ÿæˆçš„‹zÕdŠ¨è€Œè¨€åQŒSpring 无疑是优胜者。Interface21 的支持、奇思妙想的论坛、活跃的邮äšg列表以及½C‘ÖŒºçš„è·Ÿítªè®°å½•都是无与äëu比的ã€?/p> <p><a name="IDAJD4YB"><span id="wmqeeuq" class="smalltitle"><strong><font face="Arial">整体质量</font></strong></span></a></p> <p>½C‘ÖŒºçš„大ž®å’Œå®žåŠ›é€šå¸¸é©±åŠ¨å¼€æ”¾æºç é¡¹ç›®çš„æ•´ä½“è´¨é‡ã€‚å……æ»¡æ´»åŠ›çš„½C‘ÖŒºéœ€è¦æ›´å¥½çš„æ–‡æ¡£å’Œç¤ºä¾‹ï¼Œè€Œä¸”它们会参与完成结ž®„¡š„详细信息ã€?/p> <p>Spring 团队¾~–写了可与我见过的一些比较好的商业äñ”品相媲美的文档。如果这˜q˜ä¸å¤Ÿçš„话,您还可以扑ֈ°è‡›_°‘五本主要 Spring 书籍和其他许多包å?Spring 内容的出版物。(我自己曾撰写˜q‡ä¸¤æœ¬æœ‰å…?Spring 的书¾cï¼Œå…¶ä¸­ä¸€æœ¬ä¹¦ä¸­åŒ…æ‹?Jolt-winning <i>Better, Faster, Lighter Java</i> 一章,另一本是快速入门书¾c?<i>Spring: A Developer's Notebook</i>åQ‰ã€‚错误消息是专业性和描述性的。与½W¬ä¸‰æ–ÒŽ¡†æž¶å’Œ API 的集成是所æœ?Java 技术框架中最好的。包装是¾lè¿‡æ·±æ€ç†Ÿè™‘çš„åQŒä¸˜q‡ç•¥æœ‰å¤šä½™ã€‚(它帮助我开始把一些比较小的项目划分成模块。)½CÞZ¾‹æ˜¯ä¼˜¿U€ä¸”有指导意义的ã€?/p> <p>ä¸?Tapestry ä¸€æ øP¼ŒHiveMind 也具有好的整体质量。Ship 自己以那些让 HiveMind 变得½Ž€å•易用的ç‰ÒŽ€§è€Œè‡ªè±ªï¼Œæ¯”如行准¼‹®çš„错误报告åQ›å‹å¥½ç®€æ˜Žçš„ XML 语法åQ›è‰¯å¥½çš„æ–‡æ¡£å·¥å…· HiveDoc。与用于低çñ”详细信息çš?JavaDoc 文档¾l“合使用åQŒæ‚¨å¯ä»¥æ›´å¥½åœ°æ˜q°æ‚¨çš„应用程序(HiveMind 模块åQ‰çš„高çñ”ç‰ÒŽ€§ï¼Œä»Žè€Œå®Œå–„它们之间的依赖关系ã€?/p> <p>PicoContainer ¾~–程模型感觉自然åQŒä½†æ–‡æ¡£ä¸å®Œæ•ß_¼ˆè®¸å¤šæ–ÒŽ³•标记看è“v来过时好几个月了åQ‰ï¼Œè€Œä¸”没有许多使用该容器的真实世界½CÞZ¾‹ã€‚有时候,我会觉得自己在独自穿˜q‡é¬¼™ì‚出没的破屋ã€?/p> <p>但ä‹Éç”?PicoContainer ¼‹®å®žæœ‰ä¸€ä¸ªä¸»è¦ä¼˜ç‚V€‚因为您配置现实世界的对象时åQŒä¼šå¾—到一些编译时错误‹‚€æŸ¥ã€‚实际上åQŒè¯¥å®¹å™¨å¤ªå°å¤ªè½»äº†ï¼Œä»¥è‡³äºŽé™¤äº†åŸºæœ¬é…¾|®ä¹‹å¤–,没有什么能出错。PicoContainer 做了一™å¹åˆç†çš„工作ã€?/p> <p><a name="IDAYD4YB"><span id="wmqeeuq" class="smalltitle"><strong><font face="Arial">ç‰ÒŽ€?/font></strong></span></a></p> <p>我不惌™¿‡å¤šåœ°è®¨è®ºç‰ÒŽ€§ã€‚如果您正在å¯ÀL‰¾è®¸å¤šèƒ¶æ°´ä»£ç æ¥å‡ž®‘您的开放源码收藏夹的集成或某特å®?J2EE APIåQŒSpring 无疑是最佳选择。HiveMind 不尝试参与竞争。相反,它与 Spring 的服务兼宏V€‚PicoContainer ä¸æž„å»ø™€Œä¸”也不ž®è¯•æž„å¾é™„åŠ ç‰©ï¼Œè€Œæ˜¯é€‰æ‹©è®©å¼€æ”¾æºç é¡¹ç›®äØ“å…¶æä¾›æœåŠ¡ã€‚åˆ°ç›®å‰ä¸ºæ­¢åQŒå®ƒçš„æ•ˆæžœä¸å¤ªå¥½ã€?/p> <br> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td><img alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" width="100%"></td></tr></tbody> </table> <table class="no-print" align="right" cellpadding="0" cellspacing="0"> <tbody> <tr align="right"> <td> <table border="0" cellpadding="0" cellspacing="0"> <tbody> <tr> <td valign="center"><img alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" width="16"><br></td> <td align="right" valign="top"><a class="fbox" ><b><font color="#996699">回页é¦?/font></b></a></td></tr></tbody></table></td></tr></tbody> </table> <br> <br> <p><a name="IDA4D4YB"><span id="wmqeeuq" class="atitle"><font face="Arial" size="4">哪一个最好?</font></span></a></p> <p>目前åQŒåªæœ‰ä¸€ä¸ªçœŸæ­£çš„½{”案。HiveMind å…ähœ‰æœ‰è¶£çš„创斎ͼŒPicoContainer å…ähœ‰æ˜“于使用的模型(理论上)åQŒä½†½C‘ÖŒºä¼ég¹Žå·²ç»æŠ•票选择äº?Spring Framework。随着旉™—´çš„æŽ¨¿U»ï¼Œæ–°çš„容器可能会成长,HiveMind 可能不断获得市场份额åQŒä½†ç›®å‰åQŒSpring 是您的最佳选择ã€?/p> 如果您愿意冒一些险åQŒè€Œä‹É用不太成熟或不太‹¹è¡Œçš„容器,您可能决定实çŽ?HiveMindåQˆå¦‚果需要模块çñ”别的配置åQ‰æˆ– PicoContaineråQˆå¦‚果想要微ž®çš„容器åQ‰ã€‚如果需要许多胶水代码来集成持久引擎、事务处理策略和安全性等斚w¢åQŒSpring å…ähœ‰æœ€å®Œæ•´çš„组件堆。但误‚®°ä½ï¼šæ‚¨å¯ä»¥åœ¨ HiveMind 容器中ä‹Éç”?Spring ¾l„äšgã€?img src ="http://www.aygfsteel.com/svg_007/aggbug/16483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/svg_007/" target="_blank">svg_007</a> 2005-10-23 16:46 <a href="http://www.aygfsteel.com/svg_007/archive/2005/10/23/16483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>½W¬ä¸€‹Æ¡å‘åQŒè¯•ç”?/title><link>http://www.aygfsteel.com/svg_007/archive/2005/10/10/15109.html</link><dc:creator>svg_007</dc:creator><author>svg_007</author><pubDate>Mon, 10 Oct 2005 02:37:00 GMT</pubDate><guid>http://www.aygfsteel.com/svg_007/archive/2005/10/10/15109.html</guid><wfw:comment>http://www.aygfsteel.com/svg_007/comments/15109.html</wfw:comment><comments>http://www.aygfsteel.com/svg_007/archive/2005/10/10/15109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/svg_007/comments/commentRss/15109.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/svg_007/services/trackbacks/15109.html</trackback:ping><description><![CDATA[˜q™æ˜¯½W¬ä¸€‹Æ¡ä‹É用,试发åQä»¥åŽå°†åœ¨è¿™é‡Œå†™å†™è‡ªå·Þqš„学习Java的经历和心情åQ?img src ="http://www.aygfsteel.com/svg_007/aggbug/15109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/svg_007/" target="_blank">svg_007</a> 2005-10-10 10:37 <a href="http://www.aygfsteel.com/svg_007/archive/2005/10/10/15109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">ÑôÔ­ÏØ</a>| <a href="http://" target="_blank">³¤ÖÎÊÐ</a>| <a href="http://" target="_blank">ÁÉÄþÊ¡</a>| <a href="http://" target="_blank">Ѱµé</a>| <a href="http://" target="_blank">´óÐËÇø</a>| <a href="http://" target="_blank">ÁøºÓÏØ</a>| <a href="http://" target="_blank">²ÔÎàÏØ</a>| <a href="http://" target="_blank">Û²³ÇÏØ</a>| <a href="http://" target="_blank">Å©°²ÏØ</a>| <a href="http://" target="_blank">µÂÇÕÏØ</a>| <a href="http://" target="_blank">±¦ÛæÇø</a>| <a href="http://" target="_blank">ÐÞÎäÏØ</a>| <a href="http://" target="_blank">зáÏØ</a>| <a href="http://" target="_blank">½ð²ýÊÐ</a>| <a href="http://" target="_blank">äü¹ØÏØ</a>| <a href="http://" target="_blank">Èý½­</a>| <a href="http://" target="_blank">ÎÚ³ľÆëÊÐ</a>| <a href="http://" target="_blank">ÂÞÌïÏØ</a>| <a href="http://" target="_blank">ÆÕ¸ñÏØ</a>| <a href="http://" target="_blank">ÐÞÎÄÏØ</a>| <a href="http://" target="_blank">·âÇðÏØ</a>| <a href="http://" target="_blank">Ì©ÖÝÊÐ</a>| <a href="http://" target="_blank">Æ½Ô­ÏØ</a>| <a href="http://" target="_blank">µÂÇåÏØ</a>| <a href="http://" target="_blank">ÒË·áÏØ</a>| <a href="http://" target="_blank">¹óϪÊÐ</a>| <a href="http://" target="_blank">ÄþµÂÊÐ</a>| <a href="http://" target="_blank">º£Â×ÊÐ</a>| <a href="http://" target="_blank">Çø¡£</a>| <a href="http://" target="_blank">ÄÏ¿µÊÐ</a>| <a href="http://" target="_blank">¸·Æ½ÏØ</a>| <a href="http://" target="_blank">³¤É³ÊÐ</a>| <a href="http://" target="_blank">°²¹úÊÐ</a>| <a href="http://" target="_blank">Ñ×ÁêÏØ</a>| <a href="http://" target="_blank">Ê¯ÈªÏØ</a>| <a href="http://" target="_blank">ÎýÁÖ¹ùÀÕÃË</a>| <a href="http://" target="_blank">ͬÈÊÏØ</a>| <a href="http://" target="_blank">ÄÂÀâÊÐ</a>| <a href="http://" target="_blank">ÈýÃ÷ÊÐ</a>| <a href="http://" target="_blank">ÕżҽçÊÐ</a>| <a href="http://" target="_blank">¤ÄÏÊÐ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>