Read Ted's email here, but the gist of it is this: WebWork is a great technology, and Struts is a great community. It's a perfect match and bringing the two together will only be better for WebWork and Struts users alike. The only down side for me is that I'll be working less with OpenSymphony, but I believe that is a small price for all the great benefits that come from this merger.
Just to be clear, WebWork is not going away. WebWork 2.2 is still coming out any day now, and there may even be a WebWork 2.3. But new minor/major versions won't be coming out under the WebWork name for much longer. Instead, they will be released under the Struts incubator program with the intent to eventually become Struts Action Framework 2.0.
So don't worry, WebWork 2.1.8, 2.2.1, and other bug fix releases will continue to come out and we will support the WebWork community as long as needed. In addition, we'll make compatibility with both Struts and WebWork a high priority, so future releases may help with that. To be clear: no one is leaving WebWork and it will continue to be supported for a very long time.
With this renewed energy, larger development team, and larger
community, the combined efforts of Struts and WebWork will surely make
the Struts platform the easiest, fastest, and most powerful Java web
framework available. We hope that all the WebWork users and developers
are as excited about this as we are and are ready to take WebWork to
the next level.
原文地å€åQšhttp://www.opensymphony.com/webwork/
以å‰ä¸€ç›´åœ¨strutså’Œwebwork之间犹èõUåQŒçœ‹æ¥struts气数未尽呀。apache¾l„织˜q˜æ˜¯æ¯”较åªå€¼å¾—信赖的。呵å‘?
æ‚(zh¨¨n)¨è‚¯å®šå·²¾lå¬è¯´è¿‡æŽ§åˆ¶åè{ (IOC) 设计模å¼åQŒå› 为很长一ŒD‰|—¶é—´ä»¥æ¥ä¸€ç›´åœ¨‹¹ä¼ 关于它的信æ¯ã€‚如果æ?zh¨¨n)¨åœ¨ä“Q何功能ä¸ä½¿ç”¨˜q?Spring 框架åQŒé‚£ä¹ˆæ?zh¨¨n)¨ž®ÞqŸ¥é“其原ç†çš„作用。在本文ä¸ï¼Œæˆ‘åˆ©ç”¨è¿™ä¸€åŽŸç†æŠŠä¸€ä¸?Struts 应用½E‹åºæ³¨å…¥ Spring 框架åQŒæ?zh¨¨n)¨ž®†äº²íw«ä½“ä¼?x¨¬)åˆ?IOC 模å¼çš„强大ã€?/font>
ž®†ä¸€ä¸?Struts 应用½E‹åºæ•´åˆ˜q?Spring 框架å…ähœ‰å¤šæ–¹é¢çš„优点。首先,Spring æ˜¯äØ“(f¨´)解决一些关äº? JEE 的真实世界问题而设计的åQŒæ¯”如夿‚性ã€ä½Žæ€§èƒ½å’Œå¯‹¹‹è¯•性,½{‰ç‰ã€‚第二,Spring 框架包å«ä¸€ä¸?AOP 实现åQŒå…许æ?zh¨¨n)¨ž®†é¢å‘æ–¹é¢æŠ€æœ¯åº”ç”¨äºŽé¢å‘对象的代ç 。第三,一些ähå¯èƒ½ä¼?x¨¬)è¯?Spring æ¡†æž¶åªæœ‰å¤„ç† Struts æ¯?Struts 处ç†è‡ªå·±å¥½ã€‚但是这是观炚w—®é¢˜ï¼Œæˆ‘æ¼”½CÞZ¸‰¿Uå°† Struts 应用½E‹åºæ•´åˆåˆ?Spring 框架的方法åŽåQŒå…·ä½“ç”±æ‚(zh¨¨n)¨è‡ªå·±å†³å®šä‹É用哪一¿Uã€?/font>
我所演示的方法都是执行è“væ¥ç›¸å¯¹ç®€å•çš„åQŒä½†æ˜¯å®ƒä»¬å´å…ähœ‰æ˜Žæ˜¾ä¸åŒçš„优ç‚V€‚我为æ¯ä¸€¿U方法创å»ÞZº†ä¸€ä¸ªç‹¬ç«‹è€Œå¯ç”¨çš„例ååQŒè¿™æ äh‚¨ž®±å¯ä»¥å®Œå…¨ç†è§£æ¯¿U方法ã€? 请å‚é˜?ä¸‹è² éƒ¨åˆ†èŽ·å¾—å®Œæ•´ä¾‹åæºä»£ç 。请å‚阅 å‚考资æ–?/a>åQŒä¸‹è½?Struts MVC å’?Spring 框架ã€?/font>
ä¸ÞZ»€ä¹?Spring ˜q™ä¹ˆäº†ä¸èµøP¼Ÿ
Spring 的创立è€?Rod Johnson 以一¿U批判的眼光看待 Javaâ„?ä¼ä¸šè½¯äšgå¼€å‘,òq¶ä¸”æè®®å¾ˆå¤šä¼ä¸šéšùN¢˜éƒ½èƒ½å¤Ÿé€šè¿‡æˆ˜ç•¥åœîC‹Éç”?IOC 模å¼åQˆä¹Ÿ¿UîC½œä¾èµ–注入åQ‰æ¥è§£å†³ã€‚当 Rod 和一个具有奉献精¼œžçš„开放æºç å¼€å‘者团队将˜q™ä¸ªç†è®ºåº”用于实跉|—¶åQŒç»“果就产生äº?Spring 框架。简a€ä¹‹ï¼ŒSpring 是一个轻型的容器åQŒåˆ©ç”¨å®ƒå¯ä»¥ä½¿ç”¨ä¸€ä¸ªå¤–éƒ?XML é…置文äšg方便地将对象˜qžæŽ¥åœ¨ä¸€èµ—÷€‚æ¯ä¸ªå¯¹è±¡éƒ½å¯ä»¥é€šè¿‡æ˜„¡¤ºä¸€ä¸? JavaBean 属性收åˆîC¸€ä¸ªåˆ°ä¾èµ–对象的引用,留给æ‚(zh¨¨n)¨çš„½Ž€å•ä“QåŠ¡å°±åªæ˜¯åœ¨ä¸€ä¸?XML é…置文äšgä¸æŠŠå®ƒä»¬˜qžæŽ¥å¥½ã€?/font>
![]() |
|
ä¾? 赖注入是一个强大的ç‰ÒŽ(gu¨©)€§ï¼Œä½†æ˜¯ Spring 框架能够æä¾›æ›´å¤šç‰ÒŽ(gu¨©)€§ã€‚Spring 支æŒå¯æ’拔的事务½Ž¡ç†å™¨ï¼Œå¯ä»¥¾l™æ?zh¨¨n)¨çš„äº‹åŠ¡å¤„ç†æä¾›æ›´òq¿æ³›çš„选择范围。它集æˆäº†é¢†å…ˆçš„æŒä¹…æ€§æ¡†æžÓž¼Œòq¶ä¸”æä¾›ä¸€ä¸ªä¸€è‡´çš„异常层次¾l“构。Spring ˜q˜æä¾›äº†ä¸€¿Uä‹É用é¢å‘æ–¹é¢ä»£ç 代替æ£å¸¸çš„é¢å‘对象代ç çš„ç®€å•æœºåˆ¶ã€?/font>
Spring AOP å…许æ‚(zh¨¨n)¨ä‹Éç”?i>拦截å™?/i> 在一个或多个执行点上拦截应用½E‹åºé€»è¾‘ã€‚åŠ å¼ºåº”ç”¨ç¨‹åºåœ¨æ‹¦æˆªå™¨ä¸çš„æ—¥å¿—记录逻辑ä¼?x¨¬)äñ”生一个更å¯è¯»çš„ã€å®žç”¨çš„代ç 基础åQŒæ‰€ä»¥æ‹¦æˆªå™¨òq¿æ³›ç”¨äºŽæ—¥å¿—记录。æ?zh¨¨n)¨å¾ˆå¿«ž®×ƒ¼?x¨¬)看到åQŒäØ“(f¨´)äº†å¤„ç†æ¨ªåˆ‡å…³æ³¨ç‚¹åQŒSpring AOP å‘布了它自己的拦截器åQŒæ?zh¨¨n)¨ä¹Ÿå¯ä»¥ç¼–写æ‚(zh¨¨n)¨è‡ªå·±çš„æ‹¦æˆªå™¨ã€?/font>
![]() |
ä¸? Struts ç›æ€¼¼åQŒSpring å¯ä»¥ä½œäØ“(f¨´)一ä¸?MVC å®žçŽ°ã€‚è¿™ä¸¤ç§æ¡†æž¶éƒ½å…·æœ‰è‡ªå·Þqš„优点和缺点,ž®½ç®¡å¤§éƒ¨åˆ†ähåŒæ„ Struts åœ?MVC æ–šw¢ä»ç„¶æ˜¯æœ€å¥½çš„。很多开å‘团队已¾lå¦ä¼?x¨¬)在旉™—´ç´§è¿«çš„æ—¶å€™åˆ©ç”?Struts ä½œäØ“(f¨´)æž„é€ é«˜å“质软äšg的基¼‹€ã€‚Struts å…ähœ‰å¦‚æ¤å¤§çš„æŽ¨åŠ¨åŠ›ï¼Œä»¥è‡³äºŽå¼€å‘å›¢é˜Ÿå®æ„¿æ•´å?Spring æ¡†æž¶çš„ç‰¹æ€§ï¼Œè€Œä¸æ„¿æ„è½¬æ¢æˆ?Spring MVC。没必覘q›è¡Œè½¬æ¢å¯ÒŽ(gu¨©)‚¨æ¥è¯´æ˜¯ä¸€ä¸ªå¥½æ¶ˆæ¯ã€‚Spring æž¶æž„å…许æ‚(zh¨¨n)¨å°† Struts ä½œäØ“(f¨´) Web 框架˜qžæŽ¥åˆ°åŸºäº?Spring 的业务和æŒä¹…层。最åŽçš„¾l“æžœž®±æ˜¯çŽ°åœ¨ä¸€åˆ‡æ¡ä»‰™ƒ½å…·å¤‡äº†ã€?/font>
在接下æ¥çš„å°½Hé—¨ä¸ï¼Œæ‚(zh¨¨n)¨å°†ä¼?x¨¬)了解到三秞?Struts MVC æ•´åˆåˆ?Spring 框架的方法。我ž®†æ½Cºæ¯¿U方法的¾~ºé™·òq¶ä¸”å¯ÒŽ(gu¨©)¯”它们的优ç‚V€?一旦æ?zh¨¨n)¨äº†è§£åˆ°æ‰€æœ‰ä¸‰¿U方法的作用åQŒæˆ‘ž®†ä¼š(x¨¬)呿?zh¨¨n)¨å±•示一个ä×o人兴奋的应用½E‹åºåQŒè¿™ä¸ªç¨‹åºä‹Éç”¨çš„æ˜¯è¿™ä¸‰ç§æ–ÒŽ(gu¨©)³•䏿ˆ‘最喜欢的一¿Uã€?/font>
![]() |
接下æ¥çš„æ¯ç§æ•´åˆæŠ€æœ¯ï¼ˆæˆ–者çªé—¨ï¼‰éƒ½æœ‰è‡ªå·±çš„优点和特点。我å爱其ä¸çš„一¿U,但是我知é“这三ç§éƒ½èƒ½å¤ŸåŠ æ·±æ?zh¨¨n)¨å?Struts å’?Spring çš„ç†è§£ã€‚在处ç†å„ç§ä¸åŒæƒ…况的时候,˜q™å°†¾l™æ?zh¨¨n)¨æä¾›ä¸€ä¸ªå¹¿é˜”的选择范围。方法如下:(x¨¬)
ActionSupport
¾cÀL•´å?StructsDelegatingRequestProcessor
覆盖 Struts � RequestProcessor
Action
½Ž¡ç†å§”托¾l?Spring æ¡†æž¶æ— è®ºæ‚(zh¨¨n)¨ä‹É用哪¿U技术,都需è¦ä‹Éç”?Spring çš?ContextLoaderPlugin
�Struts �ActionServlet
è£…è² Spring 应用½E‹åºçŽ¯å¢ƒã€‚å°±åƒæ·»åŠ ä“Q何其他æ’ä»¶ä¸€æ øP¼Œ½Ž€å•åœ°å‘æ?zh¨¨n)¨ç?struts-config.xml æ–‡äšgæ·ÕdŠ è¯¥æ’ä»Óž¼Œå¦‚下所½Cºï¼š(x¨¬)
|
å‰é¢å·²ç»æåˆ°˜q‡ï¼Œåœ?ä¸‹è² éƒ¨åˆ†åQŒæ?zh¨¨n)¨èƒ½å¤Ÿæ‰‘Öˆ°˜q™ä¸‰ä¸ªå®Œå…¨å¯ä½¿ç”¨çš„例å的完整æºä»£ç 。æ¯ä¸ªä¾‹å都ä¸ÞZ¸€ä¸ªä¹¦¾cæœç´¢åº”ç”¨ç¨‹åºæä¾›ä¸€¿Uä¸åŒçš„ Struts å’?Spring çš„æ•´åˆæ–¹æ³•。æ?zh¨¨n)¨å¯ä»¥åœ¨è¿™é‡Œçœ‹åˆîC¾‹åçš„è¦ç‚¹åQŒä½†æ˜¯æ?zh¨¨n)¨ä¹Ÿå¯ä»¥ä¸‹è½½åº”用程åºä»¥æŸ¥çœ‹æ‰€æœ‰çš„¾l†èŠ‚ã€?/font>
![]() |
½Hé—¨ 1. 使用 Spring çš?ActionSupport
手动创å¾ä¸€ä¸?Spring 环境是一¿Uæ•´å?Struts å’?Spring 的最直观的方å¼ã€‚䨓(f¨´)了ä‹É它å˜å¾—æ›´½Ž€å•,Spring æä¾›äº†ä¸€äº›å¸®åŠ©ã€‚äØ“(f¨´)了方便地获得 Spring 环境åQ?font size="3">org.springframework.web.struts.ActionSupport
¾cÀL供了一ä¸?getWebApplicationContext()
æ–ÒŽ(gu¨©)³•。æ?zh¨¨n)¨æ‰€åšçš„åªæ˜¯ä»?Spring çš?ActionSupport
è€Œä¸æ˜?font size="3"> Struts Action
¾cÀL‰©å±•æ?zh¨¨n)¨çš„动作,如清å?1 所½Cºï¼š(x¨¬)
|
让我们快速æ€è€ƒä¸€ä¸‹è¿™é‡Œåˆ°åº•å‘生了什么。在 (1) 处,我通过ä»?Spring çš?ActionSupport
¾c»è€Œä¸æ˜?Struts çš?Action
¾c»è¿›è¡Œæ‰©å±•,创å¾äº†ä¸€ä¸ªæ–°çš?Action
ã€?/font>åœ?(2) 处,我ä‹Éç”?getWebApplicationContext()
æ–ÒŽ(gu¨©)³•获得一ä¸?ApplicationContext
ã€?/font>ä¸ÞZº†èŽ·å¾—ä¸šåŠ¡æœåŠ¡åQŒæˆ‘使用åœ?(2) 处获得的环境åœ?(3) 处查找一ä¸?Spring beanã€?/font>
˜q? ¿U技术很½Ž€å•åÆˆä¸”æ˜“äºŽç†è§£ã€‚ä¸òq¸çš„æ˜¯ï¼Œå®ƒå°† Struts 动作ä¸?Spring 框架耦åˆåœ¨ä¸€èµ—÷€‚如果æ?zh¨¨n)¨æƒÏx›¿æ¢æŽ‰ SpringåQŒé‚£ä¹ˆæ?zh¨¨n)¨å¿…é¡»é‡å†™ä»£ç ã€‚åÆˆä¸”ï¼Œç”׃ºŽ Struts 动作ä¸åœ¨ Spring 的控制之下,所以它ä¸èƒ½èŽ·å¾— Spring AOP 的优åŠÑ€‚当使用多é‡ç‹¬ç«‹çš?Spring 环境æ—Óž¼Œ˜q™ç§æŠ€æœ¯å¯èƒ½æœ‰ç”¨ï¼Œä½†æ˜¯åœ¨å¤§å¤šæ•°æƒ…况下,˜q™ç§æ–ÒŽ(gu¨©)³•ä¸å¦‚å¦å¤–ä¸¤ç§æ–ÒŽ(gu¨©)³•åˆé€‚ã€?/font>
![]() |
½Hé—¨ 2. 覆盖 RequestProcessor
ž®?Spring ä»?Struts 动作ä¸åˆ†¼›ÀL˜¯ä¸€ä¸ªæ›´å·§å¦™çš„设计选择。分¼›Èš„一¿U方法是使用 org.springframework.web.struts.DelegatingRequestProcessor
¾cÀL¥è¦†ç›– Struts çš?font size="3"> RequestProcessor
处熽E‹åºåQŒå¦‚æ¸…å• 2 所½Cºï¼š(x¨¬)
|
我利用了 <controller>
æ ‡è®°æ¥ç”¨ DelegatingRequestProcessor
覆盖默认�Struts RequestProcessor
ã€?/font>ä¸‹ä¸€æ¥æ˜¯åœ¨æˆ‘çš?Spring é…置文äšg䏿³¨å†Œè¯¥åŠ¨ä½œåQŒå¦‚æ¸…å• 3 所½Cºï¼š(x¨¬)
|
注æ„åQšåœ¨ (1) 处,我ä‹É用å¿U°å±žæ€§æ³¨å†Œäº†ä¸€ä¸?beanåQŒä»¥åŒšw… struts-config åŠ¨ä½œæ˜ å°„åç§°ã€?code>SearchSubmit 动作æç¤ºäº†ä¸€ä¸?JavaBean 属性,å…许 Spring 在è¿è¡Œæ—¶å¡«å……属性,如清å?4 所½Cºï¼š(x¨¬)
|
在清å?4 ä¸ï¼Œæ‚(zh¨¨n)¨å¯ä»¥äº†è§£åˆ°å¦‚ä½•åˆ›å¾ Struts 动作。在 (1) 处,我创å»ÞZº†ä¸€ä¸?JavaBean 属性ã€?code>DelegatingRequestProcessorè‡? 动地é…ç½®˜q™ç§å±žæ€§ã€‚è¿™¿U设计ä‹É Struts 动作òq¶ä¸çŸ¥é“它æ£è¢?Spring ½Ž¡ç†åQŒåƈ且ä‹Éæ‚(zh¨¨n)¨èƒ½å¤Ÿåˆ©ç”?Sping çš„åŠ¨ä½œç®¡ç†æ¡†æž¶çš„æ‰€æœ‰ä¼˜ç‚V€‚由于æ?zh¨¨n)¨ç?Struts 动作注æ„ä¸åˆ° Spring çš„å˜åœ¨ï¼Œæ‰€ä»¥æ?zh¨¨n)¨ä¸éœ€è¦é‡å†™æ?zh¨¨n)¨ç?Struts ä»£ç ž®±å¯ä»¥ä‹É用其他控制åè½¬å®¹å™¨æ¥æ›¿æ¢æŽ?Springã€?/font>
DelegatingRequestProcessor
æ–ÒŽ(gu¨©)³•的确比第一¿U方法好åQŒä½†æ˜¯ä»ç„¶å˜åœ¨ä¸€äº›é—®é¢˜ã€‚如果æ?zh¨¨n)¨ä½¿ç”¨ä¸€ä¸ªä¸åŒçš„ RequestProcessor
åQ?/font>åˆ™éœ€è¦æ‰‹åŠ¨æ•´å?Spring çš?DelegatingRequestProcessor
ã€?/font>æ·ÕdŠ çš„ä»£ç 会(x¨¬)é€ æˆ¾l´æŠ¤çš„éº»çƒ¦åÆˆä¸”å°†æ¥ä¼š(x¨¬)é™ä½Žæ‚(zh¨¨n)¨çš„应用½E‹åºçš„絋zÀL€§ã€‚æ¤å¤–,˜q˜æœ‰˜q‡ä¸€äº›ä‹É用一¾pÕdˆ—命ä×oæ¥ä»£æ›?Struts RequestProcessor
çš„ä¼ é—…R€?˜q™ç§æ”¹å˜ž®†ä¼š(x¨¬)对这¿Uè§£å†Ïx–¹æ³•çš„ä½¿ç”¨å¯¿å‘½é€ æˆè´Ÿé¢çš„媄å“ã€?/font>
![]() |
½Hé—¨ 3. ž®†åŠ¨ä½œç®¡ç†å§”托给 Spring
一个更好的解决æ–ÒŽ(gu¨©)³•是将 Strut 动作½Ž¡ç†å§”托¾l?Spring。æ?zh¨¨n)¨å¯ä»¥é€šè¿‡åœ?struts-config
åŠ¨ä½œæ˜ å°„ä¸æ³¨å†Œä¸€ä¸ªä»£ç†æ¥å®žçŽ°ã€‚ä»£ç†è´Ÿè´£åœ¨ Spring çŽ¯å¢ƒä¸æŸ¥æ‰?Struts 动作。由于动作在 Spring 的控制之下,所以它å¯ä»¥å¡«å……动作çš?JavaBean 属性,òq¶äØ“(f¨´)应用诸如 Spring çš?AOP 拦截器之¾cÈš„ç‰ÒŽ(gu¨©)€§å¸¦æ¥äº†å¯èƒ½ã€?
æ¸…å• 5 ä¸çš„ Action
¾cÖM¸Žæ¸…å• 4 ä¸çš„相åŒã€‚但æ˜?struts-config 有一些ä¸åŒï¼š(x¨¬)
|
æ¸…å• 5 是一个典型的
struts-config.xml æ–‡äšgåQŒåªæœ‰ä¸€ä¸ªå°ž®çš„差别。它注册 Spring
代熾cÈš„åç§°åQŒè€Œä¸æ˜¯å£°æ˜ŽåŠ¨ä½œçš„¾cÕdåQŒå¦‚åQ?åQ‰å¤„所½Cºã€‚DelegatingActionProxy ¾cÖM‹Éç”¨åŠ¨ä½œæ˜ ž®„å¿U°æŸ¥æ‰?Spring
环境ä¸çš„动作。这ž®±æ˜¯æˆ‘们使用 ContextLoaderPlugIn
声明的环境�/font>
ž®†ä¸€ä¸?Struts 动作注册ä¸ÞZ¸€ä¸?Spring bean 是éžå¸¸ç›´è§‚çš„åQŒå¦‚æ¸…å• 6 所½Cºã€‚æˆ‘åˆ©ç”¨åŠ¨ä½œæ˜ å°„ä½¿ç”¨ <bean>
æ ‡è®°çš„å¿U°å±žæ€§ï¼ˆåœ¨è¿™ä¸ªä¾‹å䏿˜?"/searchSubmit
"åQ‰ç®€å•地创å¾äº†ä¸€ä¸?bean。这个动作的 JavaBean 属性åƒä»ÖM½• Spring bean ä¸€æ ¯‚¢«å¡«å……åQ?
|
![]() |
动作委托解决æ–ÒŽ(gu¨©)³•æ˜¯è¿™ä¸‰ç§æ–ÒŽ(gu¨©)³•䏿œ€å¥½çš„。Struts 动作ä¸äº†è§?SpringåQŒä¸å¯¹ä»£ç 作ä»ÖM½•改嘞®±å¯ç”¨äºŽé?Spring 应用½E‹åºä¸ã€?font size="3">RequestProcessor
的改å˜ä¸ä¼?x¨¬)媄å“它åQŒåƈ且它å¯ä»¥åˆ©ç”¨ Spring AOP ç‰ÒŽ(gu¨©)€§çš„优点ã€?
åŠ¨ä½œå§”æ‰˜çš„ä¼˜ç‚¹ä¸æ¢å¦‚æ¤ã€‚一旦让 Spring 控制æ‚(zh¨¨n)¨çš„ Struts 动作åQŒæ?zh¨¨n)¨ž®±å¯ä»¥ä‹Éç?Spring ¾l™åŠ¨ä½œè¡¥å……æ›´å¼ºçš„‹zÕdŠ›ã€‚ä¾‹å¦‚ï¼Œæ²¡æœ‰ Spring çš„è¯åQŒæ‰€æœ‰çš„ Struts 动作都必™åÀL˜¯¾U¿ç¨‹å®‰å…¨çš„。如果æ?zh¨¨n)¨è®„¡½?<bean>
æ ‡è®°çš?singleton
å±žæ€§äØ“(f¨´)“falseâ€ï¼Œé‚£ä¹ˆä¸ç®¡ç”¨ä½•¿U方法,æ‚(zh¨¨n)¨çš„应用½E‹åºéƒ½å°†åœ¨æ¯ä¸€ä¸ªè¯·æ±‚上有一个新生æˆçš„动作对象。æ?zh¨¨n)¨å¯èƒ½ä¸éœ€è¦è¿™¿U特性,但是把它攑֜¨æ‚(zh¨¨n)¨çš„工具½Ž×ƒ¸ä¹?
很好。æ?zh¨¨n)¨ä¹Ÿå¯ä»¥åˆ©ç?Spring 的生命周期方法。例如,当实例化 Struts 动作æ—Óž¼Œ<bean>
æ ‡è®°çš?init-method 属性被用于˜q行一个方法。类似地åQŒåœ¨ä»Žå®¹å™¨ä¸åˆ 除 bean 之å‰åQŒdestroy-method 属性执行一个方法。这些方法是½Ž¡ç†æ˜‚贵对象的好办法åQŒå®ƒä»¬ä»¥ä¸€¿U与 Servlet 生命周期相åŒçš„æ–¹å¼è¿›è¡Œç®¡ç†ã€?/font>
![]() |
å‰? é¢æåˆ°è¿‡åQŒé€šè¿‡ž®?Struts 动作委托¾l?Spring 框架而整å?Struts å’?Spring 的一个主è¦çš„优点是:(x¨¬)æ‚(zh¨¨n)¨å¯ä»¥å°† Spring çš?AOP 拦截器应用于æ‚(zh¨¨n)¨çš„ Struts 动作。通过ž®?Spring 拦截器应用于 Struts 动作åQŒæ?zh¨¨n)¨å¯ä»¥ç”¨æœ€ž®çš„代äh(hu¨¢n)å¤„ç†æ¨ªåˆ‡å…Ïx³¨ç‚V€?/font>
虽然 Spring æä¾›å¾ˆå¤šå†…ç½®æ‹¦æˆªå™¨ï¼Œä½†æ˜¯æˆ‘å°†å‘æ?zh¨¨n)¨å±•示如何创å¾è‡ªå·±çš„æ‹¦æˆªå™¨òq¶æŠŠå®ƒåº”用于一ä¸?Struts åŠ¨ä½œã€‚äØ“(f¨´)了ä‹É用拦截器åQŒæ?zh¨¨n)¨éœ€è¦åšä¸‰äšg事:(x¨¬)
˜q™çœ‹èµäh¥éžå¸¸½Ž€å•çš„å‡ å¥è¯å´éžå¸¸å¼ºå¤§ã€‚例如,在清å?7 ä¸ï¼Œæˆ‘䨓(f¨´) Struts 动作创å¾äº†ä¸€ä¸ªæ—¥å¿—记录拦截器ã€? ˜q™ä¸ªæ‹¦æˆªå™¨åœ¨æ¯ä¸ªæ–ÒŽ(gu¨©)³•è°ƒç”¨ä¹‹å‰æ‰“å°ä¸€å¥è¯åQ?/font>
|
˜q™ä¸ªæ‹¦æˆªå™¨éžå¸¸ç®€å•ã€?code>before() æ–ÒŽ(gu¨©)³•åœ¨æ‹¦æˆªç‚¹ä¸æ¯ä¸ªæ–¹æ³•之å‰è¿è¡Œã€‚在本例ä¸ï¼Œå®ƒæ‰“å°å‡ºä¸€å¥è¯åQŒå…¶å®žå®ƒå¯ä»¥åšæ?zh¨¨n)¨æƒ›_šçš„ä“Q何事。下一æ¥å°±æ˜¯åœ¨ Spring é…置文äšg䏿³¨å†Œè¿™ä¸ªæ‹¦æˆªå™¨åQŒå¦‚æ¸…å• 8 所½Cºï¼š(x¨¬)
|
æ‚(zh¨¨n)¨å¯èƒ½å·²¾l注æ„åˆ°äº†ï¼Œæ¸…å• 8 扩展äº?æ¸…å• 6 䏿‰€½Cºçš„应用½E‹åºä»¥åŒ…å«ä¸€ä¸ªæ‹¦æˆªå™¨ã€‚具体细节如下:(x¨¬)
<value>
æ ‡è®°ã€?/font>ž®±æ˜¯˜q™æ ·ã€‚å°±åƒè¿™ä¸ªä¾‹å所展示的,ž®†æ?zh¨¨n)¨ç?Struts 动作¾|®äºŽ Spring æ¡†æž¶çš„æŽ§åˆ¶ä¹‹ä¸‹ï¼Œä¸ºå¤„ç†æ?zh¨¨n)¨ç?Struts 应用½E‹åºæä¾›äº†ä¸€¾pÕdˆ—全新的选择。在本例ä¸ï¼Œä½¿ç”¨åŠ¨ä½œå§”æ‰˜å¯ä»¥è½ÀL¾åœ°åˆ©ç”?Spring 拦截器æé«?Struts 应用½E‹åºä¸çš„æ—¥å¿—记录能力ã€?/font>
![]() |
在本文ä¸åQŒæ?zh¨¨n)¨å·²ç»å¦ä¹?f¨¤n)了将 Struts 动作整åˆåˆ?Spring 框架ä¸çš„三秽H门。ä‹Éç”?Spring çš?ActionSupport
æ¥æ•´å?StrutsåQˆç¬¬ä¸€¿Uçªé—¨ä¸ž®±æ˜¯˜q™æ ·åšçš„åQ‰ç®€å•而快æøP¼Œä½†æ˜¯ä¼?x¨¬)å°?Struts 动作ä¸?Spring 框架耦åˆåœ¨ä¸€èµ—÷€‚如果æ?zh¨¨n)¨éœ€è¦å°†åº”用½E‹åº¿UÀL¤åˆîC¸€ä¸ªä¸åŒçš„æ¡†æž¶åQŒåˆ™éœ€è¦é‡å†™ä»£ç 。第二ç§è§£å†³æ–ÒŽ(gu¨©)³•通过委托 RequestProcessor
巧妙地解开代ç 的耦åˆåQŒä½†æ˜¯å®ƒçš„坿‰©å±•性ä¸å¼ºï¼Œòq¶ä¸”å½?Struts çš?RequestProcessor
å˜æˆä¸€¾pÕdˆ—命ä×oæ—Óž¼Œ˜q™ç§æ–ÒŽ(gu¨©)³•ž®±æŒ¾lä¸äº†å¾ˆé•¿æ—¶é—´ã€‚ç¬¬ä¸‰ç§æ–ÒŽ(gu¨©)³•æ˜¯è¿™ä¸‰ç§æ–ÒŽ(gu¨©)³•䏿œ€å¥½çš„åQšå°† Struts 动作委托¾l?Spring 框架å¯ä»¥ä½¿ä»£ç 解耦,从而ä‹Éæ‚(zh¨¨n)¨å¯ä»¥åœ¨æ‚(zh¨¨n)¨çš„ Struts 应用½E‹åºä¸åˆ©ç”?Spring 的特性(比如日志记录拦截器)ã€?/p>
ä¸‰ç§ Struts-Spring 整刽Hé—¨ä¸çš„æ¯ä¸€¿U都被实现æˆä¸€ä¸ªå®Œæ•´å¯ç”¨çš„应用½E‹åºã€‚请å‚阅 ä¸‹è² éƒ¨åˆ†ä»”ç»†ç ”ç©¶å®ƒä»¬ã€?/font>
![]() |
æè¿° | åå— | å¤§å° | ä¸‹è²æ–ÒŽ(gu¨©)³• |
---|---|---|---|
ActionSupport sample code | j-sr2-actionsupport.zip | 5 MB | FTP |
RequestProcessor sample code | j-sr2-requestprocessor.zip | 5 MB | FTP |
Delegate sample code | j-sr2-delegate.zip | 5 MB | FTP |