ï»??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 GMT60- web应用å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>æ¥ç»´æŠ¤ï¼Œè¯¥æ–‡ä»¶æ˜¯ä¸€¿UXMLæ ¼å¼çš„æ–‡æœ¬æ–‡ä»¶ã€‚部¾|²æ˜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是一¿UXML文档å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åQmappingå…ƒç´ åˆ°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>