本文ž®†äؓ您æä¾›å…³äºŽSpring MVC框架的酾|®æŠ€å·§ï¼Œä»¥å¸®åŠ©ç®¡ç†åŸºäºŽSpringçš„web应用½E‹åºçš„多个实例。本é…ç½®½Ž¡ç†ä¸»é¢˜å¸¸è¢«å¦æœ¯ç•Œæ‰€å¿½ç•¥åQŒä½†æ˜¯ï¼Œ˜q™å¯¹äºŽçŽ°å®žçš„webå¼€å‘尤为é‡è¦ã€‚本主题òq¶ä¸ç›´æŽ¥å…Œ™”ä»ÖM½•å…·ä½“çš„æŠ€æœ¯ï¼Œå› æ¤åQŒæˆ‘们将从最基本的概念开始对˜q™ä¸ªé—®é¢˜˜q›è¡Œè¯´æ˜Žã€‚下é¢ï¼Œæˆ‘们ž®†æ ¹æ®Spring MVC框架åQŒäØ“åŸÞZºŽæœ¬æŠ€æœ¯å¼€å‘çš„™å¹ç›®æä¾›ä¸€¾pÕdˆ—的解å†Ïx–¹æ¡ˆã€?/p>
Springé…ç½®
  äºÞZ»¬¾l常会在一åîC»¥ä¸Šçš„ä¸ÀLœºä¸Šé…¾|®ä¸€¿UWeb应用½E‹åºã€‚例如,在生产ä¸åQŒä¸€ä¸ªç½‘ç«™å¯èƒ½åªæœ‰ä¸€ä¸ªå®žä¾‹ã€‚除了æ¤å®žä¾‹å¤–,开å‘äh员å¯ä»¥åœ¨ç”¨äºŽå¼€å‘的机器上酾|®å…¶ä»–çš„åQˆå¼€å‘)实例。也å¯ä»¥åœ¨å…¬å¸ï¼ˆæœºæž„åQ‰å†…éƒ¨çš„æœ¬åœ°å¼€å‘æœåŠ¡å™¨ä¸Šç»´æŠ¤å…¶ä»–åº”ç”¨ç¨‹åºè£…¾|®ï¼Œ˜q™å°†è®©æ‚¨å—益匪浅。该实例的目的是使Web设计者å¯ä»¥èŽ·å¾—æœ‰è´¨é‡ä¿è¯çš„ææ–™ï¼Œòq¶äؓ需è¦äؓ应用½E‹åºæä¾›æ–‡äšg资料的ähæä¾›å‡†å…¥ã€?/p>
  大家都知é“,å³ä‹É是最½Ž€å•的场景åQŒä¹Ÿéœ€è¦å®‰è£…ã€é…¾|®å’Œ¾l´æŠ¤ä¸‰ä¸ªå®žä¾‹ã€‚而对于ä½äºŽä¸åŒåœ°ç†ä½¾|®çš„团队æ¥è¯´åQŒè¦ä»Žäº‹˜q™æ ·çš„é¡¹ç›®ä¾¿æ›´åŠ å›°éš¾ã€‚å¯¹äºŽä“Q何䏿˜¯ç‰¹åˆ«ç®€å•çš„Web应用½E‹åº™å¹ç›®åQŒéƒ½éœ€è¦å¤šåå¼€å‘äh员æ¥å®‰è£…™å¹ç›®è£…置和本地设¾|®ä»¥åŠè¿è¡Œå•元测试的装置½{‰ã€?/p>
  很多¾l„织都将自己开å‘的产å“ä½œäØ“Web应用½E‹åºã€‚我们å¯ä»¥åœ¨å¾ˆå¤šäº§å“ä¸å‘现这¿U情况,例如电å商务¾pÈ»Ÿã€?a target="_blank">内容½Ž¡ç†¾pÈ»ŸåQˆCMSåQ‰ï¼Œä»¥åŠåšå®¢å‘布òq›_°½{‰ã€‚è¿™¾cÖMñ”å“å¯åœ¨å¤šä¸ªæœåС噍ä¸è¿›è¡Œéƒ¨¾|ŒÓ€‚对于æˆåŠŸçš„å¤šç”¨é€”Web应用½E‹åºæ¥è¯´åQŒä»–们的开å‘äh员必™å»è¦ä¿è¯ä»–们的应用程åºä¾¿äºŽå®‰è£…,òq¶ä¸”能够与其他Web应用½E‹åºå®Œç¾Žé›†æˆã€‚绘q‡ä¸Š˜q°è®¨è®ÞZ¹‹åŽï¼Œæˆ‘们应该明了åQŒä½œä¸ºæœ¬æ–‡ä¸»é¢˜çš„应用½E‹åºé…置是通用Web应用½E‹åº™å¹ç›®å¼€å‘äh员所需è¦è§£å†³çš„é‡è¦é—®é¢˜ä¹‹ä¸€ã€?/p>
  诸如CVS或Subversion之类的版本控制系¾lŸæ˜¯å¼€å‘组¾l‡ä‹É用的一¿Uæ ‡å‡†å·¥å…—÷€‚è¿™¿U工具代表了一些组¾l‡çš„ä¸å¿ƒæºä»£ç 版本库åQŒå®ƒä»¬è¢«ç”¨äºŽä¿æŒæºä»£ç 的有åºã€‚用户å¯ä»¥è·Ÿítªåº”ç”¨ç¨‹åºæºä»£ç çš„å˜åŒ–,昄¡¤ºä¸åŒç‰ˆæœ¬çš„区别,òq¶å¯ä»¥ç¡®å®šé¡¹ç›®åˆ†æ”¯ã€‚而且åQŒå®ƒä»¬ä‹É得在应用½E‹åºéƒ¨çÖvä¸è¿›è¡Œéƒ¨åˆ†æ›´æ–°æˆä¸ºå¯èƒ½ã€?/p>
  很明显,版本控制¾pÈ»Ÿè½¯äšg是跟ítªæºä»£ç 所必需的,它对于解军_º”用程åºé…¾|®é—®é¢˜æœ‰éžå¸¸å¤§çš„帮助。在本文ä¸ï¼Œæˆ‘们ž®†ä¸ä¼šæŠŠé‡ç‚¹æ”‘Öœ¨ç‰ˆæœ¬æŽ§åˆ¶¾pÈ»Ÿä¸Šï¼Œå› 䨓˜q™æ–¹é¢å·²¾læœ‰å¾ˆå¤šç›¸å…³çš„ææ–™äº†ã€‚在æ¤ï¼Œæˆ‘们ž®†å…³æ³¨ç‰ˆæœ¬æŽ§åˆ‰™—®é¢˜ä¸çš„一个å°è¯é¢˜åQšå¦‚何ä‹ÉWeb应用½E‹åºçš„é…¾|®æ›´åŠ ä¾¿æøP¼ˆž®¤å…¶æ˜¯ä‹É用Spring MVC框架¾~–写的Web应用½E‹åºåQ‰ã€?/p>
  问题是:我们在æ¤è®¨è®ºçš„æ˜¯ä¸€¿Uä»€ä¹ˆæ ·çš„é…¾|®ï¼Ÿä»ÖM½•Web应用½E‹åºéƒ½éœ€è¦ä¸€äº›èµ„æºï¼Œ˜q™äº›èµ„æºé€šå¸¸éƒ½æ˜¯å…¶æ‰€˜q行的æœåŠ¡å™¨æ‰€ç‰ÒŽœ‰çš„,例如数æ®åº“URLã€å‘é€ç”µå邮件的SMTPæœåŠ¡å™¨ï¼Œä»¥åŠåŒ…å«ä¸“用软äšgæ–‡äšg的文件夹½{‰ã€‚è¿™æ ïLš„讄¡½®åº”该集ä¸åQŒä»Žè€Œä‹É应用½E‹åºé…ç½®æ›´åŠ ½Ž€å•ã€?/p>
  但是åQŒè¿™åªæ˜¯˜q™ä¸ªé—®é¢˜æœ€½Ž€å•的一¿U版本。有时候,在应用程åºå¼€å‘ä¸éœ€è¦æ›´åР夿‚çš„é…置。这æ„味ç€åQŒå¿…™åÕd°†å„次部çÖvä¸çš„ä¸åŒBean˜qžæŽ¥èµäh¥åQŒè€Œè¿™ä¼šä‹Éé—®é¢˜æ›´åŠ å¤æ‚ã€?/p>
  ˜q™äº›åº”用½E‹åºé…置问题的解å†Ïx–¹æ¡ˆæœ‰è¯¸å¤šä¼˜åŠ¿åQŒåŒ…括:½Ž€åŒ–应用程åºçš„安装和酾|®è¿‡½E‹ï¼Œä½¿æºä»£ç ç‰ˆæœ¬æŽ§åˆ¶æ›´åŠ ½Ž€ä¾¿ï¼Œå‡å°‘æºä»£ç 版本库ä¸çš„冲çªçŽ°è±¡ã€‚ä¸‹é¢ï¼Œæˆ‘们ž®†é€šè¿‡½CÞZ¾‹è¯¦ç»†è®¨è®º˜q™ä¸ªè¯é¢˜ã€?/p>
问题
ã€€ã€€æˆ‘ä»¬é¦–å…ˆæ¥æ¼”½CÞZ¸€ä¸‹ä¸Šæ–‡æ‰€æåˆ°çš„æœ€½Ž€å•的版本。在˜q™ä¸€åœºæ™¯ä¸ï¼Œæˆ‘们希望在应用程åºéƒ¨¾|²ä¸æ”¹å˜çš„æ˜¯½Ž€å•çš„é…ç½®å‚æ•°åQŒä¾‹å¦‚链接ã€å¯†ç ç‰ã€‚如果您曄¡»ä½¿ç”¨Spring MVC框架开å‘过Web应用½E‹åºåQŒé‚£ä¹ˆæ‚¨åº”该知铘q™é‡Œž®†ç”¨åˆ°çš„两个é…置文äšgåQ?/p>
- /WEB-INF/applicationContext.xmlåQŒå®ƒè®©æ‚¨å¯ä»¥é…ç½®BeanåQŒæˆ–者显½Cºåº”用程åºä¸Šä¸‹æ–‡ã€‚通过˜q™ä¸ªæ–‡äšgåQŒæ‚¨å¯ä»¥å®šä¹‰è‡ªå·±çš„业务逻辑Beanã€èµ„æºä»¥åŠå…¶ä»–å¯ä»¥ä¸ŽWeb端å£ç›¸å…³è”的所有Beanã€?
- /WEB-INF/[servlet-name]-servlet.xmlåQŒå®ƒè¢«ç”¨äºŽé…¾|®Web层ã€è§†å›¾è§£æžå™¨ã€æŽ§åˆ¶å™¨ã€æ ¡éªŒå™¨ä»¥åŠå…¶ä»–所有MVC框架ä¸å¿…需的Beanã€?strong>[servlet-name]指的是在web.xml部çÖvæè¿°½W¦ä¸å®šä¹‰çš?strong>Spring dispatcher servletçš„å¿U°ã€?
  那么问题在哪儿呢åQŸé—®é¢˜å°±å‡ºåœ¨applicationContext.xmlä¸å°†åŒ…括一些特定于ä¸ÀLœºçš„Bean定义。其ä¸ï¼Œæœ€æ˜Žæ˜¾çš„一个示例就是包å«äº†JDBC˜qžæŽ¥ä¿¡æ¯çš„beanåQŒä½†æ˜¯ä“Q何一¿Uç¨å¾®å¤æ‚些的应用程åºéƒ½æœ‰åå‡ ä¸ª¾cÖM¼¼çš„Bean。看一下下é¢çš„½CÞZ¾‹åQ?/p>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> Â Â <property name="driverClassName"> Â Â Â Â Â Â <value>org.postgresql.Driver</value> Â Â </property> Â Â <property name="url"> Â Â Â Â Â Â <value>jdbc:postgresql://localhost/test</value> Â Â </property> Â Â <property name="username"> Â Â Â Â Â Â <value>postgres</value> Â Â </property> Â Â <property name="password"> Â Â Â Â Â Â <value></value> Â Â </property> </bean> |
  ˜q™ä¸ªè§£å†³æ–ÒŽ¡ˆçš„问题在于对applicationContext.xmlæ–‡äšg的维护。对于åˆå¦è€…æ¥è¯ß_¼Œè®¾æƒ³ä¸€ä¸‹ï¼Œ™å¹ç›®æ”‘Öœ¨æºä»£ç 版本控制系¾lŸä¸åQŒä¾‹å¦‚CVS。下é¢ï¼Œå‡è®¾æ‚¨å¸Œæœ›åœ¨¾|‘ç«™ä¸æ·»åŠ æ–°çš„åŠŸèƒ½ï¼Œé‚£ä¹ˆž®±éœ€è¦åœ¨åº”用½E‹åºä¸Šä¸‹æ–‡å®šä¹‰ä¸æ·ÕdŠ é¢å¤–çš„Bean定义。问题是如何在生产æœåŠ¡å™¨ä¸Šä½“çŽ°è¿™äº›æ”¹å˜ã€?/p>
  通常情况下,应用½E‹åºçš„æœ¬åœ°å®žä¾‹ä¸ä¼šä¸Ž‹zÕdŠ¨ç«™ç‚¹ä½¿ç”¨åŒæ ·çš„æ•°æ®åº“åQŒå› æ¤applicationContext.xmlæ–‡äšgž®†åŒ…括让您能够访问本地数æ®åº“的设¾|®ã€‚当您想æäº¤åœ¨æºä»£ç 版本库ä¸çš„æ”¹å˜æ—¶åQŒå°±éœ€è¦æ³¨æ„这些特定于ä¸ÀLœºå±žæ€§çš„åŒæ¥æ€§ã€‚版本库ä¸çš„æ–‡äšg最¾lˆå¯èƒ½ä‹É用本地设¾|®ä¸çš„é…¾|®ã€‚如果想在生产æœåŠ¡å™¨ä¸Šæ›´æ–°é…¾|®ï¼Œž®±å¿…™åÀL‰‹åŠ¨åŒæ¥è¿™äº›å±žæ€§çš„倹{€‚这是éžå¸¸æž¯ç‡¥çš„ä»ÕdŠ¡åQŒè€Œä¸”˜q˜éžå¸¸å®¹æ˜“出错ã€?/p>
  对于应用½E‹åºçš„æ¯ä¸ªå®žä¾‹æ¥è¯ß_¼Œ˜q™ä¸ªé—®é¢˜æ›´åŠ é‡è¦ã€‚å‡å¦‚有三ä½å¼€å‘äh员æ£åœ¨ä‹Éç”¨ä»£ç æ®µåŸºå€åQŒè€Œä¸”他们使用的是本地的数æ®åº“。当您æäº¤æ›´æ”¹çš„æ—¶å€™ï¼Œä»–们æ¯ä¸ªäººåœ¨æœ¬åœ°æœåŠ¡å™¨ä¸Šæ›´æ–°æºä»£ç 的时候都必须éžå¸¸è°¨æ…Žã€‚ä»–ä»¬ä¼šæ‰‹åŠ¨åŒæ¥˜q™äº›æ›´æ”¹åQŒç„¶åŽæäº¤ä»–ä»¬çš„å·¥ä½œã€‚è¿™æ ·ä¸€æ¥ï¼Œç‰ˆæœ¬æŽ§åˆ¶¾pÈ»Ÿå¯¹äºŽ˜q™äº›é…置文äšgæ¥è¯´å·²ç»æ¯«æ— 用处。如果曾¾lä‹É用过Spring MVCåQŒé‚£ä¹ˆæ‚¨åº”该知é“applicationContext.xml是应用程åºä¸çš„关键组ä»Óž¼Œå› äØ“æ˜¯å®ƒž®†æ‰€æœ‰çš„东西¾_˜åˆåœ¨ä¸€èµ—÷€‚所以,我们需è¦ä¸€¿U机制æ¥å¸®åŠ©ä½¿åº”ç”¨ç¨‹åºä¸å„é¡¹ä¿æŒæœ‰åºåQŒè¿™ç‚šwžå¸”R‡è¦ã€?/p>
  æ£å¦‚å‰é¢æ‰€æåˆ°çš„,˜q™æ˜¯æ‚¨å¯èƒ½é‡åˆ°çš„较简å•çš„é…置问题。更隄¡š„问题出现在当需è¦åœ¨ä¸åŒæœåŠ¡å™¨ä¸˜q›è¡Œä¸åŒçš„Bean˜qžæŽ¥çš„æ—¶å€™ã€‚è¿™¾c»é—®é¢˜å¸¸ä¼šå‡ºçŽ°åœ¨æ—¥å¸¸è½¯äšgå¼€å‘ä“Q务ä¸ã€‚例如,å‡å¦‚æ‚¨çš„äº§å“æœ‰ä¸€ä¸ªå®¢æˆ¯‚ínä»½éªŒè¯æ¨¡å—,å¯ä»¥å¯ÒŽ¥è‡ªå…³¾pÀL•°æ®åº“或LDAPæœåС噍ä¸çš„用戯‚¿›è¡Œèín份验è¯ã€‚自ç„Óž¼Œ˜q™ä¸€íw«ä†¾éªŒè¯æ¨¡å—å¯ä»¥ä½¿ç”¨æŠ½è±¡äº†ç‰¹å®šç‰ˆæœ¬åº“çš„Bean˜q›è¡Œé…置。如果您æƒÏx”¹å˜ä¸åŒåº”用程åºéƒ¨¾|²ä¸éªŒè¯ç”¨æˆ·çš„æ–¹å¼ï¼Œž®±éœ€è¦åœ¨applicationContext.xmlæ–‡äšgä¸è¿›è¡Œä¸åŒçš„Bean˜qžæŽ¥ã€‚è¿™¿Ué…¾|®é—®é¢˜å¸¸è§äºŽåœ¨éƒ¨¾|²ä¸æœ‰å¯é…ç½®ç‰ÒŽ€§çš„æ‰€æœ‰åº”用程åºã€?/p>
  在下文ä¸åQŒæˆ‘们将讨论˜q™ä¸¤¿Ué…¾|®é—®é¢˜ã€‚首先我们会å…Ïx³¨åŒæ¥çš„Bean属性问题åŠå…¶è§£å†Ïx–¹æ¡ˆï¼ŒæŽ¥ä¸‹æ¥ï¼Œæˆ‘ä»¬ä¼šè®¨è®ºæ›´åŠ å¤æ‚çš„åŒæ¥Bean˜qžæŽ¥é—®é¢˜ã€?/p>
解决æ–ÒŽ¡ˆ
åŒæ¥Bean属æ€?/h3>
  ˜q™ä¸ªé—®é¢˜çš„一¿Uå¯è¡Œçš„解决æ–ÒŽ¡ˆæ˜¯å°†æ‰€æœ‰ç‰¹å®šäºŽä¸ÀLœºçš„傿•°éƒ½æ”‘Öˆ°æ™®é€šçš„Java属性文件ä¸åQŒä‹É用Springçš„PropertyPlaceHolderConfigurer¾c»ï¼Œž®†è¿™äº›å‚数写入Bean属性ä¸ã€?/p>
  使用˜q™ä¸€è§£å†³æ–ÒŽ¡ˆåQŒæˆ‘们å¯ä»¥ç”Ÿæˆå¦‚下的属性文ä»Óž¼ˆ/WEB-INF/jdbc.propertiesåQ‰ï¼š
jdbc.driver=org.postgresql.Driver jdbc.url=jdbc:postgresql://localhost/test jdbc.user=postgres jdbc.password= |
  我们的Beané…置如下åQ?/p>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> Â Â Â <property name="location"> Â Â Â Â Â Â <value>/WEB-INF/jdbc.properties</value> Â Â Â </property> </bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> Â Â Â <property name="driverClassName"> Â Â Â Â Â Â Â Â <value>${jdbc.driver}</value> Â Â Â </property> Â Â Â <property name="url"> Â Â Â Â Â Â Â Â <value>${jdbc.url}</value> Â Â Â </property> Â Â Â <property name="username"> Â Â Â Â Â Â Â Â <value>${jdbc.user}</value> Â Â Â </property> Â Â Â <property name="password"> Â Â Â Â Â Â Â Â <value>${jdbc.password}</value> Â Â Â </property> </bean> |
  如上所˜qŽÍ¼Œæˆ‘们定义了一个PropertyPlaceholderConfigurer¾cÈš„实例åQŒåƈž®†å…¶ä½ç½®å±žæ€§è®¾¾|®äؓ我们的属性文件。该¾c»è¢«å®žçŽ°ä¸ºBean工厂的åŽå¤„ç†å™¨ï¼Œòq¶å°†ä½¿ç”¨å®šä¹‰åœ¨æ–‡ä»¶ä¸çš„属性æ¥ä»£æ›¿æ‰€æœ‰çš„å ä½½W¦ï¼ˆ${...}valueåQ‰ã€?/p>
  利用˜q™ç§æŠ€æœ¯ï¼Œæˆ‘们å¯ä»¥ä»ŽapplicationContext.xmlä¸ç§»é™¤æ‰€æœ‰ç‰¹å®šäºŽä¸ÀLœºçš„é…¾|®å±žæ€§ã€‚通过˜q™ç§æ–¹å¼åQŒæˆ‘们å¯ä»¥è‡ªç”±åœ°ä¸ø™¯¥æ–‡äšgæ·ÕdŠ æ–°çš„BeanåQŒè€Œä¸å¿…担心特定于ä¸ÀLœºå±žæ€§çš„åŒæ¥æ€§ã€‚è¿™æ ·å¯ä»¥ç®€åŒ–生产部¾|²å’Œ¾l´æŠ¤ã€?/p>
åŒæ¥æ€§è¿žæŽ?/h3>
  上é¢çš„æŠ€æœ¯è§£å†³äº†½W¬ä¸€ä¸ªé—®é¢˜ï¼Œå¯æ˜¯å¦‚果您计划修改ä¸åŒåº”用程åºéƒ¨¾|²ä¹‹é—´çš„Bean˜qžæŽ¥åQŒè¿™ä¸€æŠ€æœ¯ä¾¿ä¸å¾ˆé€‚åˆã€‚针对这一问题的一个解å†Ïx–¹æ¡ˆä¾¿æ˜¯é¢å¤–创å»ÞZ¸€ä¸ªå为applicationContext-[hostname].xml çš„XML定义文äšg。其ä¸?strong>[hostname]是部¾|²åº”用程åºçš„ä¸ÀLœºçš„å¿U°ã€‚例如,在本地的机器上,˜q™ä¸ªæ–‡äšg通常å䨓applicationContext-localhost.xmlåQŒè€Œåœ¨éƒ¨çÖvæ—Óž¼Œå®ƒå¯èƒ½æ›´å䨓applicationContext-somehost.com.xmlã€?/p>
  å¯ä»¥çŒœæµ‹åQŒè¿™ä¸€æ–‡äšg必须包括特定于æŸä¸€ä¸ÀLœºçš„æ‰€æœ‰é…¾|®Bean。在本文ä¸ï¼Œæˆ‘们ž®†å‡è®¾dataSource bean定义ž®†ä½äºŽè¿™¾cÀL–‡ä»¶ä¸åQŒè€Œä¸æ˜¯é€šç”¨çš„applicationContext.xml定义。当ç„Óž¼Œ˜q™ç§æœºåˆ¶ä¸Žå‰è€…åÆˆéžå†²½H,但是ä¸ÞZº†æ›´åŠ ½Ž€å•明了,我们ž®†åªå…Ïx³¨˜q™ç§æ–ÒŽ³•ã€?/p>
ã€€ã€€æ—¢ç„¶æˆ‘ä»¬å·²ç»æœ‰äº†ç‰¹å®šçš„é…¾|®ï¼Œä¸‹é¢æˆ‘们ž®±æ¥è®¨è®ºä¸€ä¸‹å¦‚何将其整åˆåˆ°æ•´ä¸ªSpring MVCé…置概念ä¸ã€‚è¦è¾‘Öˆ°˜q™ä¸€ç›®çš„åQŒå¯ä»¥æœ‰è®¸å¤šæ–ÒŽ³•åQŒæˆ‘们将详细åœîC¸€ä¸€è¯´æ˜Žã€‚但首先åQŒæˆ‘们应该注æ„到åQŒç”±äºŽæœ‰äº›Beanå¯èƒ½ä½äºŽç‹¬ç«‹çš„é…¾|®æ–‡ä»¶ä¸åQŒå› æ¤åœ¨applicationContext.xmlä¸ï¼Œæ‰€æœ‰å¯¹å®ƒä»¬çš„å±€éƒ¨å¼•ç”¨éƒ½å¿…é¡»æ›´æ¢æˆå…¨å±€åç§°ã€?/p>
  例如åQŒå¦‚下引用:
 <property name="someProperty">   <ref local="someBean"/> </property> |
ã€€ã€€åº”æ›´æ”¹äØ“åQ?/p>
 <property name="someProperty">   <ref bean="someBean"/> </property> |
  在这之åŽåQŒæˆ‘们有很多å¯ä»¥æ·ÕdŠ é¢å¤–的资æºä»¥ç”¨äºŽé…置的方å¼ã€‚其䏿œ€æ˜Žæ˜¾çš„就是ä‹Éç”?lt;import>æ ‡ç¾ž®†è¿™ä¸€é¢å¤–资æºåŒ…å«åœ¨applicationContext.xmlé…置文äšgä¸ã€‚ä‹É用时åQŒè¦ž®†è¯¥æ ‡ç¾æ”‘Öœ¨applicationContext.xmlæ–‡äšg开头。例如:
 <import resource="applicationContext-somehost.com.xml"/> |
  现在åQŒåœ¨ç‹¬ç«‹çš„XML定义文äšg和普通的应用½E‹åºä¸Šä¸‹æ–‡å®šä¹‰æ–‡ä»¶ä¸çš„æ‰€æœ‰é€šç”¨Bean定义都有了特定于ä¸ÀLœºçš„连接。由于大多数的Beanéƒ½ä¸æ˜¯ç‰¹å®šäºŽä¸ÀLœºçš„ï¼Œå› æ¤æˆ‘们å¯ä»¥åƒå¤„ç†Web应用½E‹åºä¸çš„其他资æºä¸€æ ¯‚‡ªç”±åœ°å¤„ç†applicationContext.xmlæ–‡äšgåQŒåƈå¯ä»¥é€šè¿‡åˆé€‚的版本控制¾pÈ»Ÿä¸Žå…¶˜q›è¡ŒåŒæ¥ã€?/p>
  但是åQŒä¸Š˜q°æ–¹æ³•也有一定的弊端。如果您想ä¿ç•™ä¸åŒXMLæ–‡äšgçš„ä¸åŒé…¾|®ï¼Œž®×ƒ»ç„¶å¿…™åÀL‹…心applicationContext.xmlçš„åŒæ¥æ€§ï¼Œå› äØ“èµ„æºçš„å¿U°å¿…™åÀL ¹æ®ä¸åŒæœåС噍˜q›è¡Œæ›´æ”¹ã€‚虽然与原有的解å†Ïx–¹æ¡ˆç›¸æ¯”有了很大æé«˜ï¼Œåªéœ€æ›´æ”¹æ–‡äšgå,但是˜q™è¿˜æ˜¯éœ€è¦å¼€å‘äh员的手动å助ã€?/p>
  ç”׃ºŽä¸ŽapplicationContext.xml相比åQŒä¸»æœºé…¾|®ä¸éœ€å¦‚æ¤é¢‘ç¹åœ°è¿›è¡Œæ›´æ”¹ï¼Œå› æ¤ä¸‹ä¸€æ¥ä¾¿æ˜¯å°†ä¸ÀLœºé…ç½®¿UÕdŠ¨åˆ°web.xmlæ–‡äšgä¸ï¼ˆå¦‚æžœå¯èƒ½çš„è¯åQ‰ã€‚幸˜q的是,我们有一个å¯ç”¨çš„解决æ–ÒŽ¡ˆã€‚看一下下é¢å…³äºŽweb.xmlé…置的片æ–:
 <listener>   <listener-class>    org.springframework.web.context.ContextLoaderListener   </listener-class>  </listener>  <context-param>    <param-name>contextConfigLocation</param-name>    <param-value>    /WEB-INF/applicationContext.xml       /WEB-INF/applicationContext-somehost.com.xml    </param-value>  </context-param> |
  æ£å¦‚您所看到的,除了web.xmlæ–‡äšgä¸å¸¸æœ‰çš„ContextLoaderListener之外åQŒæˆ‘们还æ·ÕdŠ äº†contextConfigLocationä¸Šä¸‹æ–‡å‚æ•°é…¾|®ã€‚è¿™ä¸€å‚æ•°ç”¨äºŽæŒ‡ç¤ºæ¡†æž¶æŸ¥æ‰¾˜q™äº›é…置文äšg的佾|®ã€‚å¦‚æžœè¿™ä¸€å‚æ•°è¢«çœç•¥ï¼Œåˆ™Springž®±åªèƒ½åˆ°applicationContext.xml䏿Ÿ¥æ‰¾ã€‚这里我们也定义了特定于ä¸ÀLœºçš„é…¾|®æ–‡ä»¶æ¥ä½¿ç”¨ã€?/p>
  利用˜q™ç§æ–ÒŽ³•åQŒæˆ‘们将所有特定于ä¸ÀLœºçš„é…¾|®ä»ŽapplicationContext.xmlæ–‡äšgä¸ç§»é™¤ï¼Œ˜q™æ ·ä¾¿å‡è½ÖMº†å…¶åœ¨ä¸åŒåº”用½E‹åºéƒ¨çÖvä¸çš„åŒæ¥æ€§ã€?/p>
  如果˜q™ç§æ–ÒŽ³•æˆäؓ您的æ–îC¹ 惯,您还å¯ä»¥ä½¿å…¶æ›´åŠ ç‰|´»ã€‚通过éµå®ˆä¸‹åˆ—指ä×oåQŒä¹Ÿå¯ä»¥ž®†ç‰¹å®šäºŽä¸ÀLœºçš„é…¾|®ä»Žweb.xmlæ–‡äšgä¸ç§»é™¤ã€?/p>
  为æ¤åQŒéœ€è¦åˆ›å»ºç‰¹å®šäºŽæˆ‘们的应用程åºä¸Šä¸‹æ–‡çš„ç±»åQ?/p>
 package net.nighttale.spring.util;
import java.net.InetAddress;
import org.springframework.web.context.support.XmlWebApplicationContext;
public class PerHostXmlWebApplicationContext extends XmlWebApplicationContext {           protected String[] getDefaultConfigLocations() {            String hostname = "localhost";            try {                hostname = InetAddress.getLocalHost().getHostName();            } catch (Exception e) {            }                       String perHostConfiguration = DEFAULT_CONFIG_LOCATION_PREFIX                 + "applicationContext-"                 + hostname                 + DEFAULT_CONFIG_LOCATION_SUFFIX                 ;               logger.debug(                 "Adding per host configuration file: "                 + perHostConfiguration                 );                       if (getNamespace() != null) {                    return new String[] {              DEFAULT_CONFIG_LOCATION_PREFIX                + getNamespace()                + DEFAULT_CONFIG_LOCATION_SUFFIX             , perHostConfiguration};            }            else {                    return new String[] {             DEFAULT_CONFIG_LOCATION              , perHostConfiguration};            }    } } |
  ˜q™ä¸ª¾cÀL‹“展了Springä¸å¸¸è¢«ä½œä¸ºé»˜è®¤å€ég‹É用的XmlWebApplicationContext。XmlWebApplicationContext¾cÕd°†Web应用½E‹åºçš„é…¾|®ä»ŽXML定义文äšgä¸å¤åˆ¶è¿‡æ¥ã€‚默认情况下åQŒå®ƒå¯ä»¥é…ç½®æ¥è‡ªapplicationContext.xmlå’?strong>[servlet-name]-servlet.xmlæ–‡äšgä¸çš„应用½E‹åºã€‚这个类执行的惟一一™åšw¢å¤–ä“Q务便是获å–它所在的ä¸ÀLœºåç§°åQŒåƈž®†applicationContext-[hostname].xmlæ–‡äšgæ·ÕdŠ åˆ°é…¾|®æ–‡ä»¶åˆ—表ä¸ã€?/p>
  ä¸ÞZº†ä½¿ç”¨˜q™ä¸ª¾c»ï¼Œæˆ‘们需è¦å¯¹å…¶è¿›è¡Œç¼–译,ž®†å…¶åŒ…å«åœ¨ç±»é€”径ä¸ï¼Œòq¶æŒ‡½CºSpring框架使用它。å‰ä¸¤æ¥éžå¸¸½Ž€å•,我们ž®×ƒ¸åœ¨æ¤èµ˜è¿°ã€‚我们å¯ä»¥æŒ‡½CºSping通过contextClassä¸Šä¸‹æ–‡å‚æ•°æ¥ä½¿ç”¨å®ƒã€‚除了web.xmlæ–‡äšgä¸çš„原有é…ç½®åQŒæˆ‘们还å¯ä»¥æ·ÕdŠ ä¸‹åˆ—å†…å®¹åQ?/p>
 <context-param>   <param-name>contextClass</param-name>  <param-value>   net.nighttale.spring.util.PerHostXmlWebApplicationContext  </param-value> </context-param> |
 如果我们使用˜q™ä¸€é…置片æ–åQŒå°†ä¼šæœ‰ä¸‰ä¸ªæ–‡äšg被用于åˆå§‹åŒ–˜q™ä¸ªæ¡†æž¶åQ?strong>[servlet-name]-servlet.xmlã€applicationContext-[hostname].xml以åŠapplicationContext.xmlã€?/p>
  æ£å¦‚您所看到的,applicationContext.xmlå’Œweb.xmlæ–‡äšgå·²ç»å®Œå…¨æ‘†è„±äº†ä“Q何特定的é…ç½®¾l†èŠ‚åQŒè€Œä¸”您也ä¸å¿…担心会在更新应用½E‹åºæ—¶ç ´åé…¾|®ã€?/p>
  但是åQŒè¿™¿U方法有一个丑³ä¹‹å¤„ã€‚å› ä¸ºï¼Œä¸è®ºæ˜¯å¦ä¼šä‹É用,都需è¦åœ¨åº”用½E‹åºéƒ¨çÖv䏿œ‰½W¬ä¸‰ä¸ªé…¾|®æ–‡ä»¶ã€‚在˜q™ç§æƒ…况下,便ä¸éœ€è¦ç‰¹å®šäºŽä¸ÀLœºçš„é…¾|®ã€‚例如:
 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"    "http://www.springframework.org/dtd/spring-beans.dtd">
<beans></beans> |
  最åŽï¼Œéœ€è¦çŸ¥é“应用程åºä¸Šä¸‹æ–‡¾c»éœ€è¦æŸ¥æ‰„¡š„特定ä¸ÀLœºå。检查主机å¿U°çš„æœ€½Ž€å•çš„æ–ÒŽ³•是在机器上è¿è¡Œä¸‹åˆ—代ç :
 System.out.println(InetAddress.getLocalHost().getHostName()) |
  å¯ä»¥ž®†å…¶ä½œäØ“Javaä»£ç æ‰§è¡ŒåQŒä¹Ÿå¯åœ¨å–œæ¬¢ä½¿ç”¨çš„脚本è¯a€åQˆå¦‚BeanShell或GroovyåQ‰ä¸ä½œäؓ一个具有Javaé£Žæ ¼è¯æ³•的脚本执行。在获å–了主机的å称之åŽåQŒåº”该创å»ÞZ¸€ä¸ªé»˜è®¤çš„/WEB-INF/applicationContext-[hostname].xml½Iºæ–‡ä»¶å¤¹åQˆå¦‚æˆ‘ä»¬ä¸Šé¢æ‰€å®šä¹‰çš„)åQŒç„¶åŽä¾¿å¯ä»¥å¼€å§‹äº†ã€?/p>
¾l“æŸè¯?/h3>
  在本文ä¸åQŒæˆ‘们æä¾›äº†ä¸€¾pÕdˆ—的酾|®æŠ€å·§ï¼Œè®©æ‚¨åœ¨ä‹É用Spring MVCæ¡†æž¶å®Œæˆæ—¥å¸¸å·¥ä½œçš„æ—¶å€™æ›´åŠ è½»æ¾ã€‚如果您希望知é“如何¾l´æŠ¤å„ç§Web应用½E‹åºéƒ¨çÖvåQŒå¯ä»¥è¯•ç€æ‰‘Ö‡ºæœ€é€‚åˆæ‚¨çš„å¼€å‘过½E‹çš„解决æ–ÒŽ¡ˆã€‚您的生‹zÖM¼šæ›´äØ“è½ÀL¾ã€?/p>

]]>- Strutså¦ä¹ ½W”è®°åQˆä¸€åQ?struts概念和体¾pÈ»“æž?/title><link>http://www.aygfsteel.com/kobe09/archive/2006/06/04/50304.html</link><dc:creator>æ°§æ°”ä¸æ¯’</dc:creator><author>æ°§æ°”ä¸æ¯’</author><pubDate>Sun, 04 Jun 2006 10:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/kobe09/archive/2006/06/04/50304.html</guid><wfw:comment>http://www.aygfsteel.com/kobe09/comments/50304.html</wfw:comment><comments>http://www.aygfsteel.com/kobe09/archive/2006/06/04/50304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kobe09/comments/commentRss/50304.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kobe09/services/trackbacks/50304.html</trackback:ping><description><![CDATA[
<p>
<font color="#000000">
<strong>一�/strong>
</font>
<a name="_Toc65638969">
<span lang="EN-US">
<font face="Arial" color="#000000">
<strong>Struts</strong>
</font>
</span>
</a>
<span style="mso-bookmark: _Toc65638969">
<font color="#000000">
<strong>
<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的与</span>
<span lang="EN-US">
<font face="Arial">Web App</font>
</span>
</strong>
</font>
</span>
<span style="mso-bookmark: _Toc65638969">
<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">
<font color="#000000">
<strong>的关¾p?br /></strong>
</font>
</span>
</span>
<br style="mso-ignore: vglayout" clear="all" />
<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">    <span lang="EN-US">struts</span>å«åš<span lang="EN-US">web framework</span>åQŒå…¶ä¸»è¦åŸÞZºŽ<span lang="EN-US">web</span>层的应用¾pÈ»Ÿå¼€å‘。按ç…?span lang="EN-US">J2EE Architecture</span>çš„æ ‡å‡†ï¼Œ<span lang="EN-US">struts</span>应当å’?span lang="EN-US">jsp/servlet</span>ä¸€æ øP¼Œå˜åœ¨äº?span lang="EN-US">web container</span>一层ã€?br /></span>
</p>
<p align="center">
<img title="struts与WebApp的关¾p? height="306" alt="3.jpg" src="http://www.aygfsteel.com/images/blogjava_net/kobe09/Framework/Struts/3.jpg" width="405" border="0" />
</p>
<p>
<br />
<strong>二�/strong>
<a name="_Toc65638970">
<strong>
<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Struts</span>
<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">的体¾pÈ»“æž?/span>
</strong>
</a>
<br />      <span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000000">我们è¯?span lang="EN-US">struts framework</span>æ˜?span lang="EN-US">MVC </span>模å¼çš„体玎ͼŒä¸‹é¢æˆ‘们ž®×ƒ»Žåˆ†åˆ«ä»Žæ¨¡åž‹ã€è§†å›¾ã€æŽ§åˆ¶æ¥çœ‹çœ‹<span lang="EN-US">struts</span>的体¾pÈ»“构(<span lang="EN-US">Architecture</span>åQ‰ã€‚下图显½CÞZº†<span lang="EN-US">struts framework</span>的体¾pÈ»“æž„å“应客戯‚¯·æ±‚时候,å„个部分工作的原ç†ã€?br /></font></span></p>
<p align="center">
<img title="struts体系¾l“æž„" height="216" alt="2.jpg" src="http://www.aygfsteel.com/images/blogjava_net/kobe09/Framework/Struts/2.jpg" width="435" align="center" border="0" />
</p>
<p style="MARGIN: 13pt 0cm">
<strong>
<font size="2">
<font face="Times New Roman">1�/font>
</font>
</strong>
<a name="_Toc65638971">
<font face="Times New Roman">
<strong>
<font size="2">
<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从视图角度(</span>
<span lang="EN-US">View</span>
</font>
</strong>
</font>
</a>
<span style="mso-bookmark: _Toc65638971">
<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<font face="Times New Roman" size="2">
<strong>åQ?/strong>
</font>
</span>
</span>
</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 31.5pt">
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先åQ?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">Struts</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">æä¾›äº?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">Java</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">¾c?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">org. apache.struts.action.ActionForm</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">åQ?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">Java</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">å¼€å‘者将该类¾l†åˆ†æ¥åˆ›å»ø™¡¨å?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">bean</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。在˜q行æ—Óž¼Œè¯?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">bean</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有两¿U用法:<br /></span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">�span style="mso-spacerun: yes"> </span></font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">�/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">JSP</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">准备相关�/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">HTML</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">åQŒè¡¨å•以˜q›è¡Œæ˜„¡¤ºæ—Óž¼Œ</span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">JSP</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">ž®†è®¿é—®è¯¥</span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
<o:p>
</o:p>
</span>
</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 76.45pt; mso-para-margin-left: 7.28gd">
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">bean(</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它ä¿å˜è¦æ”‘Ö…¥è¡¨å•ä¸çš„å€?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">)</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。那些值是从业务逻辑或者是从先å‰çš„ç”¨æˆ·è¾“å…¥æ¥æä¾›çš„ã€?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<o:p>
</o:p>
</span>
</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 78.75pt; TEXT-INDENT: -78.75pt; mso-char-indent-count: -7.5">
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">
<span style="mso-spacerun: yes">         </span>�span style="mso-spacerun: yes"> </span></font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当从</span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">Web</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">‹¹è§ˆå™¨ä¸˜q”回用户输入æ—Óž¼Œè¯?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">bean</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">ž®†éªŒè¯åƈä¿å˜è¯¥è¾“入以供业务逻辑æˆ?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">(</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果验è¯å¤ÞpÓ|çš„è¯</span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">)</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">åŽç®‹é‡æ–°æ˜„¡¤ºä½¿ç”¨ã€?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<o:p>
</o:p>
</span>
</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 31.5pt">
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其次åQ?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">Struts</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">æä¾›äº†è®¸å¤šå®šåˆ?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">JSP</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">æ ‡è®°åQŒå®ƒä»¬çš„使用½Ž€å•,但是它们在éšè—ä¿¡æ¯æ–¹é¢åŠŸèƒ½å¼ºå¤§ã€‚ä¾‹å¦‚ï¼Œé™¤äº†</span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">bean</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">å称和给å®?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">bean</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">䏿¯ä¸ªæ®µçš„å¿UîC¹‹å¤–,™åµé¢è®¾è®¡è€…ä¸éœ€è¦çŸ¥é“有兌™¡¨å?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">bean</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的更多信æ¯ã€?/span>
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<o:p>
</o:p>
</span>
</p>
<p style="MARGIN: 13pt 0cm">
<strong>
<font size="2">
<font face="Times New Roman">2�/font>
</font>
</strong>
<a name="_Toc65638972">
<font face="Times New Roman">
<strong>
<font size="2">
<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从模型角度(</span>
<span lang="EN-US">Model</span>
</font>
</strong>
</font>
</a>
<span style="mso-bookmark: _Toc65638972">
<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<font face="Times New Roman" size="2">
<strong>åQ?/strong>
</font>
</span>
</span>
</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
<font face="Times New Roman">Struts</font>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虽然ä¸ç›´æŽ¥æœ‰åŠ©äºŽæ¨¡åž‹å¼€å‘ã€?/span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">åœ?span lang="EN-US">Struts</span>ä¸ï¼Œ¾pÈ»Ÿ</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模型</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">的状æ€ä¸»è¦ç”±<span lang="EN-US">ActiomForm Bean</span>和值对象体现ã€?span lang="EN-US"><o:p></o:p></span></span>
</p>
<p style="MARGIN: 13pt 0cm">
<strong>
<font size="2">
<font face="Times New Roman">3�/font>
</font>
</strong>
<a name="_Toc65638973">
<font face="Times New Roman">
<strong>
<font size="2">
<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从控制器角度åQ?/span>
<span lang="EN-US">Controller</span>
</font>
</strong>
</font>
</a>
<span style="mso-bookmark: _Toc65638973">
<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<font face="Times New Roman" size="2">
<strong>åQ?/strong>
</font>
</span>
</span>
</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">
<span style="mso-tab-count: 1">Â Â Â </span>
</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">åœ?span lang="EN-US">Struts framework</span>ä¸ï¼Œ<span lang="EN-US"> Controller</span>ä¸»è¦æ˜?span lang="EN-US">ActionServlet</span>åQŒä½†æ˜¯å¯¹äºŽä¸šåŠ¡é€»è¾‘çš„æ“作则主è¦ç”?span lang="EN-US">Action</span>ã€?span lang="EN-US">ActionMapping</span>ã€?span lang="EN-US">ActionForward</span>˜q™å‡ 个组件å调完æˆï¼ˆä¹Ÿè®¸˜q™å‡ 个组ä»Óž¼Œåº”该划分到模型ä¸çš„业务逻辑一å—)。其ä¸ï¼Œ<span lang="EN-US">Action</span>扮演了真æ£çš„æŽ§åˆ¶é€»è¾‘的实现者,è€?span lang="EN-US">ActionMapping</span>å’?span lang="EN-US">ActionForward</span>则指定了ä¸åŒä¸šåŠ¡é€»è¾‘æˆ–æµ½E‹çš„˜q行方å‘ã€?span lang="EN-US"><o:p></o:p></span></span>
</p>
<p>
<br /> <br /><strong>三ã€åŸºæœ¬ç»„件包</strong></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">整个<span lang="EN-US">struts</span>大约æœ?span lang="EN-US">15</span>包,˜q?span lang="EN-US">200</span>个类所¾l„æˆåQŒè€Œä¸”数釘q˜åœ¨ä¸æ–çš„æ‰©å±•ã€‚åœ¨æ¤æˆ‘们ä¸èƒ½ä¸€ä¸€ä»‹ç»åQŒåªèƒ½åˆ—丑և 个主è¦çš„½Ž€è¦çš„介ç»ä¸€ä¸‹ã€‚下表说明了目å‰<span lang="EN-US">struts api</span>ä¸åŸºæœ¬çš„å‡ ä¸ª¾l„äšg包,包括<span lang="EN-US">action,actions,config,util,taglib,validator</span>。下囑ֈ™æ˜„¡Ž°äº†è¿™å‡ 个¾l„äšg包之间的关系。其ä¸?span lang="EN-US">action</span>是整ä¸?span lang="EN-US">struts framework</span>çš„æ ¸å¿?span lang="EN-US"><o:p></o:p></span></span>
</p>
<div align="center">
<table class="MsoNormalTable" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 41.4pt; BORDER-LEFT: medium none; WIDTH: 385pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" width="513" border="1">
<tbody>
<tr style="HEIGHT: 7.5pt">
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 7.5pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="513">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<b>
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.action</span>
</b>
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">
<o:p>
</o:p>
</span>
</p>
</td>
</tr>
<tr style="HEIGHT: 15.75pt">
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">基本上,控制整个<span lang="EN-US">struts framework</span>çš„è¿è¡Œçš„æ ¸å¿ƒ¾c…R€ç»„仉™ƒ½åœ¨è¿™ä¸ªåŒ…ä¸ï¼Œæ¯”å¦‚æˆ‘ä»¬ä¸Šé¢æåˆ°çš„æŽ§åˆ¶å™¨<span lang="EN-US">ActionServlet</span>。已¾l?span lang="EN-US">Action,ActionForm,ActionMapping</span>½{‰ç‰ã€?span lang="EN-US">struts1.1</span>æ¯?span lang="EN-US">1.0</span>多了<span lang="EN-US"> DynaActionForm </span>¾c…R€‚å¢žåŠ äº†åŠ¨æ€æ‰©å±•生æˆ?span lang="EN-US">FormBean</span>功能<span lang="EN-US"><o:p></o:p></span></span>
</p>
</td>
</tr>
<tr style="HEIGHT: 15.75pt">
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<b>
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.actions</span>
</b>
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">
<o:p>
</o:p>
</span>
</p>
</td>
</tr>
<tr style="HEIGHT: 15.75pt">
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">˜q™ä¸ªåŒ…是主è¦ä½œç”¨æ˜¯æä¾›å®¢æˆïLš„<span lang="EN-US">http</span>è¯äh±‚和业务逻辑处ç†ä¹‹é—´çš„特定适é…器è{æ¢åŠŸèƒ½ï¼Œè€?span lang="EN-US">1.0</span>版本ä¸çš„部分动æ€å¢žåˆ?span lang="EN-US">FromBean</span>的类åQŒä¹Ÿåœ?span lang="EN-US">struts1.1</span>ä¸è¢«<span lang="EN-US">Action</span>包的<span lang="EN-US">DynaActionForm</span>¾l„äšg所å–代<span lang="EN-US"><o:p></o:p></span></span>
</p>
</td>
</tr>
<tr style="HEIGHT: 15.75pt">
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<b>
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.config<o:p></o:p></span>
</b>
</p>
</td>
</tr>
<tr style="HEIGHT: 15.75pt">
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">æä¾›å¯šw…¾|®æ–‡ä»?span lang="EN-US">struts-config.xml</span>å…ƒç´ çš„æ˜ ž®„。这也是<span lang="EN-US">sturts1.1</span>䏿–°å¢žçš„功能<span lang="EN-US"><o:p></o:p></span></span>
</p>
</td>
</tr>
<tr style="HEIGHT: 15.75pt">
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<b>
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.util</span>
</b>
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">
<o:p>
</o:p>
</span>
</p>
</td>
</tr>
<tr style="HEIGHT: 15.75pt">
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">Strtuts</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">ä¸ÞZº†æ›´å¥½æ”¯æŒ<span lang="EN-US">web application</span>的应用,体统了一个些常用æœåŠ¡çš„æ”¯æŒï¼Œæ¯”如<span lang="EN-US">Connection Pool</span>å’?span lang="EN-US">Message Source</span>。详¾l†ä¿¡æ¯è¯·å‚è€?span lang="EN-US"><o:p></o:p></span></span>
</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html<o:p></o:p></span>
</p>
</td>
</tr>
<tr style="HEIGHT: 15.75pt">
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<b>
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.taglib</span>
</b>
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">
<o:p>
</o:p>
</span>
</p>
</td>
</tr>
<tr style="HEIGHT: 15.75pt">
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">˜q™ä¸æ˜¯ä¸€ä¸ªåŒ…åQŒè€Œæ˜¯æ˜¯ä¸€ä¸ªå®¢æˆäh ‡½{„¡±»çš„集åˆã€‚下é¢åŒ…æ‹?span lang="EN-US">Bean Tags</span>åQ?span lang="EN-US">HTML Tags</span>åQ?span lang="EN-US">Logic Tags</span>åQ?span lang="EN-US">Nested Tags</span>åQ?span lang="EN-US">Template Tags</span>˜q™å‡ 个用于构建用æˆïL•Œé¢çš„æ ‡ç¾¾c…R€?span lang="EN-US"><o:p></o:p></span></span>
</p>
</td>
</tr>
<tr style="HEIGHT: 15.75pt">
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<b>
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.validator</span>
</b>
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">
<o:p>
</o:p>
</span>
</p>
</td>
</tr>
<tr style="HEIGHT: 15.75pt; mso-yfti-lastrow: yes">
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">Struts1.1 framework</span>
<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">ä¸å¢žåŠ äº†<span lang="EN-US">validator framework</span>åQŒç”¨äºŽåЍæ€çš„é…ç½®<span lang="EN-US">from</span>表å•的验è¯ã€‚详¾l†ä¿¡æ¯è¯·å‚阅 <span lang="EN-US">http://home.earthlink.net/~dwinterfeldt/<b><o:p></o:p></b></span></span>
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p align="center">
<img title="struts基本¾l„äšg关系å›? height="256" alt="1.jpg" src="http://www.aygfsteel.com/images/blogjava_net/kobe09/Framework/Struts/1.jpg" width="358" align="center" border="0" />
</p>
<p>
<br />Â </p>
<p>Â </p>
<img src ="http://www.aygfsteel.com/kobe09/aggbug/50304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kobe09/" target="_blank">æ°§æ°”ä¸æ¯’</a> 2006-06-04 18:00 <a href="http://www.aygfsteel.com/kobe09/archive/2006/06/04/50304.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>