淺談Spring與Struts的結(jié)合運(yùn)用_JSP教程
教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!
推薦:Jsp之Struts入門簡(jiǎn)介Jsp之 Struts從產(chǎn)生到現(xiàn)在還不到半年,但已逐步越來(lái)越多運(yùn)用于商業(yè)軟件。雖然它現(xiàn)在還有不少缺點(diǎn),但它是一種非常優(yōu)秀的J2EEMVC實(shí)現(xiàn)方式,如果你的系統(tǒng)準(zhǔn)備采用J2EEMVC架構(gòu),那么,不妨考慮一下Struts,下面本文對(duì) Jsp之 Struts做一簡(jiǎn)要介紹。 1.安裝Struts
本文介紹一下,如何整合這兩個(gè)J2EE領(lǐng)域的經(jīng)典項(xiàng)目并給出兩套詳盡的集成方案。Jakarta-Struts是Apache軟件組織提供的一個(gè)開(kāi)源項(xiàng)目.它為Java Web應(yīng)用提供了基于Model-View-Controller的MVC框架,尤其適用于開(kāi)發(fā)大型可擴(kuò)展的Web應(yīng)用.盡管基于Java的MVC框架層出不窮,事實(shí)上Spring的MVC模型也提供了驅(qū)動(dòng)應(yīng)用系統(tǒng)Web層的能力,但Jakarta-Struts仍然是所有這些框架中的佼佼者.
Spring是一個(gè)輕量級(jí)(大小和系統(tǒng)開(kāi)支的角度)的IoC和AOP容器.它力圖簡(jiǎn)化J2EE開(kāi)發(fā)即J2EE without EJB.而且作為幫助企業(yè)級(jí)開(kāi)發(fā)的核心支柱,Spring為模型層(OR持久層:Hibernate、JDO、iBatis等)服務(wù)層(EJB、JNDI、WebService)以及表現(xiàn)層(Struts、JSF、Velocity)都提供了良好的支持和集成方案.
1.首先我們來(lái)看一個(gè)Spring-Struts整合應(yīng)用下的控制器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為一個(gè)業(yè)務(wù)實(shí)現(xiàn)的接口,此接口聲明了一系列的業(yè)務(wù)處理方法.該方法的實(shí)現(xiàn)配置為Spring上下問(wèn)的一個(gè)Bean.由此看來(lái),我們大家都可能會(huì)產(chǎn)生一個(gè)疑問(wèn):Struts action如何取得一個(gè)包含在Spring上下文中的Bean呢?為了回答這個(gè)問(wèn)題,Spring提供了兩種與Struts集成的方式:
(1).從一個(gè)知曉Spring上下文的基類派生我們自己的Struts Action類.然后,在派生類中就可以使用super.XX()方法來(lái)獲得一個(gè)對(duì)Spring受控Bean的引用.
(2).將請(qǐng)求委托給作為Spring Bean管理的Struts Action來(lái)處理.
2.注冊(cè)Spring插件:為了使Struts Action能夠訪問(wèn)由Spring管理的Bean,我們就必須要注冊(cè)一個(gè)知道Spring應(yīng)用上下文的Struts插件.可以在struts-config.xml中通過(guò)如下的方式來(lái)完成注冊(cè).
< plug-in classname="org.springframework.web.struts.ContextLoadPlugin">
< set-property value="WEB-INF/Yhcip.xml,......" property="contextConfigLocation"> < /PLUG-IN>
ContextLoadPlugin()負(fù)責(zé)裝載一個(gè)Spring應(yīng)用上下文.(具體的說(shuō):是一個(gè)WebApplicationContext).value屬性值為要加載的配置Spring受控Bean的xml文件的URI.
3.完成第一種集成方案:實(shí)現(xiàn)一個(gè)知曉Spring的Action基類.
這種集成方案是從一個(gè)公共的能夠訪問(wèn)Spring應(yīng)用上下文的基類中派生所有的Struts Action,但值得慶幸的是:我們不用自己去編寫這個(gè)知曉Spring應(yīng)用上下文的基類,因?yàn)镾pring已經(jīng)提供了org.springframework.web.struts.ActionSupport:一個(gè)org.apache.struts.action.Action的抽象實(shí)現(xiàn).它重載了setServlet()方法以從ContextLoaderPlugin中獲取WebapplicationContext.因此,任何時(shí)候我們只需要調(diào)用super.getBean()方法即可獲得一Spring上下文中的一個(gè)Bean的引用.
我們?cè)賮?lái)看一段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"); }}
分析:這個(gè)Action類由ActionSupport派生,當(dāng)CourceAction需要一個(gè)Spring受控Bean時(shí):它首先調(diào)用基類的getWebApplicationContext()方法以取得一個(gè)Spring應(yīng)用上下文的引用;接著它調(diào)用getBean()方法來(lái)獲取由Spring管理的courceService Bean的一個(gè)引用.
小結(jié)
至此,我們已經(jīng)用第一種方案圓滿的完成了Spring與Struts的集成工作.這種集成方式的好處在于直觀簡(jiǎn)潔容易上手.除了需要從ActionSupport中派生,以及需要從應(yīng)用上下文中獲取Bean之外,其他都與在非Spring的Struts中編寫和配置Action的方法相似.但這種集成方案也有不利的一面.最為顯著的是:我們的Action類將直接使用Spring提供的特定類,這樣會(huì)使我們的Struts Action(即控制層)的代碼與Spring緊密耦合在一起.這是我們不情愿看到的.另外,Action類也負(fù)責(zé)查找由Spring管理的Bean,這違背了反向控制(IoC)的原則.
4.實(shí)現(xiàn)第二種集成方案:代理和委托Action.
這種集成方案要求我們編寫一個(gè)Struts Action,但它只不過(guò)是一個(gè)包含在Spring應(yīng)用上下文中的真正Struts Action的一個(gè)代理.該代理Action從Struts插件ContextLoaderPlugIn中獲取應(yīng)用上下文,從中查找真正的Struts Action,然后將處理委托給真正的Struts Action.這個(gè)方法的幽雅之處在于:只有代理action才會(huì)包含Spring特定的處理.真正的Action可以作為org.apache.struts.Action的子類來(lái)編寫.
下面我們來(lái)看一段在之中集成方式下的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)機(jī)制把CourceService注入到了我們的Action中.到此,大家肯定會(huì)有一個(gè)疑問(wèn):那就是Spring到底是如何提供IoC反向控制的呢?回答這個(gè)問(wèn)題,我們需要完成兩個(gè)步驟的配置:
(1).在struts-config.xml中注冊(cè)Struts Action.但要注意的是我們?cè)谶@里注冊(cè)的是代理Action.幸運(yùn)的是,我們不必親自編寫這個(gè)類.因?yàn)镾pring已經(jīng)通過(guò)org.springframework.web.struts.DelegatingActionProxy提供了這個(gè)代理的Action.具體的配置方法如下:
< action type="org.springframework.web.struts.DelegatingActionProxy" path="/listCourses">
(2)將真正的Struts Action作為一個(gè)Spring Bean并在Spring上下文配置文件中作為一個(gè)Bean注冊(cè)之.并將Action所要引用的courceService注入給它.
< bean class="com.eRedCIP.web.CourceAction" name="/listCourses"> < property name=""> < ref bean="courseService"> < /property> < /bean>
注意:name屬性的值是非常重要的,它必須和struts-config.xml中的path屬性完全一致.這是因?yàn)镈elegatingActionProxy會(huì)使用path屬性值在Spring上下文中查找真正的Action.使用DelegatingActionProxy的好處在于我們可以不使用任何Spring特定的類來(lái)編寫Struts Action.同時(shí),Struts動(dòng)作能夠利用IoC取得和他合作的對(duì)象.唯一不足之處就是不太直觀,配置相對(duì)復(fù)雜.為了使action委托顯得更為直觀一些,我們可對(duì)這種集成方案做進(jìn)一步的改進(jìn):使用請(qǐng)求委托.
5.使用請(qǐng)求委托.
為了使action委托看上去更為直觀一些,Spring提供了DelegatingRequestProcessor,另一種專門用于Spring的請(qǐng)求處理器.需要在struts-config.xml中做如下配置:
< controller processorclass="org.springframework.web.struts.DelegatingRequestProcessor">
這樣,DelegatingRequestProcessor將告訴Struts自動(dòng)將動(dòng)作請(qǐng)求委托給Spring上下文中的Action來(lái)處理.這使得我們可以在struts-config.xml中用struts action的真正類型來(lái)聲明它們.例如:
< action type="com.eRedCIP.web.CourceAction" path="/listCourses">
當(dāng)接受到一個(gè)針對(duì)/listCourses的請(qǐng)求時(shí),DelegatingRequestProcessor會(huì)自動(dòng)從Spring上下文配置文件中查找一個(gè)名為/listCourses的Bean(實(shí)為一個(gè)Struts Action)類.
< action type="com.eRedCIP.web.CourceAction" path="/listCourses">
分享:正則表達(dá)式入門簡(jiǎn)介簡(jiǎn)單的說(shuō),正則表達(dá)式是一種可以用于模式匹配和替換的強(qiáng)有力的工具。我們可以在幾乎所有的基于UNIX系統(tǒng)的工具中找到正則表達(dá)式的身影,例如,vi編輯器,Perl或PHP腳本語(yǔ)言,以及awk或sedshell程序等。此外,象Java script 這種客戶端的腳本語(yǔ)言也提供了對(duì)正
相關(guān)JSP教程:
- jsp response.sendRedirect不跳轉(zhuǎn)的原因分析及解決
- JSP指令元素(page指令/include指令/taglib指令)復(fù)習(xí)整理
- JSP腳本元素和注釋復(fù)習(xí)總結(jié)示例
- JSP FusionCharts Free顯示圖表 具體實(shí)現(xiàn)
- 網(wǎng)頁(yè)模板:關(guān)于jsp頁(yè)面使用jstl的異常分析
- JSP頁(yè)面中文傳遞參數(shù)使用escape編碼
- 基于jsp:included的使用與jsp:param亂碼的解決方法
- Java Web項(xiàng)目中連接Access數(shù)據(jù)庫(kù)的配置方法
- JDBC連接Access數(shù)據(jù)庫(kù)的幾種方式介紹
- 網(wǎng)站圖片路徑的問(wèn)題:絕對(duì)路徑/虛擬路徑
- (jsp/html)網(wǎng)頁(yè)上嵌入播放器(常用播放器代碼整理)
- jsp下顯示中文文件名及絕對(duì)路徑下的圖片解決方法
JSP教程Rss訂閱編程教程搜索
JSP教程推薦
猜你也喜歡看這些
- 解析JSP中標(biāo)簽庫(kù)
- JSP動(dòng)態(tài)網(wǎng)頁(yè)程序中中文亂碼的解決方法
- JSP FusionCharts Free顯示圖表 具體實(shí)現(xiàn)
- J2ME編程實(shí)踐之靈活的RMS應(yīng)用
- J2ME手機(jī)開(kāi)發(fā)的部分問(wèn)題解答
- JSF和Struts框架的錯(cuò)誤控制與封裝處理
- JSP和JSF雙劍合并 打造完美Web應(yīng)用
- 加快JDBC中JSP數(shù)據(jù)庫(kù)的訪問(wèn)速度
- J2ME中實(shí)現(xiàn)可伸展目錄樹(shù)TreeList
- 揭秘5種JSP頁(yè)面顯示為亂碼的解決方法
- 相關(guān)鏈接:
- 教程說(shuō)明:
JSP教程-淺談Spring與Struts的結(jié)合運(yùn)用
。