﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-过年-&gt; 过年了！！！天天过年-随笔分类-AOP分类</title><link>http://www.blogjava.net/jackylpz/category/8341.html</link><description>目标 --&gt; 每天都要象过年一样！！！</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:47:16 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:47:16 GMT</pubDate><ttl>60</ttl><item><title>谈谈蜂蜜的好处和美容用法 </title><link>http://www.blogjava.net/jackylpz/archive/2006/12/21/89304.html</link><dc:creator>过年</dc:creator><author>过年</author><pubDate>Thu, 21 Dec 2006 08:12:00 GMT</pubDate><guid>http://www.blogjava.net/jackylpz/archive/2006/12/21/89304.html</guid><wfw:comment>http://www.blogjava.net/jackylpz/comments/89304.html</wfw:comment><comments>http://www.blogjava.net/jackylpz/archive/2006/12/21/89304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackylpz/comments/commentRss/89304.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackylpz/services/trackbacks/89304.html</trackback:ping><description><![CDATA[在美容版也逛了不少时候了，收集了不少JMS的护肤经验和美容知识，自己也整理了一番，因为现在我也在喝蜂蜜水，吃蜂蜜，所以就拿出蜂蜜的一点常识来与大家分享分享，欢迎有蜂蜜美容经验的JMS来聊聊，说说大家的用法，交流交流经验！ <br />美容佳品－－花粉和蜂花粉 <br />一、常食蜂蜜可保健康长寿 <br />蜂蜜是工蜂采花蜜在巢中酿成。根据采蜜季节不同而有春、夏、冬蜜之分，以冬蜜质量最好。从野外如树上、岩洞等采取者称为野蜂蜜，又叫石蜜或岩蜜，质量最好，但产量有限，因而市面上见到的多是人工养蜂所取的蜂蜜。蜂蜜对人体健康的好处早已为人们认识。《神农本草经》把蜜列为有益于人的上品，古希腊人认为蜂蜜是“天赐的礼物”，而印度的《吠陀经》则说蜂蜜可益寿延年。我国梁代名医陶弘景说过：“道家之丸，多用蜂蜜，修仙之人，单食蜂蜜，谓能长生。”这种说法虽有夸张之嫌，但仍充分说明了蜂蜜在营养及医疗上的作用。 <br /><br />营养分析表明，蜂蜜中含有大约35％葡萄糖，40％果糖，这两种糖都可以不经过消化作用而直接被人体所吸收利用。蜂蜜还含有与人体血清浓度相近的多种无机盐，还含有一定数量的维生素B1、B2、B6及铁、钙、铜、锰、磷、钾等。蜂蜜中含有淀粉酶、脂肪酶、转化酶等，是食物中含酶最多的一种。酶是帮助人体消化、吸收和一系列物质代谢及化学变化的促进物。蜂蜜的气味芳香可口，从营养和保健价值来看，不仅是滋补、益寿延年之品，又是治病之良药。 <br /><br />蜂蜜作为药用，在中国已有数千年的历史，功效良好。明代医学家李时珍指出：“蜂蜜入药之功有五：清热也；补中也；润燥也；解毒也；止痛也。生则性凉，故能清热。熟则性温，故能补中。甘而和平，故能解毒。柔而濡泽，故能润燥。缓可以去急，故能止心腹肌肉创伤之痛，和可以致中，故能调和百药，而与甘草同功。” <br /><br />在临床上，蜂蜜不仅可以治疗胃炎，还可以在蜂蜜中加上某些药物治疗溃疡病。如每晨用温开水冲蜂蜜6克，空腹服或用丹参15克，木香6克，炙甘草6克，煎汁冲蜂蜜服，可治疗胃十二指肠溃疡以及各种胃痛症。为什么蜂蜜有此疗效呢？原来蜂蜜是一种潜在的碱性食物，它所含的锰等无机盐，有促进食物的消化和同化作用，从而减轻胃肠负担而缓解症状。 <br /><br />若用蜂蜜30克，炒枣仁末15克，分2次冲服，有很好的宁心安神作用，可治心慌、失眠、健忘、多梦。如加入五味子9克，柏子仁9克，还可以增强记忆力，改善智能。 <br /><br />如果高血压、肝脏病、心脏病患者，早晚空腹饮1杯蜂蜜水，对上述疾病均有一定的疗效。若用丹参、首乌各15克，水煎取汁，冲蜂蜜1汤匙内服，功效更佳。用蜂蜜30克，精盐3克，加凉开水调匀，每天早晚各服1次，有良好的润肠通便作用，尤其适宜于老年人、体弱者、病后有便秘的患者。 <br /><br />当有呼吸道病变，出现阴虚肺燥，久咳无痰时，可用款冬花10克，百合15克，玉竹15克，煎水取汁，调入蜂蜜2汤匙饮用。也可在空心雪梨中放进蜂蜜适量，隔水炖服，可消除因气候干燥引起的咽喉干燥、发痒的感觉，并有利于气管中的积痰顺利咳出。因此，呼吸系统疾病治好之后，如能经常饮服蜂蜜，不但可防止旧病复发，还有强壮之功。 <br /><br />对于生长期的儿童，蜂蜜常是他们紧喜爱的食物，蜂蜜中含有铁和叶酸，常吃可以预防和纠正儿童的贫血。 <br /><br />此外，蜂蜜还有润肌白肤的作用，由于蜂蜜营养丰富而多样化，又易被人体吸收利用，对于皮肤有滋润作用，尤其是冬季气候干燥时，多吃蜂蜜能防止皮肤皲裂。很多高级的化妆品，是由蜂蜜提炼而成的，可见它对皮肤有良好的保护作用。如能长期内服及外敷外涂，有助美容，还能益寿延年。 <br />二、自制蜂蜜面膜 <br />蜂蜜黄瓜面膜（美白除皱） <br />取鲜黄瓜汁加入奶粉、蜂蜜适量，风油精数滴调匀后涂面，20－30分钟后洗净，或将黄瓜洗净切薄片直接贴于脸部，具有润肤、增白、除皱的作用。 <br />蜂蜜白芷面膜（去斑美白） <br />1、取白芷10克，白附子10克，共研细末，加水和蜂蜜适量调奖敷面，20分钟后洗净，有祛皱、消斑、增白作用，适用于面部色素沉着或黄褐增斑患者。 <br />2、材料：白芷6克；蛋黄1个；蜂蜜 1大匙；小黄瓜汁 1小匙；橄榄油3小匙。 <br />做法： <br />1.先将白芷粉末，装在碗中，加入蛋黄搅均匀。 <br />2.再加入蜂蜜和小黄瓜汁，调匀后涂抹于脸上，约二十分钟后，再用清水冲洗干净。 <br />3.脸洗净后，用化妆棉沾取橄榄油，敷于脸上，约5分钟。 <br />4.然后再以热毛巾覆盖在脸上，此时化妆棉不需拿掉。 <br />5.等毛巾冷却后，再把毛巾和化妆棉取下，洗净脸部即可。 <br />蜂蜜珍珠粉面膜 <br />准备一个干净的小瓶子，倒入大半瓶珍珠粉，再缓缓倒入蜂蜜，边倒边搅拌，使蜂蜜和珍珠粉充分混合，注意蜂蜜不要倒得过多，调成糊状即可。这样面膜就做好了。 <br />使用前，先用温水把脸洗净，然后用小棉签蘸着调好得面膜均匀得涂在脸上，不要太厚，薄薄一层即可，过1-2小时后洗掉，可以使脸光滑，有光泽。 <br />红酒蜂蜜面膜（美白滋养） <br />红酒中的葡萄酒酸就是果酸，能够促进角质新城代谢，淡化色素，让皮肤更白皙光滑。蜂蜜具有保湿和滋养的功效。 <br />方法：将一小杯红酒加2到3勺子蜂蜜调至浓稠的状态后，均匀的敷在脸上，八分干后用温水洗干净。 <br />注意：酒精过敏的人慎用！ <br /><br />蜂蜜双仁面膜（去斑） <br /><br />冬瓜仁内含脂肪油酸、瓜胺酸等成分，有淡斑的功效。桃仁有丰富的维他命E、维他命B6，不仅帮助肌肤抗氧化，还能减少紫外线的伤害。蜂蜜的保湿效果和滋养的功效，让面膜的效果更好。 <br />方法：将冬瓜子仁、桃仁晒干后磨成细分，加入适量蜂蜜混合成粘稠膏状，每晚睡前涂在斑点上，第二天早晨洗净，敷三个星期后，斑点会逐渐变淡，治疗时要注意防晒。 <br /><br />蜂蜜甘油面膜（补水） <br /><br />蜂蜜一勺，甘油一勺，对两勺水，充分混合，即成面膜膏，使用时轻轻涂于脸部和颈部，形成薄膜，20－25分钟后小心将面膜去掉即可，这种面膜可用于普通、干燥性衰萎皮肤，每周1-2次，30－45天一个疗程。 <br /><br />蜂蜜番茄面膜（美白除皱） <br /><br />先将番茄压烂取汁，加入适量蜂蜜和少许面粉调成膏状，涂于面部保持20－30分钟，具有使皮肤滋润、白嫩、柔软的作用，长期使用还具有祛斑除皱和治疗皮肤痤疮等功能。 <br /><br />蜂蜜柠檬面膜（防晒） <br /><br />生鸡蛋一个，蜂蜜一小匙，柠檬半个，面粉适量，混合后搅拌成膏状，敷面后入睡，第二天用温水洗净。坚持使用有较显著的防晒作用。 <br /><br />蜂蜜敷面 <br /><br />蜂蜜能供给皮肤养分并能保持肌肤弹性，因此也被称为是“营养敷面”。将蜂蜜加在面粉或麦粉之中，搅拌成糊状，在洗完脸后敷在脸部，约过30分钟后用温水洗掉便可以了。因蜂蜜中有异味，可适当加入几滴柠檬汁以减少味道。 <br /><br />蜂蜜酸奶面膜(收敛毛孔) <br /><br />1、蜂蜜和酸奶以1：1的比例拌在一起，涂在脸上，15分钟后用清水洗去即可，此款面膜是收敛毛孔的。 <br /><br />2、酸牛奶、蜂蜜、柠檬汁各100毫克，加5粒维生素E调匀，敷面并保留15分钟,然后用清水洗净。此法可促进皮表上的死细胞脱落，新细胞再生，从而达到健美皮肤的目的。 <br /><br />三、蜂蜜洗面美容法 <br /><br />取新鲜、纯净、浅色、不易结晶的优质天然蜂蜜，装入小口美容用玻璃容器内（炎热夏季须放置冰箱贮藏室内）。 <br /><br />每次洗脸时，先用温水清洗面，然后倒出适量蜂蜜于手掌心，双掌对搓（如果感觉太稠，可用指尖蘸取少量水混合均匀），然后双手在面部向上向外打圈按摩，重点在下述几个部位细致按摩：眼角鱼尾纹处，用双手指肚作环状按摩；额部抬头纹作垂直按摩；鼻冀两侧环状按摩，鼻梁边缘作上下按摩；颈项部位由下而上按摩；耳朵两侧上下按摩；口部四周作八字或倒八字按摩。按摩完毕，用温水清洗干净，涂搽营养护肤品。 <br /><br />蜂蜜洗面不仅简单方便，而且美容效果十分显著，坚持1周以上就能明显感觉到面部洁白细腻，自然红润，富有光泽，皱纹减少。使用后肌肤无紧绷感，舒适自然，长期使用，效果尤其明显。蜂蜜洗面还对皮肤过敏、皮肤干燥具有防治效果。同时，每天早晚内服王浆蜜，效果更好。 <br /><br />四、蜂蜜减肥法 <br /><br />蜂蜜是一种天然的营养剂，它包含可以燃烧人体能量的良质糖分、维生素以及矿物质等。在一日三餐中，只要加入一点蜂蜜，就可以避免脂肪在人体中积聚下来。 <br /><br />蜂蜜具有优良的杀菌效果与解毒效果，它有助于把体内积聚下的废物排出体外，让全身的新陈代谢功能得到改善，使得那些由于不能很好地消耗而在体内积聚下来的多余脂肪作为能量而得到燃烧。蜂蜜的糖分如能从胃运送到血液中，就会变成能量，很快地消除疲劳。由于血糖值上升，空腹感也消失了。 <br /><br />A、蜂蜜加白醋减肥法： <br /><br />在日常饮食规律不变的情况下，将蜂蜜和白醋以1：4的比例食用，具体方法如下： <br />1、早餐前20分钟空腹喝 <br />2、中餐和晚餐后立刻喝 <br />注意：挑选白醋时要选择经大米、高梁、黄豆等加工而成的，尽量避免含有化学品的，同时建议不要使用果醋，因为果醋是保健醋，相对于减肥就逊色些。蜂蜜和白醋的比例可以根据个人需要调整。 <br /><br />B、早饭以前可以在喝水时加入蜂蜜，午饭与晚饭时则吃少量的粥。一般人在吃蜂蜜两天后就感觉到身体轻松，心情愉快。五天以后可以吃面条类容易消化的东西，然后慢慢恢复原来的饮食。 蜂蜜可以消除体内垃圾，使人体恢复原来的新陈代谢功能。 <br /><br />五、蜂蜜的其它美容用法 <br /><br />1 、用蜂蜜作营养敷面剂 <br /><br />把蜂蜜加在面粉中，拌成糊状，洗脸时敷于脸部，30分钟后用温开水洗净。蜂蜜对于皮肤没有刺激性，用于保养皮肤十分有效。 <br /><br />2、蜂蜜可以消除粉刺 <br /><br />把脸洗净后，用棉签蘸少量蜂蜜，直接涂在粉刺上。在就寝前使用，非常有效。 <br />蜂蜜中含有大量的维生素、氨基酸及多种活性物质，可调节内分泌、抑制皮脂腺过多分泌脂肪，改善脂肪酸代谢并改善血液循环、增强毛细血管功能，促进血液将营养运送到皮肤层，而且蜂蜜还有很好的抑菌杀菌作用，能有效的抑制和杀灭毛囊中的细菌。因此，蜂蜜不但不会促长青春痘，相反还能防治青春痘，使皮肤变的光滑柔润。 <br /><br />3、用蜂蜜制作冰浴精 <br />香皂含有碱性，会洗去皮肤脂肪，加一点蜂蜜就可以补救。 <br /><br />4、用蜂蜜按摩身体 <br /><br />蜂蜜的粘性可以防止皮肤水分蒸发。日晒而脱皮的后颈、背部、额头等处，涂上蜂蜜轻轻按摩，立即能改善。蜂蜜中加入橄榄油或婴油，在面部轻轻按摩，蜂蜜便能渗入皮肤内。不知不觉间由于蜂蜜的滋养不但会由粗糙变得细嫩，而且还会充满光泽。 <br /><br />5、浴前润肤 <br /><br />沐浴前用蜂蜜保养。在沐浴之前，用蜂蜜涂全身，尤其是脚底、膝盖。手肘等部位要多一点。10分钟后，进入浴缸浸泡，然后再用香皂或沐浴露洗一遍，洗完澡后，会觉得全身滑腻如凝脂。 <br /><br />6、蜂蜜美发素 <br /><br />用一勺蜂蜜与半杯牛奶混合在一起，洗完头后用这种混合液在头上按摩，过15分钟后洗净，头发会变得光滑。 <br /><br />7、蜂蜜美容液 <br /><br />A、取蜂蜜加2倍水稀释后每天涂敷面部，然后用手轻轻按摩，可使皮肤光洁细嫩，减少皱纹，保持自然红润，还能防止新的皱纹出现。 <br /><br />B、蜂蜜50克，一个鸡蛋清，搅拌后放瓶中密封备用，可使用一周左右。夏季放在冰箱内保存，用时倒少许在手掌中，均匀涂于面部，保留半小时清水洗净，能紧缩面部皮肤，消除皱纹，增加营养，洁净、增白皮肤。早晚各一次，持续一个月后，面部皮肤光滑、细腻、白净、长期使用效果更佳。 <br /><br />8、自制蜂蜜面霜 <br /><br />A、将苹果煮熟，捣烂，加入蜂蜜与乳脂，制成润肤面膜膏敷面，长期使用可令肤洁如玉。 <br /><br />B、蜂蜜30克，柠檬汁一汤匙，甜杏仁半汤匙，蛋清两个，淀粉适量，制成软膏，早晚擦用，可滋润皮肤，增加弹性。 <br /><br />六、蜂蜜疗法治感冒 <br /><br />我们俗称的“伤风”或“感冒”，系指鼻、咽、喉部的感染(上呼吸道感染)，是最常见的呼吸道感染性疾病，因病原体不同而分为病毒性和细菌性两大类。病毒性占上感发病的90%以上，一般通过含有病毒的飞沫或经污染的用具进行传播；细菌性感染可直接感染或继发于病毒感染之后，以溶血性链球菌为最常见。临床以发热、恶寒、头痛、鼻塞、流涕、咳嗽、咽痛、声嘶等为基本特征。其治疗方针是应迅速减轻病情、缩短病程、预防合并症。蜂产品及其配方对此有良好的预防作用。 <br /><br />1、蜜姜感冒饮 <br /><br />配方：蜂蜜、姜汁各适量。 <br />用法：将蜂蜜、姜汁按1∶1的比例配制饮用。 <br /><br />主治：普通感冒。 <br /><br />2、柠檬蜜茶 <br /><br />配方：蜂蜜100克，柠檬1个。 <br />用法：将柠檬榨汁，溶解在800毫升沸水中，与100克蜂蜜混合，作为1天的用量。 <br /><br />主治：流行性感冒或普通型感冒。 <br /><br />3、鲜蜜红茶 <br /><br />配方：蜂蜜60克，红茶若干。 <br />用法：蜂蜜60克冲浓红茶饮用。 <br /><br />主治：流行性感冒或普通型感冒。 <br /><br />4、蒜蜜饮 <br /><br />配方：蜂蜜、大蒜各适量。 <br />用法：将大蒜剥皮、洗净、磨碎，加等量蜂蜜混匀；日服2次，每次1匙蒜蜜，用温开水冲服。 <br /><br />主治：流行性感冒。 <br /><br />5、白菊蜜胶茶 <br /><br />配方：蜂蜜、蜂胶水溶液(当地蜂产品公司购买)各适量，杭白菊1克。 <br />用法：沸水1杯冲泡杭白菊，待水温降至40℃时兑入蜂蜜15克、蜂胶水溶液5~10滴混合后代茶饮。 <br /><br />主治：主治感冒。 <br /><br />6、蜜奶感冒茶 <br /><br />配方：蜂蜜15克，牛奶1杯。 <br />用法：将鲜牛奶煮沸，待温度降至60℃时加入蜂蜜饮之，日服2次。 <br /><br />主治：感冒。 <br /><br />7、钩藤蜜茶 <br /><br />配方：蜂蜜、钩藤各15克，绿茶1克。 <br />用法：钩藤加水500毫升，煮沸3分钟，去渣，加入蜂蜜与绿茶；日服1剂，分3次温服。 <br /><br />主治：流行性感冒。 <br /><br />说明：流行性感冒由病毒引起，表现为鼻塞、喷嚏、咽痛、声嘶、咳嗽、发烧、头痛、身痛，外周血白细胞减少等，并有流行趋势。 <br />普通感冒即“伤风”，多由病毒引起，全身表现较流行性感冒轻微，如头痛、牙痛、发热等。 <br /><br />七、蜂蜜加牛奶缓解消除痛经 <br /><br />每晚睡前喝一杯加一勺蜂蜜的热牛奶，即可缓解甚至消除痛经之苦。由于牛奶含钾多，而蜂蜜含有丰富的镁。而研究表明，钾对神经冲动的传导、血液的凝固过程都起重要的作用，它能缓和情绪、抑制疼痛、防止感染及减少经期失血量；镁对大脑中枢神经具有镇静作用，能调节心理，消除紧张心理，减轻压力。 <br /><br />这里再多说一点： <br />另一个对付痛经的对策是服用维生素类药物。B族维生素，特别是B6对经前紧张症有显著疗效，它能稳定情绪，帮助睡眠，使人精力充沛，并能减轻腹部疼痛。香蕉中含有较多的B族维生素，痛经的JM不妨多吃一些，试试看有没有效果。<br /><br /><br />中国十大蜂蜜榜中榜/1 汪氏蜜蜂园(中国驰名商标,江西省名牌产品) 2 冠生园 (中国驰名商标,国家特大型集团) 3 百花牌(全国蜂产品龙头企业，北京名牌) 4 老蜂农(全国知名蜂蜜品牌) 5 博士牌(全国知名蜂蜜品牌) 6 蜂之语(全国知名蜂蜜品牌) 7 颐园牌(全国知名蜂蜜品牌) 8 老山牌(全国知名蜂蜜品牌) 9 天骐花牌(全国知名蜂蜜品牌) 10 天新蜂产品<img src ="http://www.blogjava.net/jackylpz/aggbug/89304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackylpz/" target="_blank">过年</a> 2006-12-21 16:12 <a href="http://www.blogjava.net/jackylpz/archive/2006/12/21/89304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 Spring 更好地处理 Struts 动作</title><link>http://www.blogjava.net/jackylpz/archive/2006/04/16/41354.html</link><dc:creator>过年</dc:creator><author>过年</author><pubDate>Sun, 16 Apr 2006 10:24:00 GMT</pubDate><guid>http://www.blogjava.net/jackylpz/archive/2006/04/16/41354.html</guid><wfw:comment>http://www.blogjava.net/jackylpz/comments/41354.html</wfw:comment><comments>http://www.blogjava.net/jackylpz/archive/2006/04/16/41354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackylpz/comments/commentRss/41354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackylpz/services/trackbacks/41354.html</trackback:ping><description><![CDATA[<h3>使用&nbsp;Spring&nbsp;更好地处理&nbsp;Struts&nbsp;动作</h3>
<br /><u>三种整合&nbsp;Struts&nbsp;应用程序与&nbsp;Spring&nbsp;的方式</u><br />&nbsp;<br />级别:&nbsp;中级<br /><br />George&nbsp;Franciscus&nbsp;,&nbsp;负责人,&nbsp;Nexcel<br /><br />2005&nbsp;年&nbsp;11&nbsp;月&nbsp;03&nbsp;日<br /><br />&nbsp;&nbsp;&nbsp;Struts&nbsp;Recipes&nbsp;的合著者&nbsp;George&nbsp;Franciscus&nbsp;将介绍另一个重大的&nbsp;Struts&nbsp;整合窍门&nbsp;??&nbsp;这次是将&nbsp;Struts&nbsp;应用程序导入&nbsp;Spring&nbsp;框架。请跟随&nbsp;George，他将向您展示如何改变&nbsp;Struts&nbsp;动作，使得管理&nbsp;Struts&nbsp;动作就像管理&nbsp;Spring&nbsp;beans&nbsp;那样。结果是一个增强的&nbsp;web&nbsp;框架，这个框架可以方便地利用&nbsp;Spring&nbsp;AOP&nbsp;的优势。<br />您肯定已经听说过控制反转&nbsp;(IOC)&nbsp;设计模式，因为很长一段时间以来一直在流传关于它的信息。如果您在任何功能中使用过&nbsp;Spring&nbsp;框架，那么您就知道其原理的作用。在本文中，我利用这一原理把一个&nbsp;Struts&nbsp;应用程序注入&nbsp;Spring&nbsp;框架，您将亲身体会到&nbsp;IOC&nbsp;模式的强大。<br /><br />&nbsp;&nbsp;&nbsp;将一个&nbsp;Struts&nbsp;应用程序整合进&nbsp;Spring&nbsp;框架具有多方面的优点。首先，Spring&nbsp;是为解决一些关于&nbsp;JEE&nbsp;的真实世界问题而设计的，比如复杂性、低性能和可测试性，等等。第二，Spring&nbsp;框架包含一个&nbsp;AOP&nbsp;实现，允许您将面向方面技术应用于面向对象的代码。第三，一些人可能会说&nbsp;Spring&nbsp;框架只有处理&nbsp;Struts&nbsp;比&nbsp;Struts&nbsp;处理自己好。但是这是观点问题，我演示三种将&nbsp;Struts&nbsp;应用程序整合到&nbsp;Spring&nbsp;框架的方法后，具体由您自己决定使用哪一种。<br /><br />&nbsp;&nbsp;&nbsp;我所演示的方法都是执行起来相对简单的，但是它们却具有明显不同的优点。我为每一种方法创建了一个独立而可用的例子，这样您就可以完全理解每种方法。请参阅&nbsp;下载&nbsp;部分获得完整例子源代码。请参阅&nbsp;参考资料，下载&nbsp;Struts&nbsp;MVC&nbsp;和&nbsp;Spring&nbsp;框架。<br /><br />
<h4>为什么&nbsp;Spring&nbsp;这么了不起？</h4>
<br /><br />&nbsp;&nbsp;&nbsp;Spring&nbsp;的创立者&nbsp;Rod&nbsp;Johnson&nbsp;以一种批判的眼光看待&nbsp;Java&trade;&nbsp;企业软件开发，并且提议很多企业难题都能够通过战略地使用&nbsp;IOC&nbsp;模式（也称作依赖注入）来解决。当&nbsp;Rod&nbsp;和一个具有奉献精神的开放源码开发者团队将这个理论应用于实践时，结果就产生了&nbsp;Spring&nbsp;框架。简言之，Spring&nbsp;是一个轻型的容器，利用它可以使用一个外部&nbsp;XML&nbsp;配置文件方便地将对象连接在一起。每个对象都可以通过显示一个&nbsp;JavaBean&nbsp;属性收到一个到依赖对象的引用，留给您的简单任务就只是在一个&nbsp;XML&nbsp;配置文件中把它们连接好。<br /><br />&nbsp;
<h5>IOC&nbsp;和&nbsp;Spring</h5>
<br /><br />&nbsp;&nbsp;&nbsp;IOC&nbsp;是一种使应用程序逻辑外在化的设计模式，所以它是被注入而不是被写入客户机代码中。将&nbsp;IOC&nbsp;与接口编程应用结合，就像&nbsp;Spring&nbsp;框架那样，产生了一种架构，这种架构能够减少客户机对特定实现逻辑的依赖。请参阅&nbsp;参考资料&nbsp;了解更多关于&nbsp;IOC&nbsp;和&nbsp;Spring&nbsp;的信息。<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;依赖注入是一个强大的特性，但是&nbsp;Spring&nbsp;框架能够提供更多特性。Spring&nbsp;支持可插拔的事务管理器，可以给您的事务处理提供更广泛的选择范围。它集成了领先的持久性框架，并且提供一个一致的异常层次结构。Spring&nbsp;还提供了一种使用面向方面代码代替正常的面向对象代码的简单机制。<br /><br />&nbsp;&nbsp;&nbsp;Spring&nbsp;AOP&nbsp;允许您使用拦截器&nbsp;在一个或多个执行点上拦截应用程序逻辑。加强应用程序在拦截器中的日志记录逻辑会产生一个更可读的、实用的代码基础，所以拦截器广泛用于日志记录。您很快就会看到，为了处理横切关注点，Spring&nbsp;AOP&nbsp;发布了它自己的拦截器，您也可以编写您自己的拦截器。<br /><br /><br />
<h4>整合&nbsp;Struts&nbsp;和&nbsp;Spring</h4>
<br /><br />&nbsp;&nbsp;&nbsp;与&nbsp;Struts&nbsp;相似，Spring&nbsp;可以作为一个&nbsp;MVC&nbsp;实现。这两种框架都具有自己的优点和缺点，尽管大部分人同意&nbsp;Struts&nbsp;在&nbsp;MVC&nbsp;方面仍然是最好的。很多开发团队已经学会在时间紧迫的时候利用&nbsp;Struts&nbsp;作为构造高品质软件的基础。Struts&nbsp;具有如此大的推动力，以至于开发团队宁愿整合&nbsp;Spring&nbsp;框架的特性，而不愿意转换成&nbsp;Spring&nbsp;MVC。没必要进行转换对您来说是一个好消息。Spring&nbsp;架构允许您将&nbsp;Struts&nbsp;作为&nbsp;Web&nbsp;框架连接到基于&nbsp;Spring&nbsp;的业务和持久层。最后的结果就是现在一切条件都具备了。<br /><br />&nbsp;&nbsp;&nbsp;在接下来的小窍门中，您将会了解到三种将&nbsp;Struts&nbsp;MVC&nbsp;整合到&nbsp;Spring&nbsp;框架的方法。我将揭示每种方法的缺陷并且对比它们的优点。&nbsp;一旦您了解到所有三种方法的作用，我将会向您展示一个令人兴奋的应用程序，这个程序使用的是这三种方法中我最喜欢的一种。<br /><br />
<h4>三个小窍门</h4>
<br /><br />&nbsp;&nbsp;&nbsp;接下来的每种整合技术（或者窍门）都有自己的优点和特点。我偏爱其中的一种，但是我知道这三种都能够加深您对&nbsp;Struts&nbsp;和&nbsp;Spring&nbsp;的理解。在处理各种不同情况的时候，这将给您提供一个广阔的选择范围。方法如下：<br /><br /><strong>
<h5>使用&nbsp;Spring&nbsp;的&nbsp;ActionSupport&nbsp;类整合&nbsp;Structs</h5>
</strong><br />&nbsp;&nbsp;&nbsp;使用&nbsp;Spring&nbsp;的&nbsp;DelegatingRequestProcessor&nbsp;覆盖&nbsp;Struts&nbsp;的&nbsp;RequestProcessor&nbsp;<br />将&nbsp;Struts&nbsp;Action&nbsp;管理委托给&nbsp;Spring&nbsp;框架<br />装载应用程序环境<br /><br />&nbsp;&nbsp;&nbsp;无论您使用哪种技术，都需要使用&nbsp;Spring&nbsp;的&nbsp;ContextLoaderPlugin&nbsp;为&nbsp;Struts&nbsp;的&nbsp;ActionServlet&nbsp;装载&nbsp;Spring&nbsp;应用程序环境。就像添加任何其他插件一样，简单地向您的&nbsp;struts-config.xml&nbsp;文件添加该插件，如下所示：<br />
<div class="codeStyle">
<ol>
    <li>&lt;plug-in&nbsp;className= </li>
    <li>&nbsp;&nbsp;<font color="#ff33ff">&quot;org.springframework.web.struts.ContextLoaderPlugIn&quot;</font>&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;set-property&nbsp;property= </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff33ff">&quot;contextConfigLocation&quot;</font>&nbsp;value=<font color="#ff33ff">&quot;/WEB-INF/beans.xml&quot;</font>/&gt; </li>
    <li>&nbsp;&lt;/plug-in&gt; </li>
</ol>
</div>
&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;前面已经提到过，在&nbsp;下载&nbsp;部分，您能够找到这三个完全可使用的例子的完整源代码。每个例子都为一个书籍搜索应用程序提供一种不同的&nbsp;Struts&nbsp;和&nbsp;Spring&nbsp;的整合方法。您可以在这里看到例子的要点，但是您也可以下载应用程序以查看所有的细节。<br /><br /><strong>
<h5>窍门&nbsp;1.&nbsp;使用&nbsp;Spring&nbsp;的&nbsp;ActionSupport</h5>
</strong><br /><br />&nbsp;&nbsp;&nbsp;手动创建一个&nbsp;Spring&nbsp;环境是一种整合&nbsp;Struts&nbsp;和&nbsp;Spring&nbsp;的最直观的方式。为了使它变得更简单，Spring&nbsp;提供了一些帮助。为了方便地获得&nbsp;Spring&nbsp;环境，org.springframework.web.struts.ActionSupport&nbsp;类提供了一个&nbsp;getWebApplicationContext()&nbsp;方法。您所做的只是从&nbsp;Spring&nbsp;的&nbsp;ActionSupport&nbsp;而不是&nbsp;Struts&nbsp;Action&nbsp;类扩展您的动作，如清单&nbsp;1&nbsp;所示：<br /><br />清单&nbsp;1.&nbsp;使用&nbsp;ActionSupport&nbsp;整合&nbsp;Struts<br /><br />
<div class="codeStyle">
<ol>
    <li><strong><font color="#0000ff">package</font></strong>&nbsp;ca.nexcel.books.actions; </li>
    <li>&nbsp;</li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;java.io.<strong><a href="http://www.javaresearch.org/source/jdk142/java/io/IOException.java.html" target="_blank"><font class="classLink"><u>IOException</u></font></a></strong>; </li>
    <li>&nbsp;</li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;javax.servlet.<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/ServletException.java.html" target="_blank"><font class="classLink"><u>ServletException</u></font></a>; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;javax.servlet.http.<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpServletRequest.java.html" target="_blank"><font class="classLink"><u>HttpServletRequest</u></font></a>; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;javax.servlet.http.<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpServletResponse.java.html" target="_blank"><font class="classLink"><u>HttpServletResponse</u></font></a>; </li>
    <li>&nbsp;</li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.apache.struts.action.ActionError; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.apache.struts.action.ActionErrors; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.apache.struts.action.ActionForm; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.apache.struts.action.ActionForward; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.apache.struts.action.ActionMapping; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.apache.struts.action.DynaActionForm; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.springframework.context.ApplicationContext; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.springframework.web.struts.ActionSupport; </li>
    <li>&nbsp;</li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;ca.nexcel.books.beans.<font color="#ff0000">Book</font>; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;ca.nexcel.books.business.BookService; </li>
    <li>&nbsp;</li>
    <li><strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">class</font></strong>&nbsp;SearchSubmit&nbsp;<strong><font color="#0000ff">extends</font></strong>&nbsp;ActionSupport&nbsp;{&nbsp;&nbsp;&nbsp;|(1) </li>
    <li>&nbsp;</li>
    <li>&nbsp;</li>
    <li>&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;ActionForward&nbsp;execute( </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;ActionMapping&nbsp;mapping, </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;ActionForm&nbsp;form, </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpServletRequest.java.html" target="_blank"><font class="classLink"><u>HttpServletRequest</u></font></a>&nbsp;request, </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpServletResponse.java.html" target="_blank"><font class="classLink"><u>HttpServletResponse</u></font></a>&nbsp;response) </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">throws</font></strong>&nbsp;<strong><a href="http://www.javaresearch.org/source/jdk142/java/io/IOException.java.html" target="_blank"><font class="classLink"><u>IOException</u></font></a></strong>,&nbsp;<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/ServletException.java.html" target="_blank"><font class="classLink"><u>ServletException</u></font></a>&nbsp;{ </li>
    <li>&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;DynaActionForm&nbsp;searchForm&nbsp;=&nbsp;(DynaActionForm)&nbsp;form; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></strong>&nbsp;isbn&nbsp;=&nbsp;(<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></strong>)&nbsp;searchForm.get(<font color="#ff33ff">&quot;isbn&quot;</font>); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<em><font color="#339900">//the&nbsp;old&nbsp;fashion&nbsp;way</font></em> </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<em><font color="#339900">//BookService&nbsp;bookService&nbsp;=&nbsp;new&nbsp;BookServiceImpl();</font></em> </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;ctx&nbsp;=&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getWebApplicationContext();&nbsp;&nbsp;&nbsp;&nbsp;|(2) </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;BookService&nbsp;bookService&nbsp;=&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(BookService)&nbsp;ctx.getBean(<font color="#ff33ff">&quot;bookService&quot;</font>);&nbsp;&nbsp;&nbsp;|(3) </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </li>
    <li>&nbsp;&nbsp;<font color="#ff0000">Book</font>&nbsp;book&nbsp;=&nbsp;bookService.read(isbn.trim()); </li>
    <li>&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">if</font></strong>&nbsp;(<strong><font color="#0000ff">null</font></strong>&nbsp;==&nbsp;book)&nbsp;{ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionErrors&nbsp;errors&nbsp;=&nbsp;<strong><font color="#0000ff">new</font></strong>&nbsp;ActionErrors(); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errors.add(ActionErrors.GLOBAL_ERROR,<strong><font color="#0000ff">new</font></strong>&nbsp;ActionError </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<font color="#ff33ff">&quot;message.notfound&quot;</font>)); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saveErrors(request,&nbsp;errors); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">return</font></strong>&nbsp;mapping.findForward(<font color="#ff33ff">&quot;failure&quot;</font>)&nbsp;; </li>
    <li>&nbsp;&nbsp;} </li>
    <li>&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute(<font color="#ff33ff">&quot;book&quot;</font>,&nbsp;book); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">return</font></strong>&nbsp;mapping.findForward(<font color="#ff33ff">&quot;success&quot;</font>); </li>
    <li>&nbsp;&nbsp;} </li>
    <li>} </li>
    <li>&nbsp; </li>
</ol>
</div>
<br /><br />&nbsp;&nbsp;&nbsp;让我们快速思考一下这里到底发生了什么。在&nbsp;(1)&nbsp;处，我通过从&nbsp;Spring&nbsp;的&nbsp;ActionSupport&nbsp;类而不是&nbsp;Struts&nbsp;的&nbsp;Action&nbsp;类进行扩展，创建了一个新的&nbsp;Action。在&nbsp;(2)&nbsp;处，我使用&nbsp;getWebApplicationContext()&nbsp;方法获得一个&nbsp;ApplicationContext。为了获得业务服务，我使用在&nbsp;(2)&nbsp;处获得的环境在&nbsp;(3)&nbsp;处查找一个&nbsp;Spring&nbsp;bean。<br /><br />这种技术很简单并且易于理解。不幸的是，它将&nbsp;Struts&nbsp;动作与&nbsp;Spring&nbsp;框架耦合在一起。如果您想替换掉&nbsp;Spring，那么您必须重写代码。并且，由于&nbsp;Struts&nbsp;动作不在&nbsp;Spring&nbsp;的控制之下，所以它不能获得&nbsp;Spring&nbsp;AOP&nbsp;的优势。当使用多重独立的&nbsp;Spring&nbsp;环境时，这种技术可能有用，但是在大多数情况下，这种方法不如另外两种方法合适。<br /><br /><strong>
<h5>窍门&nbsp;2.&nbsp;覆盖&nbsp;RequestProcessor</h5>
</strong><br /><br />&nbsp;&nbsp;&nbsp;将&nbsp;Spring&nbsp;从&nbsp;Struts&nbsp;动作中分离是一个更巧妙的设计选择。分离的一种方法是使用&nbsp;org.springframework.web.struts.DelegatingRequestProcessor&nbsp;类来覆盖&nbsp;Struts&nbsp;的&nbsp;RequestProcessor&nbsp;处理程序，如清单&nbsp;2&nbsp;所示：<br /><br />清单&nbsp;2.&nbsp;通过&nbsp;Spring&nbsp;的&nbsp;DelegatingRequestProcessor&nbsp;进行整合<br /><br />
<div class="codeStyle">
<ol>
    <li>&lt;?xml&nbsp;version=<font color="#ff33ff">&quot;1.0&quot;</font>&nbsp;encoding=<font color="#ff33ff">&quot;ISO-8859-1&quot;</font>&nbsp;?&gt; </li>
    <li>&nbsp;</li>
    <li>&lt;!DOCTYPE&nbsp;struts-config&nbsp;PUBLIC </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff33ff">&quot;-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;1.1//EN&quot;</font> </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff33ff">&quot;http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd&quot;</font>&gt; </li>
    <li>&nbsp;</li>
    <li>&lt;struts-config&gt; </li>
    <li>&nbsp;&lt;form-beans&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-bean&nbsp;name=<font color="#ff33ff">&quot;searchForm&quot;</font>&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=<font color="#ff33ff">&quot;org.apache.struts.validator.DynaValidatorForm&quot;</font>&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-property&nbsp;name=<font color="#ff33ff">&quot;isbn&quot;</font>&nbsp;&nbsp;&nbsp;&nbsp;type=<font color="#ff33ff">&quot;java.lang.String&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form-bean&gt; </li>
    <li>&nbsp;&nbsp; </li>
    <li>&nbsp;&nbsp;&lt;/form-beans&gt; </li>
    <li>&nbsp;</li>
    <li>&nbsp;&lt;global-forwards&nbsp;type=<font color="#ff33ff">&quot;org.apache.struts.action.ActionForward&quot;</font>&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward&nbsp;&nbsp;&nbsp;name=<font color="#ff33ff">&quot;welcome&quot;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path=<font color="#ff33ff">&quot;/welcome.do&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward&nbsp;&nbsp;&nbsp;name=<font color="#ff33ff">&quot;searchEntry&quot;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path=<font color="#ff33ff">&quot;/searchEntry.do&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward&nbsp;&nbsp;&nbsp;name=<font color="#ff33ff">&quot;searchSubmit&quot;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path=<font color="#ff33ff">&quot;/searchSubmit.do&quot;</font>/&gt; </li>
    <li>&nbsp;&lt;/global-forwards&gt; </li>
    <li>&nbsp;</li>
    <li>&nbsp;&lt;action-mappings&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;action&nbsp;&nbsp;&nbsp;&nbsp;path=<font color="#ff33ff">&quot;/welcome&quot;</font>&nbsp;forward=<font color="#ff33ff">&quot;/WEB-INF/pages/welcome.htm&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;action&nbsp;&nbsp;&nbsp;&nbsp;path=<font color="#ff33ff">&quot;/searchEntry&quot;</font>&nbsp;forward=<font color="#ff33ff">&quot;/WEB-INF/pages/search.jsp&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;action&nbsp;&nbsp;&nbsp;&nbsp;path=<font color="#ff33ff">&quot;/searchSubmit&quot;</font>&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=<font color="#ff33ff">&quot;ca.nexcel.books.actions.SearchSubmit&quot;</font> </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input=<font color="#ff33ff">&quot;/searchEntry.do&quot;</font> </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validate=<font color="#ff33ff">&quot;true&quot;</font> </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=<font color="#ff33ff">&quot;searchForm&quot;</font>&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward&nbsp;name=<font color="#ff33ff">&quot;success&quot;</font>&nbsp;path=<font color="#ff33ff">&quot;/WEB-INF/pages/detail.jsp&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward&nbsp;name=<font color="#ff33ff">&quot;failure&quot;</font>&nbsp;path=<font color="#ff33ff">&quot;/WEB-INF/pages/search.jsp&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action&gt;&nbsp;&nbsp; </li>
    <li>&nbsp;</li>
    <li>&nbsp;&lt;/action-mappings&gt; </li>
    <li>&nbsp;</li>
    <li>&nbsp;&lt;message-resources&nbsp;parameter=<font color="#ff33ff">&quot;ApplicationResources&quot;</font>/&gt; </li>
    <li>&nbsp;</li>
    <li>&nbsp;&lt;controller&nbsp;processorClass=<font color="#ff33ff">&quot;org.springframework.web.struts.</font> </li>
    <li>&nbsp;&nbsp;&nbsp;DelegatingRequestProcessor<font color="#ff33ff">&quot;/&gt;&nbsp;|(1)</font> </li>
    <li>&nbsp;</li>
    <li>&nbsp;&lt;plug-in&nbsp;className=<font color="#ff33ff">&quot;org.apache.struts.validator.ValidatorPlugIn&quot;</font>&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;set-property&nbsp;property=<font color="#ff33ff">&quot;pathnames&quot;</font>&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=<font color="#ff33ff">&quot;/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml&quot;</font>/&gt; </li>
    <li>&nbsp;&lt;/plug-in&gt; </li>
    <li>&nbsp;</li>
    <li>&nbsp;</li>
    <li>&nbsp;&lt;plug-in&nbsp;className=<font color="#ff33ff">&quot;org.springframework.web.struts.ContextLoaderPlugIn&quot;</font>&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;set-property&nbsp;property=<font color="#ff33ff">&quot;csntextConfigLocation&quot;</font>&nbsp;value=<font color="#ff33ff">&quot;/WEB-INF/beans.xml&quot;</font>/&gt; </li>
    <li>&nbsp;&lt;/plug-in&gt; </li>
    <li>&nbsp; </li>
    <li>&lt;/struts-config&gt; </li>
    <li>&nbsp; </li>
</ol>
</div>
<br /><br />&nbsp;&nbsp;&nbsp;我利用了&nbsp;&lt;controller&gt;&nbsp;标记来用&nbsp;DelegatingRequestProcessor&nbsp;覆盖默认的&nbsp;Struts&nbsp;RequestProcessor。下一步是在我的&nbsp;Spring&nbsp;配置文件中注册该动作，如清单&nbsp;3&nbsp;所示：<br /><br /><br />清单&nbsp;3.&nbsp;在&nbsp;Spring&nbsp;配置文件中注册一个动作<br /><br />
<div class="codeStyle">
<ol>
    <li>&lt;?xml&nbsp;version=<font color="#ff33ff">&quot;1.0&quot;</font>&nbsp;encoding=<font color="#ff33ff">&quot;UTF-8&quot;</font>?&gt; </li>
    <li>&lt;!DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;<font color="#ff33ff">&quot;-//SPRING//DTD&nbsp;BEAN//EN&quot;</font>&nbsp; </li>
    <li>&nbsp;&nbsp;<font color="#ff33ff">&quot;http://www.springframework.org/dtd/spring-beans.dtd&quot;</font>&gt; </li>
    <li>&nbsp;</li>
    <li>&lt;beans&gt; </li>
    <li>&nbsp;&nbsp;&lt;bean&nbsp;id=<font color="#ff33ff">&quot;bookService&quot;</font>&nbsp;<strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">&quot;ca.nexcel.books.business.BookServiceImpl&quot;</font>/&gt; </li>
    <li>&nbsp;</li>
    <li>&nbsp;&nbsp;&lt;bean&nbsp;name=<font color="#ff33ff">&quot;/searchSubmit&quot;</font>&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">&quot;ca.nexcel.books.actions.SearchSubmit&quot;</font>&gt;&nbsp;|(1) </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<font color="#ff33ff">&quot;bookService&quot;</font>&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&nbsp;bean=<font color="#ff33ff">&quot;bookService&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt; </li>
    <li>&nbsp;&nbsp;&lt;/bean&gt; </li>
    <li>&lt;/beans&gt; </li>
</ol>
</div>
&nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp;注意：在&nbsp;(1)&nbsp;处，我使用名称属性注册了一个&nbsp;bean，以匹配&nbsp;struts-config&nbsp;动作映射名称。SearchSubmit&nbsp;动作揭示了一个&nbsp;JavaBean&nbsp;属性，允许&nbsp;Spring&nbsp;在运行时填充属性，如清单&nbsp;4&nbsp;所示：<br /><br /><br />清单&nbsp;4.&nbsp;具有&nbsp;JavaBean&nbsp;属性的&nbsp;Struts&nbsp;动作<br /><br />
<div class="codeStyle">
<ol>
    <li><strong><font color="#0000ff">package</font></strong>&nbsp;ca.nexcel.books.actions; </li>
    <li>&nbsp;</li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;java.io.<strong><a href="http://www.javaresearch.org/source/jdk142/java/io/IOException.java.html" target="_blank"><font class="classLink"><u>IOException</u></font></a></strong>; </li>
    <li>&nbsp;</li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;javax.servlet.<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/ServletException.java.html" target="_blank"><font class="classLink"><u>ServletException</u></font></a>; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;javax.servlet.http.<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpServletRequest.java.html" target="_blank"><font class="classLink"><u>HttpServletRequest</u></font></a>; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;javax.servlet.http.<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpServletResponse.java.html" target="_blank"><font class="classLink"><u>HttpServletResponse</u></font></a>; </li>
    <li>&nbsp;</li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.apache.struts.action.<font color="#ff0000">Action</font>; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.apache.struts.action.ActionError; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.apache.struts.action.ActionErrors; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.apache.struts.action.ActionForm; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.apache.struts.action.ActionForward; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.apache.struts.action.ActionMapping; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.apache.struts.action.DynaActionForm; </li>
    <li>&nbsp;</li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;ca.nexcel.books.beans.<font color="#ff0000">Book</font>; </li>
    <li><strong><font color="#0000ff">import</font></strong>&nbsp;ca.nexcel.books.business.BookService; </li>
    <li>&nbsp;</li>
    <li><strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">class</font></strong>&nbsp;SearchSubmit&nbsp;<strong><font color="#0000ff">extends</font></strong>&nbsp;<font color="#ff0000">Action</font>&nbsp;{ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp; </li>
    <li>&nbsp;&nbsp;<strong><font color="#0000ff">private</font></strong>&nbsp;BookService&nbsp;bookService; </li>
    <li>&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;BookService&nbsp;getBookService()&nbsp;{ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">return</font></strong>&nbsp;bookService; </li>
    <li>&nbsp;&nbsp;} </li>
    <li>&nbsp;</li>
    <li>&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">void</font></strong>&nbsp;setBookService(BookService&nbsp;bookService)&nbsp;{&nbsp;|&nbsp;(1) </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">this</font></strong>.bookService&nbsp;=&nbsp;bookService;&nbsp; </li>
    <li>&nbsp;&nbsp;}&nbsp; </li>
    <li>&nbsp;</li>
    <li>&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;ActionForward&nbsp;execute( </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;ActionMapping&nbsp;mapping, </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;ActionForm&nbsp;form, </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpServletRequest.java.html" target="_blank"><font class="classLink"><u>HttpServletRequest</u></font></a>&nbsp;request, </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/http/HttpServletResponse.java.html" target="_blank"><font class="classLink"><u>HttpServletResponse</u></font></a>&nbsp;response) </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">throws</font></strong>&nbsp;<strong><a href="http://www.javaresearch.org/source/jdk142/java/io/IOException.java.html" target="_blank"><font class="classLink"><u>IOException</u></font></a></strong>,&nbsp;<a href="http://www.javaresearch.org/source/j2ee1.3.1/javax/servlet/ServletException.java.html" target="_blank"><font class="classLink"><u>ServletException</u></font></a>&nbsp;{ </li>
    <li>&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;DynaActionForm&nbsp;searchForm&nbsp;=&nbsp;(DynaActionForm)&nbsp;form; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></strong>&nbsp;isbn&nbsp;=&nbsp;(<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></strong>)&nbsp;searchForm.get(<font color="#ff33ff">&quot;isbn&quot;</font>); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </li>
    <li>&nbsp;&nbsp;<font color="#ff0000">Book</font>&nbsp;book&nbsp;=&nbsp;getBookService().read(isbn.trim());&nbsp;&nbsp;|(2) </li>
    <li>&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">if</font></strong>&nbsp;(<strong><font color="#0000ff">null</font></strong>&nbsp;==&nbsp;book)&nbsp;{ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionErrors&nbsp;errors&nbsp;=&nbsp;<strong><font color="#0000ff">new</font></strong>&nbsp;ActionErrors(); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errors.add(ActionErrors.GLOBAL_ERROR,<strong><font color="#0000ff">new</font></strong>&nbsp;ActionError(<font color="#ff33ff">&quot;message.notfound&quot;</font>)); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saveErrors(request,&nbsp;errors); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">return</font></strong>&nbsp;mapping.findForward(<font color="#ff33ff">&quot;failure&quot;</font>)&nbsp;; </li>
    <li>&nbsp;&nbsp;} </li>
    <li>&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute(<font color="#ff33ff">&quot;book&quot;</font>,&nbsp;book); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">return</font></strong>&nbsp;mapping.findForward(<font color="#ff33ff">&quot;success&quot;</font>); </li>
    <li>&nbsp;&nbsp;} </li>
    <li>&nbsp;</li>
    <li>} </li>
</ol>
</div>
&nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp;在清单&nbsp;4&nbsp;中，您可以了解到如何创建&nbsp;Struts&nbsp;动作。在&nbsp;(1)&nbsp;处，我创建了一个&nbsp;JavaBean&nbsp;属性。DelegatingRequestProcessor自动地配置这种属性。这种设计使&nbsp;Struts&nbsp;动作并不知道它正被&nbsp;Spring&nbsp;管理，并且使您能够利用&nbsp;Sping&nbsp;的动作管理框架的所有优点。由于您的&nbsp;Struts&nbsp;动作注意不到&nbsp;Spring&nbsp;的存在，所以您不需要重写您的&nbsp;Struts&nbsp;代码就可以使用其他控制反转容器来替换掉&nbsp;Spring。<br /><br />&nbsp;&nbsp;&nbsp;DelegatingRequestProcessor&nbsp;方法的确比第一种方法好，但是仍然存在一些问题。如果您使用一个不同的&nbsp;RequestProcessor，则需要手动整合&nbsp;Spring&nbsp;的&nbsp;DelegatingRequestProcessor。添加的代码会造成维护的麻烦并且将来会降低您的应用程序的灵活性。此外，还有过一些使用一系列命令来代替&nbsp;Struts&nbsp;RequestProcessor&nbsp;的传闻。&nbsp;这种改变将会对这种解决方法的使用寿命造成负面的影响。<br /><br /><strong>
<h5>窍门&nbsp;3.&nbsp;将动作管理委托给&nbsp;Spring</h5>
</strong><br /><br />&nbsp;&nbsp;&nbsp;一个更好的解决方法是将&nbsp;Strut&nbsp;动作管理委托给&nbsp;Spring。您可以通过在&nbsp;struts-config&nbsp;动作映射中注册一个代理来实现。代理负责在&nbsp;Spring&nbsp;环境中查找&nbsp;Struts&nbsp;动作。由于动作在&nbsp;Spring&nbsp;的控制之下，所以它可以填充动作的&nbsp;JavaBean&nbsp;属性，并为应用诸如&nbsp;Spring&nbsp;的&nbsp;AOP&nbsp;拦截器之类的特性带来了可能。&nbsp;<br /><br />清单&nbsp;5&nbsp;中的&nbsp;Action&nbsp;类与清单&nbsp;4&nbsp;中的相同。但是&nbsp;struts-config&nbsp;有一些不同：<br /><br />清单&nbsp;5.&nbsp;Spring&nbsp;整合的委托方法<br /><br />
<div class="codeStyle">
<ol>
    <li>&lt;?xml&nbsp;version=<font color="#ff33ff">&quot;1.0&quot;</font>&nbsp;encoding=<font color="#ff33ff">&quot;ISO-8859-1&quot;</font>&nbsp;?&gt; </li>
    <li>&nbsp;</li>
    <li>&lt;!DOCTYPE&nbsp;struts-config&nbsp;PUBLIC </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff33ff">&quot;-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;1.1//EN&quot;</font> </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff33ff">&quot;http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd&quot;</font>&gt; </li>
    <li>&nbsp;</li>
    <li>&lt;struts-config&gt; </li>
    <li>&nbsp;&lt;form-beans&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-bean&nbsp;name=<font color="#ff33ff">&quot;searchForm&quot;</font>&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=<font color="#ff33ff">&quot;org.apache.struts.validator.DynaValidatorForm&quot;</font>&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-property&nbsp;name=<font color="#ff33ff">&quot;isbn&quot;</font>&nbsp;&nbsp;&nbsp;&nbsp;type=<font color="#ff33ff">&quot;java.lang.String&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form-bean&gt; </li>
    <li>&nbsp;&nbsp; </li>
    <li>&nbsp;&nbsp;&lt;/form-beans&gt; </li>
    <li>&nbsp;</li>
    <li>&nbsp;&lt;global-forwards&nbsp;type=<font color="#ff33ff">&quot;org.apache.struts.action.ActionForward&quot;</font>&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward&nbsp;&nbsp;&nbsp;name=<font color="#ff33ff">&quot;welcome&quot;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path=<font color="#ff33ff">&quot;/welcome.do&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward&nbsp;&nbsp;&nbsp;name=<font color="#ff33ff">&quot;searchEntry&quot;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path=<font color="#ff33ff">&quot;/searchEntry.do&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward&nbsp;&nbsp;&nbsp;name=<font color="#ff33ff">&quot;searchSubmit&quot;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path=<font color="#ff33ff">&quot;/searchSubmit.do&quot;</font>/&gt; </li>
    <li>&nbsp;&lt;/global-forwards&gt; </li>
    <li>&nbsp;</li>
    <li>&nbsp;&lt;action-mappings&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;action&nbsp;&nbsp;&nbsp;&nbsp;path=<font color="#ff33ff">&quot;/welcome&quot;</font>&nbsp;forward=<font color="#ff33ff">&quot;/WEB-INF/pages/welcome.htm&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;action&nbsp;&nbsp;&nbsp;&nbsp;path=<font color="#ff33ff">&quot;/searchEntry&quot;</font>&nbsp;forward=<font color="#ff33ff">&quot;/WEB-INF/pages/search.jsp&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;action&nbsp;&nbsp;&nbsp;&nbsp;path=<font color="#ff33ff">&quot;/searchSubmit&quot;</font>&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=<font color="#ff33ff">&quot;org.springframework.web.struts.DelegatingActionProxy&quot;</font>&nbsp;|(1) </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input=<font color="#ff33ff">&quot;/searchEntry.do&quot;</font> </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validate=<font color="#ff33ff">&quot;true&quot;</font> </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=<font color="#ff33ff">&quot;searchForm&quot;</font>&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward&nbsp;name=<font color="#ff33ff">&quot;success&quot;</font>&nbsp;path=<font color="#ff33ff">&quot;/WEB-INF/pages/detail.jsp&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward&nbsp;name=<font color="#ff33ff">&quot;failure&quot;</font>&nbsp;path=<font color="#ff33ff">&quot;/WEB-INF/pages/search.jsp&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action&gt;&nbsp;&nbsp; </li>
    <li>&nbsp;</li>
    <li>&nbsp;&lt;/action-mappings&gt; </li>
    <li>&nbsp;</li>
    <li>&nbsp;&lt;message-resources&nbsp;parameter=<font color="#ff33ff">&quot;ApplicationResources&quot;</font>/&gt; </li>
    <li>&nbsp;</li>
    <li>&nbsp;</li>
    <li>&nbsp;&lt;plug-in&nbsp;className=<font color="#ff33ff">&quot;org.apache.struts.validator.ValidatorPlugIn&quot;</font>&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;set-property&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;property=<font color="#ff33ff">&quot;pathnames&quot;</font>&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;value=<font color="#ff33ff">&quot;/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml&quot;</font>/&gt; </li>
    <li>&nbsp;&lt;/plug-in&gt; </li>
    <li>&nbsp;</li>
    <li>&nbsp;</li>
    <li>&nbsp;&lt;plug-in&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;className=<font color="#ff33ff">&quot;org.springframework.web.struts.ContextLoaderPlugIn&quot;</font>&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;set-property&nbsp;property=<font color="#ff33ff">&quot;contextConfigLocation&quot;</font>&nbsp;value=<font color="#ff33ff">&quot;/WEB-INF/beans.xml&quot;</font>/&gt; </li>
    <li>&nbsp;&lt;/plug-in&gt; </li>
    <li>&nbsp;</li>
    <li>&nbsp; </li>
    <li>&lt;/struts-config&gt; </li>
</ol>
</div>
&nbsp;<br />&nbsp;&nbsp;&nbsp;清单&nbsp;5&nbsp;是一个典型的&nbsp;struts-config.xml&nbsp;文件，只有一个小小的差别。它注册&nbsp;Spring&nbsp;代理类的名称，而不是声明动作的类名，如（1）处所示。DelegatingActionProxy&nbsp;类使用动作映射名称查找&nbsp;Spring&nbsp;环境中的动作。这就是我们使用&nbsp;ContextLoaderPlugIn&nbsp;声明的环境。<br /><br />&nbsp;&nbsp;&nbsp;将一个&nbsp;Struts&nbsp;动作注册为一个&nbsp;Spring&nbsp;bean&nbsp;是非常直观的，如清单&nbsp;6&nbsp;所示。我利用动作映射使用&nbsp;&lt;bean&gt;&nbsp;标记的名称属性（在这个例子中是&nbsp;&quot;/searchSubmit&quot;）简单地创建了一个&nbsp;bean。这个动作的&nbsp;JavaBean&nbsp;属性像任何&nbsp;Spring&nbsp;bean&nbsp;一样被填充：&nbsp;<br /><br /><br />清单&nbsp;6.&nbsp;在&nbsp;Spring&nbsp;环境中注册一个&nbsp;Struts&nbsp;动作<br /><br />
<div class="codeStyle">
<ol>
    <li>&lt;?xml&nbsp;version=<font color="#ff33ff">&quot;1.0&quot;</font>&nbsp;encoding=<font color="#ff33ff">&quot;UTF-8&quot;</font>?&gt; </li>
    <li>&lt;!DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;<font color="#ff33ff">&quot;-//SPRING//DTD&nbsp;BEAN//EN&quot;</font>&nbsp; </li>
    <li>&nbsp;<font color="#ff33ff">&quot;http://www.springframework.org/dtd/spring-beans.dtd&quot;</font>&gt; </li>
    <li>&nbsp;</li>
    <li>&lt;beans&gt; </li>
    <li>&nbsp;&nbsp;&lt;bean&nbsp;id=<font color="#ff33ff">&quot;bookService&quot;</font>&nbsp;<strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">&quot;ca.nexcel.books.business.BookServiceImpl&quot;</font>/&gt; </li>
    <li>&nbsp;</li>
    <li>&nbsp;&nbsp;&lt;bean&nbsp;name=<font color="#ff33ff">&quot;/searchSubmit&quot;</font>&nbsp;&nbsp;&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">&quot;ca.nexcel.books.actions.SearchSubmit&quot;</font>&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<font color="#ff33ff">&quot;bookService&quot;</font>&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&nbsp;bean=<font color="#ff33ff">&quot;bookService&quot;</font>/&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt; </li>
    <li>&nbsp;&nbsp;&lt;/bean&gt; </li>
    <li>&nbsp;</li>
    <li>&lt;/beans&gt; </li>
</ol>
</div>
&nbsp;<br /><br />
<h5>动作委托的优点</h5>
<br /><br />&nbsp;&nbsp;&nbsp;动作委托解决方法是这三种方法中最好的。Struts&nbsp;动作不了解&nbsp;Spring，不对代码作任何改变就可用于非&nbsp;Spring&nbsp;应用程序中。RequestProcessor&nbsp;的改变不会影响它，并且它可以利用&nbsp;Spring&nbsp;AOP&nbsp;特性的优点。&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;动作委托的优点不止如此。一旦让&nbsp;Spring&nbsp;控制您的&nbsp;Struts&nbsp;动作，您就可以使用&nbsp;Spring&nbsp;给动作补充更强的活力。例如，没有&nbsp;Spring&nbsp;的话，所有的&nbsp;Struts&nbsp;动作都必须是线程安全的。如果您设置&nbsp;&lt;bean&gt;&nbsp;标记的&nbsp;singleton&nbsp;属性为&ldquo;false&rdquo;，那么不管用何种方法，您的应用程序都将在每一个请求上有一个新生成的动作对象。您可能不需要这种特性，但是把它放在您的工具箱中也很好。您也可以利用&nbsp;Spring&nbsp;的生命周期方法。例如，当实例化&nbsp;Struts&nbsp;动作时，&lt;bean&gt;&nbsp;标记的&nbsp;init-method&nbsp;属性被用于运行一个方法。类似地，在从容器中删除&nbsp;bean&nbsp;之前，destroy-method&nbsp;属性执行一个方法。这些方法是管理昂贵对象的好办法，它们以一种与&nbsp;Servlet&nbsp;生命周期相同的方式进行管理。<br /><br />
<h5>拦截&nbsp;Struts</h5>
<br />&nbsp;&nbsp;&nbsp;前面提到过，通过将&nbsp;Struts&nbsp;动作委托给&nbsp;Spring&nbsp;框架而整合&nbsp;Struts&nbsp;和&nbsp;Spring&nbsp;的一个主要的优点是：您可以将&nbsp;Spring&nbsp;的&nbsp;AOP&nbsp;拦截器应用于您的&nbsp;Struts&nbsp;动作。通过将&nbsp;Spring&nbsp;拦截器应用于&nbsp;Struts&nbsp;动作，您可以用最小的代价处理横切关注点。<br /><br />虽然&nbsp;Spring&nbsp;提供很多内置拦截器，但是我将向您展示如何创建自己的拦截器并把它应用于一个&nbsp;Struts&nbsp;动作。为了使用拦截器，您需要做三件事：<br /><br />
<ul>创建拦截器。</ul>
    <br />
    <ul>注册拦截器。</ul>
        <br />
        <ul>声明在何处拦截代码。</ul>
            <br />&nbsp;&nbsp;&nbsp;这看起来非常简单的几句话却非常强大。例如，在清单&nbsp;7&nbsp;中，我为&nbsp;Struts&nbsp;动作创建了一个日志记录拦截器。&nbsp;这个拦截器在每个方法调用之前打印一句话：<br /><br /><br />清单&nbsp;7.&nbsp;一个简单的日志记录拦截器<br /><br />
            <div class="codeStyle">
            <ol>
                <li><strong><font color="#0000ff">package</font></strong>&nbsp;ca.nexcel.books.interceptors; </li>
                <li>&nbsp;</li>
                <li><strong><font color="#0000ff">import</font></strong>&nbsp;org.springframework.aop.MethodBeforeAdvice; </li>
                <li>&nbsp;</li>
                <li><strong><font color="#0000ff">import</font></strong>&nbsp;java.lang.reflect.<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/reflect/Method.java.html" target="_blank"><font class="classLink"><u>Method</u></font></a></strong>; </li>
                <li>&nbsp;</li>
                <li><strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">class</font></strong>&nbsp;LoggingInterceptor&nbsp;<strong><font color="#0000ff">implements</font></strong>&nbsp;MethodBeforeAdvice&nbsp;{ </li>
                <li>&nbsp;</li>
                <li>&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public</font></strong>&nbsp;<strong><font color="#0000ff">void</font></strong>&nbsp;before(<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/reflect/Method.java.html" target="_blank"><font class="classLink"><u>Method</u></font></a></strong>&nbsp;method,&nbsp;<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/Object.java.html" target="_blank"><font class="classLink"><u>Object</u></font></a></strong>[]&nbsp;objects,&nbsp;<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/Object.java.html" target="_blank"><font class="classLink"><u>Object</u></font></a></strong>&nbsp;o)&nbsp;<strong><font color="#0000ff">throws</font></strong>&nbsp;<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/Throwable.java.html" target="_blank"><font class="classLink"><u>Throwable</u></font></a></strong>&nbsp;{ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/System.java.html" target="_blank"><font class="classLink"><u>System</u></font></a></strong>.out.println(<font color="#ff33ff">&quot;logging&nbsp;before!&quot;</font>); </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} </li>
                <li>} </li>
            </ol>
            </div>
            &nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp;这个拦截器非常简单。before()&nbsp;方法在拦截点中每个方法之前运行。在本例中，它打印出一句话，其实它可以做您想做的任何事。下一步就是在&nbsp;Spring&nbsp;配置文件中注册这个拦截器，如清单&nbsp;8&nbsp;所示：<br /><br /><br />清单&nbsp;8.&nbsp;在&nbsp;Spring&nbsp;配置文件中注册拦截器<br /><br />
            <div class="codeStyle">
            <ol>
                <li>&lt;?xml&nbsp;version=<font color="#ff33ff">&quot;1.0&quot;</font>&nbsp;encoding=<font color="#ff33ff">&quot;UTF-8&quot;</font>?&gt; </li>
                <li>&lt;!DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;<font color="#ff33ff">&quot;-//SPRING//DTD&nbsp;BEAN//EN&quot;</font>&nbsp; </li>
                <li>&nbsp;&nbsp;<font color="#ff33ff">&quot;http://www.springframework.org/dtd/spring-beans.dtd&quot;</font>&gt; </li>
                <li>&nbsp;</li>
                <li>&lt;beans&gt; </li>
                <li>&nbsp;&nbsp;&lt;bean&nbsp;id=<font color="#ff33ff">&quot;bookService&quot;</font>&nbsp;<strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">&quot;ca.nexcel.books.business.BookServiceImpl&quot;</font>/&gt; </li>
                <li>&nbsp;</li>
                <li>&nbsp;&nbsp;&lt;bean&nbsp;name=<font color="#ff33ff">&quot;/searchSubmit&quot;</font>&nbsp; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">&quot;ca.nexcel.books.actions.SearchSubmit&quot;</font>&gt; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<font color="#ff33ff">&quot;bookService&quot;</font>&gt; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&nbsp;bean=<font color="#ff33ff">&quot;bookService&quot;</font>/&gt; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt; </li>
                <li>&nbsp;&nbsp;&lt;/bean&gt; </li>
                <li>&nbsp;</li>
                <li>&nbsp;&nbsp;&lt;!--&nbsp;&nbsp;Interceptors&nbsp;--&gt;&nbsp; </li>
                <li>&nbsp;&nbsp;&lt;bean&nbsp;name=<font color="#ff33ff">&quot;logger&quot;</font>&nbsp;&nbsp;&nbsp;&nbsp; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">&quot;ca.nexcel.books.interceptors.LoggingInterceptor&quot;</font>/&gt;&nbsp;|(1) </li>
                <li>&nbsp;</li>
                <li>&nbsp;&nbsp;&lt;!--&nbsp;AutoProxies&nbsp;--&gt; </li>
                <li>&nbsp;&nbsp;&lt;bean&nbsp;name=<font color="#ff33ff">&quot;loggingAutoProxy&quot;</font>&nbsp; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">class</font></strong>=<font color="#ff33ff">&quot;org.springframework.aop.framework.autoproxy.</font> </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanNameAutoProxyCreator<font color="#ff33ff">&quot;&gt;&nbsp;|(2)</font> </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<font color="#ff33ff">&quot;beanNames&quot;</font>&gt; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;/searchSubmit&lt;/valuesgt;&nbsp;|(3) </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name=<font color="#ff33ff">&quot;interceptorNames&quot;</font>&gt; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;logger&lt;/value&gt;&nbsp;|(4) </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt; </li>
                <li>&nbsp;&nbsp;&nbsp;&lt;/bean&gt; </li>
                <li>&nbsp;</li>
                <li>&lt;/beans&gt; </li>
                <li>&nbsp; </li>
            </ol>
            </div>
            <br /><br />&nbsp;&nbsp;&nbsp;您可能已经注意到了，清单&nbsp;8&nbsp;扩展了&nbsp;清单&nbsp;6&nbsp;中所示的应用程序以包含一个拦截器。具体细节如下：<br /><br />在&nbsp;(1)&nbsp;处，我注册了这个拦截器。<br />在&nbsp;(2)&nbsp;处，我创建了一个&nbsp;bean&nbsp;名称自动代理，它描述如何应用拦截器。还有其他的方法定义拦截点，但是这种方法常见而简便。<br />在&nbsp;(3)&nbsp;处，我将&nbsp;Struts&nbsp;动作注册为将被拦截的&nbsp;bean。如果您想要拦截其他的&nbsp;Struts&nbsp;动作，则只需要在&nbsp;&quot;beanNames&quot;&nbsp;下面创建附加的&nbsp;&lt;value&gt;&nbsp;标记。<br />在&nbsp;(4)&nbsp;处，当拦截发生时，我执行了在&nbsp;(1)&nbsp;处创建的拦截器&nbsp;bean&nbsp;的名称。这里列出的所有拦截器都应用于&ldquo;beanNames&rdquo;。<br />就是这样。就像这个例子所展示的，将您的&nbsp;Struts&nbsp;动作置于&nbsp;Spring&nbsp;框架的控制之下，为处理您的&nbsp;Struts&nbsp;应用程序提供了一系列全新的选择。在本例中，使用动作委托可以轻松地利用&nbsp;Spring&nbsp;拦截器提高&nbsp;Struts&nbsp;应用程序中的日志记录能力。<br /><br />
            <h4>结束语</h4>
            <br /><br />&nbsp;&nbsp;&nbsp;在本文中，您已经学习了将&nbsp;Struts&nbsp;动作整合到&nbsp;Spring&nbsp;框架中的三种窍门。使用&nbsp;Spring&nbsp;的&nbsp;ActionSupport&nbsp;来整合&nbsp;Struts（第一种窍门中就是这样做的）简单而快捷，但是会将&nbsp;Struts&nbsp;动作与&nbsp;Spring&nbsp;框架耦合在一起。如果您需要将应用程序移植到一个不同的框架，则需要重写代码。第二种解决方法通过委托&nbsp;RequestProcessor&nbsp;巧妙地解开代码的耦合，但是它的可扩展性不强，并且当&nbsp;Struts&nbsp;的&nbsp;RequestProcessor&nbsp;变成一系列命令时，这种方法就持续不了很长时间。第三种方法是这三种方法中最好的：将&nbsp;Struts&nbsp;动作委托给&nbsp;Spring&nbsp;框架可以使代码解耦，从而使您可以在您的&nbsp;Struts&nbsp;应用程序中利用&nbsp;Spring&nbsp;的特性（比如日志记录拦截器）。<br /><br />三种&nbsp;Struts-Spring&nbsp;整合窍门中的每一种都被实现成一个完整可用的应用程序。请参阅&nbsp;下载&nbsp;部分仔细研究它们。<img src ="http://www.blogjava.net/jackylpz/aggbug/41354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackylpz/" target="_blank">过年</a> 2006-04-16 18:24 <a href="http://www.blogjava.net/jackylpz/archive/2006/04/16/41354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>