- 基于Struts、Hibernate、Spring架構(gòu)的Web應(yīng)用開(kāi)發(fā)
- 范新?tīng)N編著
- 4979字
- 2018-12-30 14:56:30
1.3 J2EE輕量級(jí)框架Struts+Spring+Hibernate
1.3.1 輕量級(jí)J2EE架構(gòu)技術(shù)
輕量級(jí)是指一種開(kāi)發(fā)方法,指簡(jiǎn)化的編程模型和更具響應(yīng)能力的容器等,輕量級(jí)開(kāi)發(fā)旨在消除傳統(tǒng)API的復(fù)雜性與限制,同時(shí),采用輕量級(jí)的方式進(jìn)行開(kāi)發(fā)也縮短了應(yīng)用程序的開(kāi)發(fā)周期與部署上的復(fù)雜度。
輕量級(jí)的軟件開(kāi)發(fā)不強(qiáng)迫業(yè)務(wù)對(duì)象遵循平臺(tái)接口,可以使用POJO來(lái)實(shí)現(xiàn)業(yè)務(wù)。IOC模式在輕量級(jí)的領(lǐng)域中起著巨大的作用,它的引入解決了對(duì)象依賴性的問(wèn)題,有助于簡(jiǎn)化代碼、將業(yè)務(wù)邏輯與基礎(chǔ)架構(gòu)分離,使應(yīng)用程序高內(nèi)聚、低耦合,從而使應(yīng)用程序更易于維護(hù),提高了開(kāi)發(fā)效率,也使框架響應(yīng)能力提高,達(dá)到了簡(jiǎn)化的目的。
為解決經(jīng)典架構(gòu)中的一系列問(wèn)題,J2EE逐漸流行起非EJB架構(gòu)的“輕量級(jí)容器”,它與EJB架構(gòu)一樣,由容器管理業(yè)務(wù)對(duì)象,然后再組織整個(gè)架構(gòu),但是業(yè)務(wù)對(duì)象運(yùn)行在“輕量級(jí)容器”中。輕量級(jí)容器不和J2EE綁定,既可運(yùn)行在Web容器中,也可運(yùn)行在一個(gè)標(biāo)準(zhǔn)應(yīng)用程序中。
輕量級(jí)容器的啟動(dòng)開(kāi)銷(xiāo)很小,而且無(wú)需EJB部署,提供了一種管理、定位業(yè)務(wù)對(duì)象的方法,不必使用JNDI尋址、定制服務(wù)器之類(lèi)的額外輔助,并為應(yīng)用對(duì)象提供注冊(cè)服務(wù)。輕量級(jí)容器較EJB功能強(qiáng)大,避免了容器強(qiáng)制業(yè)務(wù)對(duì)象采用特定的接口,降低了侵入性。
1.3.2 認(rèn)識(shí)SSH
SSH在J2EE項(xiàng)目中表示了3種框架,即Spring + Struts +Hibernate 。
在基于J2EE的應(yīng)用程序開(kāi)發(fā)過(guò)程中,難于控制開(kāi)發(fā)進(jìn)度、開(kāi)發(fā)效率低下、部署環(huán)境復(fù)雜、維護(hù)困難等問(wèn)題層出不窮。對(duì)于中小企業(yè),使用完整的J2EE實(shí)現(xiàn)過(guò)于龐大,最終常導(dǎo)致開(kāi)發(fā)的失敗。
J2EE輕量級(jí)框架Struts+Spring+Hibernate應(yīng)運(yùn)而生,并逐漸流行,輕量級(jí)是和以EJB為核心的復(fù)雜框架對(duì)比而言的。輕量級(jí)框架致力于提供最簡(jiǎn)單的組件來(lái)構(gòu)筑Web應(yīng)用系統(tǒng),Spring是典型的一種輕量級(jí)架構(gòu),越來(lái)越多的開(kāi)發(fā)人員開(kāi)始關(guān)注并使用這種架構(gòu)。通過(guò)Spring組合其他專(zhuān)一的開(kāi)源產(chǎn)品,如表示層的Struts、持久對(duì)象層的Hibernate,來(lái)構(gòu)建應(yīng)用系統(tǒng),實(shí)現(xiàn)J2EE簡(jiǎn)單化編程。如圖1-12所示。

圖1-12 Struts+Spring+Hibernate框架體系結(jié)構(gòu)圖
整體框架和業(yè)務(wù)層用Spring,表示層用Struts,而持久層用Hibernate。Spring是一個(gè)開(kāi)放的框架,不要求一定要用Spring自己的解決方案。Struts作為表示層的成熟技術(shù)已經(jīng)在市場(chǎng)上廣泛應(yīng)用,可以很好地和Spring技術(shù)中間層緊密結(jié)合,Struts可以使用Spring提供的事務(wù)處理等特性,所以選擇Struts作為框架的表示層技術(shù)。Spring按照資源管理的方法提供和Hibernate的集成及DAO(Data Access Object)實(shí)現(xiàn)和事務(wù)策略支持,Spring通過(guò)IOC(控制反轉(zhuǎn))機(jī)制和Hibernate集成,Spring能夠很好地支持開(kāi)發(fā)人員選擇O/R映射技術(shù)。
1.Struts
如圖1-13所示,Struts對(duì)Model、View和Controller都提供了對(duì)應(yīng)的組件。 ActionServlet類(lèi)是Struts的核心控制器,負(fù)責(zé)攔截來(lái)自用戶的請(qǐng)求。Action類(lèi)通常由用戶提供,該控制器負(fù)責(zé)接收來(lái)自ActionServlet的請(qǐng)求,并根據(jù)該請(qǐng)求調(diào)用模型的業(yè)務(wù)邏輯方法處理請(qǐng)求,然后將處理結(jié)果返回給JSP頁(yè)面顯示。

圖1-13 Struts 框架結(jié)構(gòu)
(1)Model部分。Model部分由ActionForm和JavaBean組成,其中ActionForm用于封裝用戶的請(qǐng)求參數(shù),將其封裝成ActionForm對(duì)象,該對(duì)象被ActionServlet轉(zhuǎn)發(fā)給Action,Action根據(jù)ActionForm里面的請(qǐng)求參數(shù)處理用戶的請(qǐng)求。JavaBean則封裝了底層的業(yè)務(wù)邏輯,包括數(shù)據(jù)庫(kù)訪問(wèn)等。
(2)View部分。該部分采用JSP實(shí)現(xiàn)。 Struts提供了豐富的標(biāo)簽庫(kù),通過(guò)標(biāo)簽庫(kù)可以減少腳本的使用,自定義的標(biāo)簽庫(kù)可以實(shí)現(xiàn)與Model的有效交互,并增加了現(xiàn)實(shí)功能。對(duì)應(yīng)圖中的JSP部分。
(3)Controller組件。Controller組件由兩個(gè)部分組成——系統(tǒng)核心控制器和業(yè)務(wù)邏輯控制器。
系統(tǒng)核心控制器,對(duì)應(yīng)圖1-13中的ActionServlet。該控制器由Struts框架提供,繼承HttpServlet類(lèi),因此可以配置成標(biāo)注的Servlet。該控制器負(fù)責(zé)攔截所有的HTTP請(qǐng)求,然后根據(jù)用戶請(qǐng)求決定是否要轉(zhuǎn)給業(yè)務(wù)邏輯控制器。業(yè)務(wù)邏輯控制器負(fù)責(zé)處理用戶請(qǐng)求,本身不具備處理能力,而是調(diào)用Model來(lái)完成處理,對(duì)應(yīng)Action部分。
Struts的優(yōu)點(diǎn)在于實(shí)現(xiàn)了MVC模式,將Web系統(tǒng)各組件進(jìn)行了良好的分工合作;Spring的特性在于IoC機(jī)制;Hibernate的長(zhǎng)處在于數(shù)據(jù)持久化。要結(jié)合這3種技術(shù)的優(yōu)點(diǎn),采取的策略有許多種,如可以將Hibernate的sessionFactory、數(shù)據(jù)操作組件交給Spring容器來(lái)管理,必要時(shí)進(jìn)行注入處理;可以將Struts的Action交給Spring容器來(lái)管理,而不必再在Action中聲明業(yè)務(wù)邏輯操作的組件。
2.Spring
Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IOC)和面向切面(AOP)的容器框架。Spring的目的是解決企業(yè)應(yīng)用開(kāi)發(fā)的復(fù)雜性,它使用基本的JavaBean代替EJB,并提供更多的企業(yè)應(yīng)用功能,可在任何Java中應(yīng)用。
Spring框架是一個(gè)分層架構(gòu),由7個(gè)定義良好的模塊組成。Spring模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理Bean的方式,其體系結(jié)構(gòu)如圖1-14所示。

圖1-14 Spring 框架體系結(jié)構(gòu)
從大小與開(kāi)銷(xiāo)兩方面而言,Spring都是輕量的。完整的Spring框架可以在一個(gè)大小只有1MB多的JAR文件里發(fā)布。并且Spring所需的處理開(kāi)銷(xiāo)也是微不足道的。此外,Spring是非侵入式的,Spring應(yīng)用中的對(duì)象不依賴于Spring的特定類(lèi)。
(1)控制反轉(zhuǎn)。Spring通過(guò)一種稱做控制反轉(zhuǎn)(IOC)的技術(shù)促進(jìn)了松耦合。當(dāng)應(yīng)用了IOC時(shí),一個(gè)對(duì)象依賴的其他對(duì)象會(huì)通過(guò)被動(dòng)的方式傳遞進(jìn)來(lái),而不是這個(gè)對(duì)象自己創(chuàng)建或查找依賴對(duì)象。可以認(rèn)為IOC與JNDI相反——不是對(duì)象從容器中查找依賴,而是容器在對(duì)象初始化時(shí)不等對(duì)象請(qǐng)求就主動(dòng)將依賴傳遞給它。
(2)面向切面。Spring提供了面向切面編程的豐富支持,允許通過(guò)分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)級(jí)服務(wù)(如審計(jì)(Auditing)和事務(wù)(Transaction)管理)進(jìn)行內(nèi)聚性的開(kāi)發(fā)。應(yīng)用對(duì)象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯,僅此而已。它們并不負(fù)責(zé)(甚至是意識(shí))其他的系統(tǒng)級(jí)關(guān)注點(diǎn),如日志或事務(wù)支持。
(3)容器。Spring包含并管理應(yīng)用對(duì)象的配置和生命周期,在這個(gè)意義上它是一種容器,你可以配置你的每個(gè)Bean如何被創(chuàng)建,基于一個(gè)可配置原型(Prototype),你的Bean可以創(chuàng)建一個(gè)單獨(dú)的實(shí)例或每次需要時(shí)都生成一個(gè)新的實(shí)例,以及它們是如何相互關(guān)聯(lián)的。然而, Spring不應(yīng)該被混同于傳統(tǒng)的重量級(jí)的EJB容器,它們經(jīng)常是龐大與笨重的,難以使用。
(4)框架。Spring可以將簡(jiǎn)單的組件配置、組合成為復(fù)雜的應(yīng)用。在Spring中,應(yīng)用對(duì)象被聲明式地組合,典型地是在一個(gè)XML文件里。Spring也提供了很多基礎(chǔ)功能(事務(wù)管理、持久化框架集成等),將應(yīng)用邏輯的開(kāi)發(fā)留給了你。
所有Spring的這些特征使你能夠編寫(xiě)更干凈、更可管理、更易于測(cè)試的代碼。它們也為Spring中的各種模塊提供了基礎(chǔ)支持。
3.Hibernate
Hibernate是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java程序員可以隨心所欲地使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合,既可以在Java的客戶端程序中使用,也可以在Servlet/JSP的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在應(yīng)用EJB的J2EE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任,Hibernate的工作原理如圖1-15所示。

圖1-15 Hibernate工作原理
Hibernate的核心接口一共有5個(gè),分別為:Session、SessionFactory、Transaction、Query和Configuration。這5個(gè)核心接口在任何開(kāi)發(fā)中都會(huì)用到。通過(guò)這些接口,不僅可以對(duì)持久化對(duì)象進(jìn)行存取,還能夠進(jìn)行事務(wù)控制。下面對(duì)這五個(gè)核心接口分別加以介紹。
(1)Session接口。Session接口負(fù)責(zé)執(zhí)行被持久化對(duì)象的CRUD操作(CRUD的任務(wù)是完成與數(shù)據(jù)庫(kù)的交流,它包含了很多常見(jiàn)的SQL語(yǔ)句。)。但需要注意的是,Session對(duì)象是非線程安全的。同時(shí),Hibernate的Session不同于JSP應(yīng)用中的HttpSession。這里,當(dāng)使用Session這個(gè)術(shù)語(yǔ)時(shí),其實(shí)指的是Hibernate中的Session,而以后會(huì)將HttpSesion對(duì)象稱為用戶Session。
(2)SessionFactory接口。SessionFactory接口負(fù)責(zé)初始化Hibernate。它充當(dāng)數(shù)據(jù)存儲(chǔ)源的代理,并負(fù)責(zé)創(chuàng)建Session對(duì)象。這里用到了工廠模式。需要注意的是,SessionFactory并不是輕量級(jí)的,因?yàn)橐话闱闆r下,一個(gè)項(xiàng)目通常只需要一個(gè)SessionFactory就足夠,當(dāng)需要操作多個(gè)數(shù)據(jù)庫(kù)時(shí),可以為每個(gè)數(shù)據(jù)庫(kù)指定一個(gè)SessionFactory。
(3)Configuration接口。Configuration接口負(fù)責(zé)配置并啟動(dòng)Hibernate和創(chuàng)建SessionFactory對(duì)象。在Hibernate的啟動(dòng)的過(guò)程中,Configuration類(lèi)的實(shí)例首先定位映射文檔位置、讀取配置,然后創(chuàng)建SessionFactory對(duì)象。
(4)Transaction接口。Transaction接口負(fù)責(zé)事務(wù)相關(guān)的操作。它是可選的,開(kāi)發(fā)人員也可以設(shè)計(jì)編寫(xiě)自己的底層事務(wù)處理代碼。
(5)Query和Criteria接口。Query和Criteria接口負(fù)責(zé)執(zhí)行各種數(shù)據(jù)庫(kù)查詢。它可以使用HQL語(yǔ)言或SQL語(yǔ)句兩種表達(dá)方式。
1.3.3 SSH框架結(jié)構(gòu)模型
輕量級(jí)J2EE開(kāi)發(fā)平臺(tái)承襲J2EE基于組件的多層應(yīng)用模型。它在綜合考慮用戶界面、業(yè)務(wù)邏輯、數(shù)據(jù)存儲(chǔ)的功能和邏輯的基礎(chǔ)上,根據(jù)應(yīng)用功能和應(yīng)用邏輯劃分層次,明確責(zé)任,實(shí)現(xiàn)松耦合的組件式架構(gòu)。在技術(shù)層面上,使用Spring規(guī)劃輕量級(jí)J2EE應(yīng)用平臺(tái)時(shí),可以按職責(zé)將應(yīng)用分成四層:域模型層、業(yè)務(wù)層、持久層、表現(xiàn)層。Spring作為業(yè)務(wù)層成為連接其他層之間的樞紐,允許層之間以松耦合的方式向其他層暴露功能而不必依賴特定的技術(shù)。其他的層分別負(fù)責(zé)不同方面的應(yīng)用職責(zé),對(duì)功能進(jìn)行封裝,明確地定義接口在層與層之間通信。SSH框架結(jié)構(gòu)模型如圖1-16所示。

圖1-16 SSH框架結(jié)構(gòu)模型
(1)域模型層。在一個(gè)應(yīng)用中,首先需要使用一組對(duì)象來(lái)表達(dá)現(xiàn)實(shí)世界中的概念。傳統(tǒng)的方法是使用DTO(數(shù)據(jù)傳輸對(duì)象)將數(shù)據(jù)庫(kù)中的數(shù)據(jù)轉(zhuǎn)化為問(wèn)題域中的對(duì)象,在應(yīng)用開(kāi)發(fā)時(shí)需要額外的編碼。引入域模型層,借助一組業(yè)務(wù)對(duì)象,實(shí)現(xiàn)問(wèn)題域和計(jì)算機(jī)域的阻抗匹配,替代系統(tǒng)中數(shù)據(jù)傳輸對(duì)象:用對(duì)象的方式描述現(xiàn)實(shí)世界,真實(shí)地反映現(xiàn)實(shí)世界對(duì)象(如訂單、產(chǎn)品等),可以減少額外的編碼,便于理解,降低代碼管理難度。此外,域模型層的業(yè)務(wù)對(duì)象在各層之間進(jìn)行數(shù)據(jù)傳遞和數(shù)據(jù)轉(zhuǎn)化,作為各層之間數(shù)據(jù)通信的載體,能夠最大化地降低系統(tǒng)間數(shù)據(jù)傳遞的開(kāi)銷(xiāo),而且業(yè)務(wù)對(duì)象代表了現(xiàn)實(shí)世界中的對(duì)象,使得系統(tǒng)在進(jìn)行擴(kuò)充、重構(gòu)時(shí),各子系統(tǒng)間數(shù)據(jù)傳遞部分不會(huì)受到影響。
(2)表現(xiàn)層。表現(xiàn)層是用戶直接和軟件交互的部分。表現(xiàn)層向用戶展現(xiàn)軟件系統(tǒng)的功能,響應(yīng)用戶的請(qǐng)求,并向用戶呈現(xiàn)處理的結(jié)果。因而如果用戶界面不甚高效,那么無(wú)論其他部分多么優(yōu)良,都將于事無(wú)補(bǔ)。成熟的方式是采用MVC(模型—視圖—控制器)模式組織表現(xiàn)層,分離用戶界面代碼(視圖)與應(yīng)用數(shù)據(jù)和業(yè)務(wù)邏輯(模型),然后使用控制器匹配視圖和模型,減少數(shù)據(jù)表現(xiàn)、數(shù)據(jù)描述和應(yīng)用操作的耦合,最終得到響應(yīng)快速、界面美觀的表現(xiàn)層。
(3)持久層。持久層位于應(yīng)用的一端,負(fù)責(zé)將數(shù)據(jù)持久化。數(shù)據(jù)持久層的設(shè)計(jì)目標(biāo)是為整個(gè)項(xiàng)目提供一個(gè)高層、統(tǒng)一、安全、并發(fā)的數(shù)據(jù)持久機(jī)制,將復(fù)雜的業(yè)務(wù)邏輯和數(shù)據(jù)邏輯分離,使系統(tǒng)的緊耦合關(guān)系轉(zhuǎn)化為松耦合關(guān)系,完成對(duì)各種數(shù)據(jù)進(jìn)行持久化的編程工作,并為系統(tǒng)業(yè)務(wù)邏輯層提供服務(wù)。數(shù)據(jù)持久層提供了數(shù)據(jù)訪問(wèn)邏輯,能夠使程序員避免手工編寫(xiě)程序訪問(wèn)數(shù)據(jù)持久層,使其專(zhuān)注于業(yè)務(wù)邏輯的開(kāi)發(fā),并且能夠在不同項(xiàng)目中重用已有實(shí)現(xiàn),簡(jiǎn)化數(shù)據(jù)增、刪、查、改等功能的開(kāi)發(fā)過(guò)程,同時(shí)又不喪失多層結(jié)構(gòu)的天然優(yōu)勢(shì),繼承延續(xù)J2EE特有的可伸縮性和可擴(kuò)展性。
(4)業(yè)務(wù)層。從應(yīng)用分層上來(lái)看,業(yè)務(wù)層位于中間層次。業(yè)務(wù)層又稱為服務(wù)層。合理地構(gòu)建業(yè)務(wù)層,可以降低層次之間的耦合度,增加業(yè)務(wù)的可伸縮性和靈活性。借助Spring的IOC容器,使用配置文件管理其他各個(gè)層次的依賴關(guān)系、裝配業(yè)務(wù)組件,降低層次之間的耦合,實(shí)現(xiàn)插件式編程;借助Spring的AOP實(shí)現(xiàn),集中處理系統(tǒng)中的企業(yè)級(jí)服務(wù),如事務(wù)管理、日志管理等,使代碼更加簡(jiǎn)潔,增強(qiáng)復(fù)用性,提高開(kāi)發(fā)效率。
在應(yīng)用開(kāi)發(fā)中,域模型層將現(xiàn)實(shí)世界對(duì)象抽象為域?qū)ο?,持久層?fù)責(zé)將域?qū)ο蠛蛿?shù)據(jù)庫(kù)對(duì)應(yīng)起來(lái),業(yè)務(wù)層調(diào)用持久層的數(shù)據(jù)邏輯。執(zhí)行應(yīng)用邏輯,處理表現(xiàn)層的請(qǐng)求并以適當(dāng)?shù)姆绞较蛴脩粽故咎幚斫Y(jié)果。
Struts作為前臺(tái)控制框架簡(jiǎn)化了程序的開(kāi)發(fā),使頁(yè)面設(shè)計(jì)人員和Java程序員達(dá)到有效的分離,使項(xiàng)目可擴(kuò)展性大大增強(qiáng),提升了開(kāi)發(fā)效率,降低了維護(hù)成本。
Spring作為一個(gè)應(yīng)用于所有層面的綜合框架,具有強(qiáng)大的應(yīng)用功能及靈活性,非常適合作為一些大規(guī)模軟件項(xiàng)目的底層平臺(tái)。
Hibernate作為后臺(tái)ORM(Object Relation Mapping)持久層框架的輕量級(jí)組件,對(duì)持久層進(jìn)行了輕量級(jí)封裝,降低了程序的復(fù)雜度,易于調(diào)試,減輕了程序員的負(fù)擔(dān),具有很強(qiáng)的擴(kuò)展性。并且API開(kāi)放,可自行對(duì)Hibernate源碼進(jìn)行修改,擴(kuò)展所需的功能。
1.3.4 SSH架構(gòu)輕量級(jí)Web應(yīng)用
SSH架構(gòu)是當(dāng)前非常流行的架構(gòu),很多金融、電信項(xiàng)目和大型門(mén)戶網(wǎng)站均選擇該架構(gòu)作為業(yè)務(wù)支撐的架構(gòu),開(kāi)發(fā)流程已經(jīng)非常成熟。如圖1-17所示,SSH由3個(gè)開(kāi)源的框架組合而成,表現(xiàn)層用Struts,Struts充當(dāng)視圖層和控制層;業(yè)務(wù)層用Spring,Spring通過(guò)控制反轉(zhuǎn)讓控制層間接調(diào)用業(yè)務(wù)邏輯層;持久層用Hibernate,Hibernate充當(dāng)數(shù)據(jù)訪問(wèn)層。每個(gè)層在功能上職責(zé)明確,不應(yīng)該與其他層混合,各層通過(guò)通信接口相互聯(lián)系。

圖1-17 基于Struts、Spring和Hibernate的整合框架
(1)Struts負(fù)責(zé)Web層。
ActionFormBean接收網(wǎng)頁(yè)中表單提交的數(shù)據(jù),然后通過(guò)Action進(jìn)行處理,再Forward到對(duì)應(yīng)的網(wǎng)頁(yè),在struts-config.xml中定義<action-mapping>,ActionServlet會(huì)加載。
(2)Spring負(fù)責(zé)業(yè)務(wù)層管理,即Service(或Manager)。
Service為Action提供統(tǒng)計(jì)的調(diào)用接口,封裝持久層的DAO,并集成了Hibernate,Spring可對(duì)JavaBean和事物進(jìn)行統(tǒng)一管理。
(3)Hibernate負(fù)責(zé)持久化層,完成數(shù)據(jù)庫(kù)的CRUD操作。
Hibernate提供OR/Mapping,它有一組hbm.xml文件和POJO,是與數(shù)據(jù)庫(kù)中的表相對(duì)應(yīng)的,然后定義DAO,這些是與數(shù)據(jù)庫(kù)打交道的類(lèi),它們會(huì)使用PO。
在Struts+Spring+Hibernate的系統(tǒng)中,對(duì)象的調(diào)用流程是:JSP→Action→Service→DAO→Hibernate,數(shù)據(jù)的流向是ActionFormBean接受用戶的數(shù)據(jù),Action將數(shù)據(jù)從ActionFormBean中取出,封裝成VO或PO,再調(diào)用業(yè)務(wù)層的Bean類(lèi),完成多種業(yè)務(wù)處理后再Forward。業(yè)務(wù)層Bean收到這個(gè)PO對(duì)象之后,會(huì)調(diào)用DAO接口方法,進(jìn)行持久化操作。
- GeoServer Cookbook
- ASP.NET Core 5.0開(kāi)發(fā)入門(mén)與實(shí)戰(zhàn)
- 零基礎(chǔ)學(xué)Java程序設(shè)計(jì)
- Python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)
- Learning Three.js:The JavaScript 3D Library for WebGL
- Programming with CodeIgniterMVC
- 深入淺出Go語(yǔ)言編程
- Orleans:構(gòu)建高性能分布式Actor服務(wù)
- 會(huì)當(dāng)凌絕頂:Java開(kāi)發(fā)修行實(shí)錄
- Android嵌入式系統(tǒng)程序開(kāi)發(fā)(基于Cortex-A8)
- Java自然語(yǔ)言處理(原書(shū)第2版)
- 大話程序員:從入門(mén)到優(yōu)秀全攻略
- Linux Networking Cookbook
- Mastering Machine Learning with scikit-learn
- Java程序設(shè)計(jì)(項(xiàng)目教學(xué)版)