亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

淺談Spring與Struts的結合運用

2024-09-05 00:17:23
字體:
來源:轉載
供稿:網友
    本文介紹一下,如何整合這兩個J2EE領域的經典項目并給出兩套詳盡的集成方案。

    Jakarta-Struts是Apache軟件組織提供的一個開源項目.它為Java Web應用提供了基于Model-View-Controller的MVC框架,尤其適用于開發大型可擴展的Web應用.盡管基于Java的MVC框架層出不窮,事實上Spring的MVC模型也提供了驅動應用系統Web層的能力,但Jakarta-Struts仍然是所有這些框架中的佼佼者. 
    Spring是一個輕量級(大小和系統開支的角度)的IoC和AOP容器.它力圖簡化J2EE開發即J2EE without EJB.而且作為幫助企業級開發的核心支柱,Spring為模型層(OR持久層:Hibernate、JDO、iBatis等)服務層(EJB、JNDI、WebService)以及表現層(Struts、JSF、Velocity)都提供了良好的支持和集成方案.  

    1.首先我們來看一個Spring-Struts整合應用下的控制器Action類源代碼. 
    public class CourceAction extends Action 
{
 private CourceService courceService;
 public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception 
{ Set allCources = courceService.getAllCources(); //..........the other statements request.setAttribute("cources", allCources); 
return mapping.findForward("jspView");
 }
 } 
    分析:CourceService為一個業務實現的接口,此接口聲明了一系列的業務處理方法.該方法的實現配置為Spring上下問的一個Bean.由此看來,我們大家都可能會產生一個疑問:Struts action如何取得一個包含在Spring上下文中的Bean呢?為了回答這個問題,Spring提供了兩種與Struts集成的方式: 
    (1).從一個知曉Spring上下文的基類派生我們自己的Struts Action類.然后,在派生類中就可以使用super.XX()方法來獲得一個對Spring受控Bean的引用. 
    (2).將請求委托給作為Spring Bean管理的Struts Action來處理. 
    2.注冊Spring插件:為了使Struts Action能夠訪問由Spring管理的Bean,我們就必須要注冊一個知道Spring應用上下文的Struts插件.可以在struts-config.xml中通過如下的方式來完成注冊. 
    < plug-in classname="org.springframework.web.struts.ContextLoadPlugin"> 
< set-property value="WEB-INF/Yhcip.xml,......" property="contextConfigLocation"> < /PLUG-IN> 
    ContextLoadPlugin()負責裝載一個Spring應用上下文.(具體的說:是一個WebApplicationContext).value屬性值為要加載的配置Spring受控Bean的xml文件的URI. 
    3.完成第一種集成方案:實現一個知曉Spring的Action基類. 
    這種集成方案是從一個公共的能夠訪問Spring應用上下文的基類中派生所有的Struts Action,但值得慶幸的是:我們不用自己去編寫這個知曉Spring應用上下文的基類,因為Spring已經提供了org.springframework.web.struts.ActionSupport:一個org.apache.struts.action.Action的抽象實現.它重載了setServlet()方法以從ContextLoaderPlugin中獲取WebapplicationContext.因此,任何時候我們只需要調用super.getBean()方法即可獲得一Spring上下文中的一個Bean的引用. 
   我們再來看一段Action源代碼: 
    public class CourceAction extends ActionSupport
{
public ActionForward execute(
ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
{ //取得Spring上下文 ApplicationContext context = super.getWebApplicationContext();
//取得CourceService Bean CourseService courseService = (CourseService) context.getBean("courseService");
Set allCources = courceService.getAllCources();
request.setAttribute("cources", allCources);
//..........the other statements. return mapping.findForward("jspView"); }} 
    分析:這個Action類由ActionSupport派生,當CourceAction需要一個Spring受控Bean時:它首先調用基類的getWebApplicationContext()方法以取得一個Spring應用上下文的引用;接著它調用getBean()方法來獲取由Spring管理的courceService Bean的一個引用. 
    小結 
    至此,我們已經用第一種方案圓滿的完成了Spring與Struts的集成工作.這種集成方式的好處在于直觀簡潔容易上手.除了需要從ActionSupport中派生,以及需要從應用上下文中獲取Bean之外,其他都與在非Spring的Struts中編寫和配置Action的方法相似.但這種集成方案也有不利的一面.最為顯著的是:我們的Action類將直接使用Spring提供的特定類,這樣會使我們的Struts Action(即控制層)的代碼與Spring緊密耦合在一起.這是我們不情愿看到的.另外,Action類也負責查找由Spring管理的Bean,這違背了反向控制(IoC)的原則. 

    4.實現第二種集成方案:代理和委托Action. 
    這種集成方案要求我們編寫一個Struts Action,但它只不過是一個包含在Spring應用上下文中的真正Struts Action的一個代理.該代理Action從Struts插件ContextLoaderPlugIn中獲取應用上下文,從中查找真正的Struts Action,然后將處理委托給真正的Struts Action.這個方法的幽雅之處在于:只有代理action才會包含Spring特定的處理.真正的Action可以作為org.apache.struts.Action的子類來編寫. 
    下面我們來看一段在之中集成方式下的Struts Action源代碼: 
    public class CourceAction extends Action 
{ private CourceService courceService; public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
 { Set allCources = courceService.getAllCources(); 
request.setAttribute("cources", allCources); //..........the other statements. return mapping.findForward("jspView"); 
} /* 注入CourceService */ 
public void setCourceService(CourceService courceService)
 { this.courceService = courceService; 
}

    分析:大家可以看到,在這種方式之下,我們的Struts Action類和Spring是低耦合的,它僅僅依賴了Spring提供的反向控制(IoC)機制把CourceService注入到了我們的Action中.到此,大家肯定會有一個疑問:那就是Spring到底是如何提供IoC反向控制的呢?回答這個問題,我們需要完成兩個步驟的配置: 
    (1).在struts-config.xml中注冊Struts Action.但要注意的是我們在這里注冊的是代理Action.幸運的是,我們不必親自編寫這個類.因為Spring已經通過org.springframework.web.struts.DelegatingActionProxy提供了這個代理的Action.具體的配置方法如下: 
    < action type="org.springframework.web.struts.DelegatingActionProxy" path="/listCourses"> 
    (2)將真正的Struts Action作為一個Spring Bean并在Spring上下文配置文件中作為一個Bean注冊之.并將Action所要引用的courceService注入給它. 
    < bean class="com.eRedCIP.web.CourceAction" name="/listCourses"> < property name=""> < ref bean="courseService"> < /property> < /bean> 
    注意:name屬性的值是非常重要的,它必須和struts-config.xml中的path屬性完全一致.這是因為DelegatingActionProxy會使用path屬性值在Spring上下文中查找真正的Action.使用DelegatingActionProxy的好處在于我們可以不使用任何Spring特定的類來編寫Struts Action.同時,Struts動作能夠利用IoC取得和他合作的對象.唯一不足之處就是不太直觀,配置相對復雜.為了使action委托顯得更為直觀一些,我們可對這種集成方案做進一步的改進:使用請求委托. 
    5.使用請求委托. 
    為了使action委托看上去更為直觀一些,Spring提供了DelegatingRequestProcessor,另一種專門用于Spring的請求處理器.需要在struts-config.xml中做如下配置: 
    < controller processorclass="org.springframework.web.struts.DelegatingRequestProcessor"> 
    這樣,DelegatingRequestProcessor將告訴Struts自動將動作請求委托給Spring上下文中的Action來處理.這使得我們可以在struts-config.xml中用struts action的真正類型來聲明它們.例如: 
    < action type="com.eRedCIP.web.CourceAction" path="/listCourses"> 
    當接受到一個針對/listCourses的請求時,DelegatingRequestProcessor會自動從Spring上下文配置文件中查找一個名為/listCourses的Bean(實為一個Struts Action)類. 
    < action type="com.eRedCIP.web.CourceAction" path="/listCourses"> 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲free性xxxx护士hd| 91色中文字幕| 国产精品旅馆在线| 欧美色欧美亚洲高清在线视频| 中文字幕日韩精品在线观看| 91在线观看免费网站| 97精品免费视频| 日韩在线视频网站| 日韩av免费一区| 欧美一级视频一区二区| 国产69精品久久久久久| 日韩中文字幕在线观看| 日韩av手机在线观看| 奇米4444一区二区三区| 亚洲国产精彩中文乱码av| 欧美高清视频免费观看| 国产精品入口福利| 欧美—级a级欧美特级ar全黄| 69久久夜色精品国产69| 久国内精品在线| 欧美激情综合色| 亚洲免费电影一区| 成人激情免费在线| 韩国精品久久久999| 精品视频www| 九九热视频这里只有精品| 欧美精品在线视频观看| 日韩暖暖在线视频| 亚洲欧美国产制服动漫| 国产精品入口夜色视频大尺度| 亚洲电影免费观看高清完整版| 国产精品免费一区豆花| 91夜夜未满十八勿入爽爽影院| 最近2019中文字幕第三页视频| 亚洲国产美女精品久久久久∴| 国产精品激情自拍| 久久av中文字幕| 欧美精品18videosex性欧美| 国产一区二区三区视频| 日韩有码在线观看| 亚洲最新av网址| 一区二区成人av| 国产日韩欧美成人| 亚洲欧洲日产国码av系列天堂| 久久久久久久久久久亚洲| 欧美洲成人男女午夜视频| 亚洲资源在线看| 色妞久久福利网| 国产成人av在线| 国产一区二区三区在线免费观看| 91天堂在线视频| 亚洲第一页在线| 日韩欧美亚洲范冰冰与中字| 欧美亚洲国产成人精品| 久久久免费精品视频| 性金发美女69hd大尺寸| 欧美日韩美女在线| 亚州国产精品久久久| 国产欧美日韩免费| 日韩精品视频在线观看网址| 久久综合久久八八| 午夜剧场成人观在线视频免费观看| 成人免费视频a| 亚洲国产精品久久91精品| 美女久久久久久久久久久| 亚洲午夜av久久乱码| 欧美猛交免费看| 欧美人与性动交| 一区二区在线视频| 92版电视剧仙鹤神针在线观看| 欧美一区在线直播| 久久精品成人一区二区三区| 欧美中文在线观看国产| 色妞色视频一区二区三区四区| 久久偷看各类女兵18女厕嘘嘘| 久久精品中文字幕一区| 国产视频精品va久久久久久| 欧美高清videos高潮hd| 在线成人激情黄色| 91精品久久久久久久久久入口| 亚洲精品国产成人| 国产一区二区精品丝袜| 国产精品久久久久久久久久ktv| 亚洲美女视频网站| 成人午夜激情免费视频| 成人性生交大片免费看视频直播| 亚洲成人久久久| 91网在线免费观看| 久久网福利资源网站| 国产精品第一第二| 精品成人久久av| 久久av在线看| 国产精品久久久久久久av大片| 狠狠躁夜夜躁久久躁别揉| 精品福利一区二区| 欧美成人一区二区三区电影| 国产欧美日韩精品丝袜高跟鞋| 精品国产户外野外| 成人有码在线视频| 精品国产31久久久久久| 亚洲成人黄色在线观看| 日韩中文在线观看| 91亚洲国产成人精品性色| 日本欧美精品在线| 欧美限制级电影在线观看| 色99之美女主播在线视频| 亚洲欧美中文日韩在线| 97精品国产91久久久久久| 亚洲欧洲美洲在线综合| 日韩欧美有码在线| 一区二区三区视频免费在线观看| 亚洲第一免费网站| 亚洲一级黄色av| 日韩av一区在线| 精品国产老师黑色丝袜高跟鞋| 亚洲肉体裸体xxxx137| 国内精品久久久久久久| 狠狠躁夜夜躁人人爽天天天天97| 亚洲欧美一区二区三区四区| 国产精品欧美日韩久久| 最新91在线视频| 九色精品免费永久在线| 欧美性xxxx18| 中文字幕国产亚洲| 亚洲一区二区国产| 自拍亚洲一区欧美另类| 成人免费视频在线观看超级碰| 啊v视频在线一区二区三区| 亚洲国产日韩欧美综合久久| 亚洲日韩欧美视频一区| 亚洲精品小视频在线观看| 热re99久久精品国产66热| 亚洲欧美国产精品久久久久久久| 欧美专区在线观看| 亚洲欧美激情精品一区二区| 国产精品美女www| 欧美一区视频在线| 永久免费精品影视网站| 亚洲性猛交xxxxwww| 国产亚洲精品美女久久久| 国产成人在线播放| 久久久久久国产精品美女| 久久影院在线观看| 欧美日韩在线视频一区| 97欧美精品一区二区三区| 国产精品爽黄69天堂a| 亚洲另类图片色| 国产精品三级网站| 欧美又大又硬又粗bbbbb| 这里精品视频免费| 永久免费精品影视网站| 日韩欧美综合在线视频| 欧美日韩国产综合视频在线观看中文| 欧美大码xxxx| 91在线免费观看网站| 国产精品久久久久久久久久ktv| 在线视频精品一| 91精品视频一区| 欧美日韩视频在线| 国产精品欧美风情| 136fldh精品导航福利| 欧美成人性色生活仑片| 91免费视频国产| 精品久久久国产|