手把手教你 基礎(chǔ) 整合最優(yōu)雅SSM框架:SpringMVC + Spring

我們看招聘信息的時(shí)候,經(jīng)常會(huì)看到這一點(diǎn),需要具備SSH框架的技能;而且在大部分教學(xué)課堂中,也會(huì)把SSH作為最核心的教學(xué)內(nèi)容。 但是,我們?cè)趯?shí)際應(yīng)用中發(fā)現(xiàn),SpringMVC可以完全替代Struts,配合注解的方式,編程非常快捷,而且通過restful風(fēng)格定義url,讓地址看起來非常優(yōu)雅。 另外,MyBatis也可以替換Hibernate,正因?yàn)镸yBatis的半自動(dòng)特點(diǎn),我們程序猿可以完全掌控SQL,這會(huì)讓有數(shù)據(jù)庫(kù)經(jīng)驗(yàn)的程序猿能開發(fā)出高效率的SQL語(yǔ)句,而且XML配置管理起來也非常方便。 好了,如果你也認(rèn)同我的看法,那么下面我們一起來做整合吧!

請(qǐng)點(diǎn)擊此處輸入圖片描述

在寫代碼之前我們先了解一下這三個(gè)框架分別是干什么的? 相信大以前也看過不少這些概念,我這就用大白話來講,如果之前有了解過可以跳過這一大段,直接看代碼!

SpringMVC:它用于web層,相當(dāng)于controller(等價(jià)于傳統(tǒng)的servlet和struts的action),用來處理用戶請(qǐng)求。舉個(gè)例子,用戶在地址欄輸入http://網(wǎng)站域名/login,那么springmvc就會(huì)攔截到這個(gè)請(qǐng)求,并且調(diào)用controller層中相應(yīng)的方法,(中間可能包含驗(yàn)證用戶名和密碼的業(yè)務(wù)邏輯,以及查詢數(shù)據(jù)庫(kù)操作,但這些都不是springmvc的職責(zé)),最終把結(jié)果返回給用戶,并且返回相應(yīng)的頁(yè)面(當(dāng)然也可以只返回json/xml等格式數(shù)據(jù))。springmvc就是做前面和后面過程的活,與用戶打交道!!

Spring:太強(qiáng)大了,以至于我無法用一個(gè)詞或一句話來概括它。但與我們平時(shí)開發(fā)接觸最多的估計(jì)就是IOC容器,它可以裝載bean(也就是我們java中的類,當(dāng)然也包括service dao里面的),有了這個(gè)機(jī)制,我們就不用在每次使用這個(gè)類的時(shí)候?yàn)樗跏蓟苌倏吹疥P(guān)鍵字new。另外spring的aop,事務(wù)管理等等都是我們經(jīng)常用到的。

MyBatis:如果你問我它跟鼎鼎大名的Hibernate有什么區(qū)別?我只想說,他更符合我的需求。第一,它能自由控制sql,這會(huì)讓有數(shù)據(jù)庫(kù)經(jīng)驗(yàn)的人(當(dāng)然不是說我啦捂臉)編寫的代碼能搞提升數(shù)據(jù)庫(kù)訪問的效率。第二,它可以使用xml的方式來組織管理我們的sql,因?yàn)橐话愠绦虺鲥e(cuò)很多情況下是sql出錯(cuò),別人接手代碼后能快速找到出錯(cuò)地方,甚至可以優(yōu)化原來寫的sql。

請(qǐng)容小編發(fā)條小東西哈,不要介意!

獲取源碼,項(xiàng)目講解,知識(shí)點(diǎn)分享,學(xué)習(xí)交流,那就加入小編的Java學(xué)習(xí)交流群吧!

616 959 444

SSM框架整合配置

好了,前面bb那么多,下面我們真正開始敲代碼了~

首先我們打開IED,我這里用的是eclipse(你們應(yīng)該也是用的這個(gè),對(duì)嗎?),創(chuàng)建一個(gè)動(dòng)態(tài)web項(xiàng)目,建立好相應(yīng)的目錄結(jié)構(gòu)(重點(diǎn)!)

請(qǐng)點(diǎn)擊此處輸入圖片描述

(打了馬賽克是因?yàn)檫@里還用不到,你們不要那么污好不好?)

我說一下每個(gè)目錄都有什么用吧(第一次畫表格,我發(fā)現(xiàn)markdown的表格語(yǔ)法很不友好呀~) 這個(gè)目錄結(jié)構(gòu)同時(shí)也遵循maven的目錄規(guī)范~

文件名作用

src根目錄,沒什么好說的,下面有main和test。

main主要目錄,可以放java代碼和一些資源文件。

java存放我們的java代碼,這個(gè)文件夾要使用Build Path -> Use as Source Folder,這樣看包結(jié)構(gòu)會(huì)方便很多,新建的包就相當(dāng)于在這里新建文件夾咯。

resources存放資源文件,譬如各種的spring,mybatis,log配置文件。

mapper存放dao中每個(gè)方法對(duì)應(yīng)的sql,在這里配置,無需寫daoImpl。

spring這里當(dāng)然是存放spring相關(guān)的配置文件,有dao service web三層。

sql其實(shí)這個(gè)可以沒有,但是為了項(xiàng)目完整性還是加上吧。

webapp這個(gè)貌似是最熟悉的目錄了,用來存放我們前端的靜態(tài)資源,如jsp js css。

resources這里的資源是指項(xiàng)目的靜態(tài)資源,如js css images等。

WEB-INF很重要的一個(gè)目錄,外部瀏覽器無法訪問,只有羨慕內(nèi)部才能訪問,可以把jsp放在這里,另外就是web.xml了。你可能有疑問了,為什么上面java中的resources里面的配置文件不妨在這里,那么是不是會(huì)被外部竊取到?你想太多了,部署時(shí)候基本上只有webapp里的會(huì)直接輸出到根目錄,其他都會(huì)放入WEB-INF里面,項(xiàng)目?jī)?nèi)部依然可以使用classpath:XXX來訪問,好像IDE里可以設(shè)置部署輸出目錄,這里扯遠(yuǎn)了~

test這里是測(cè)試分支。

java測(cè)試java代碼,應(yīng)遵循包名相同的原則,這個(gè)文件夾同樣要使用Build Path -> Use as Source Folder,這樣看包結(jié)構(gòu)會(huì)方便很多。

resources沒什么好說的,好像也很少用到,但這個(gè)是maven的規(guī)范。

我先新建好幾個(gè)必要的包,并為大家講解一下每個(gè)包的作用,順便理清一下后臺(tái)的思路~

請(qǐng)點(diǎn)擊此處輸入圖片描述

包名名稱作用

dao數(shù)據(jù)訪問層(接口)與數(shù)據(jù)打交道,可以是數(shù)據(jù)庫(kù)操作,也可以是文件讀寫操作,甚至是redis緩存操作,總之與數(shù)據(jù)操作有關(guān)的都放在這里,也有人叫做dal或者數(shù)據(jù)持久層都差不多意思。為什么沒有daoImpl,因?yàn)槲覀冇玫氖莔ybatis,所以可以直接在配置文件中實(shí)現(xiàn)接口的每個(gè)方法。

entity實(shí)體類一般與數(shù)據(jù)庫(kù)的表相對(duì)應(yīng),封裝dao層取出來的數(shù)據(jù)為一個(gè)對(duì)象,也就是我們常說的pojo,一般只在dao層與service層之間傳輸。

dto數(shù)據(jù)傳輸層剛學(xué)框架的人可能不明白這個(gè)有什么用,其實(shí)就是用于service層與web層之間傳輸,為什么不直接用entity(pojo)?其實(shí)在實(shí)際開發(fā)中發(fā)現(xiàn),很多時(shí)間一個(gè)entity并不能滿足我們的業(yè)務(wù)需求,可能呈現(xiàn)給用戶的信息十分之多,這時(shí)候就有了dto,也相當(dāng)于vo,記住一定不要把這個(gè)混雜在entity里面,答應(yīng)我好嗎?

service業(yè)務(wù)邏輯(接口)寫我們的業(yè)務(wù)邏輯,也有人叫bll,在設(shè)計(jì)業(yè)務(wù)接口時(shí)候應(yīng)該站在“使用者”的角度。額,不要問我為什么這里沒顯示!IDE調(diào)皮我也拿它沒辦法~

serviceImpl業(yè)務(wù)邏輯(實(shí)現(xiàn))實(shí)現(xiàn)我們業(yè)務(wù)接口,一般事務(wù)控制是寫在這里,沒什么好說的。

web控制器springmvc就是在這里發(fā)揮作用的,一般人叫做controller控制器,相當(dāng)于struts中的action。

還有最后一步基礎(chǔ)工作,導(dǎo)入我們相應(yīng)的jar包,我使用的是maven來管理我們的jar,所以只需要在

pom.xml

中加入相應(yīng)的依賴就好了,如果不使用maven的可以自己去官網(wǎng)下載相應(yīng)的jar,放到項(xiàng)目WEB-INF/lib目錄下。關(guān)于maven的學(xué)習(xí)大家可以看慕課網(wǎng)的視頻教程,這里就不展開了。我把項(xiàng)目用到的jar都寫在下面,版本都不是最新的,大家有經(jīng)驗(yàn)的話可以自己調(diào)整版本號(hào)。另外,所有jar都會(huì)與項(xiàng)目一起打包放到我的github上,喜歡的給個(gè)star吧~

pom.xml

請(qǐng)點(diǎn)擊此處輸入圖片描述

下面真的要開始進(jìn)行編碼工作了,堅(jiān)持到這里辛苦大家了~

第一步:我們先在spring文件夾里新建

spring-dao.xml文件,因?yàn)閟pring的配置太多,我們這里分三層,分別是dao service web。

讀入數(shù)據(jù)庫(kù)連接相關(guān)參數(shù)(可選)

配置數(shù)據(jù)連接池

配置連接屬性,可以不讀配置項(xiàng)文件直接在這里寫死

配置c3p0,只配了幾個(gè)常用的

配置SqlSessionFactory對(duì)象(mybatis)

掃描dao層接口,動(dòng)態(tài)實(shí)現(xiàn)dao接口,也就是說不需要daoImpl,sql和參數(shù)都寫在xml文件上

spring-dao.xm

請(qǐng)點(diǎn)擊此處輸入圖片描述

因?yàn)閿?shù)據(jù)庫(kù)配置相關(guān)參數(shù)是讀取配置文件,所以在resources文件夾里新建一個(gè)

jdbc.properties文件,存放我們4個(gè)最常見的數(shù)據(jù)庫(kù)連接屬性,這是我本地的,大家記得修改呀~還有喜歡傳到github上“大頭蝦們”記得刪掉密碼,不然別人就很容易得到你服務(wù)器的數(shù)據(jù)庫(kù)配置信息,然后干一些羞羞的事情,你懂的!!

jdbc.properties

請(qǐng)點(diǎn)擊此處輸入圖片描述

友情提示:

配置文件中的jdbc.username,如果寫成username,可能會(huì)與系統(tǒng)環(huán)境中的username變量沖突,所以到時(shí)候真正連接數(shù)據(jù)庫(kù)的時(shí)候,用戶名就被替換成系統(tǒng)中的用戶名(有得可能是administrator),那肯定是連接不成功的,這里有個(gè)小坑,我被坑了一晚上!!

因?yàn)檫@里用到了mybatis,所以需要配置mybatis核心文件,在recources文件夾里新建mybatis-config.xml文件。

使用自增主鍵

使用列別名

開啟駝峰命名轉(zhuǎn)換 create_time -> createTime

mybatis-config.xml

請(qǐng)點(diǎn)擊此處輸入圖片描述

第二步:剛弄好dao層,接下來到service層了。在

spring

文件夾里新建

spring-service.xml

文件。

掃描service包所有注解 @Service

配置事務(wù)管理器,把事務(wù)管理交由spring來完成

配置基于注解的聲明式事務(wù),可以直接在方法上@Transaction

spring-service.xml

獲取源碼,項(xiàng)目講解,知識(shí)點(diǎn)分享,學(xué)習(xí)交流,那就加入小編的Java學(xué)習(xí)交流群吧!

616 959 444

第三步:配置web層,在spring文件夾里新建spring-web.xml文件。

開啟SpringMVC注解模式,可以使用@RequestMapping,@PathVariable,@ResponseBody等

對(duì)靜態(tài)資源處理,如js,css,jpg等

配置jsp 顯示ViewResolver,例如在controller中某個(gè)方法返回一個(gè)string類型的"login",實(shí)際上會(huì)返回"/WEB-INF/login.jsp"

掃描web層 @Controller

spring-web.xml

第四步:最后就是修改web.xml文件了,它在webapp的WEB-INF下。

web.xml

請(qǐng)點(diǎn)擊此處輸入圖片描述

我們?cè)陧?xiàng)目中經(jīng)常會(huì)使用到日志,所以這里還有配置日志xml,在resources文件夾里新建logback.xml文件,所給出的日志輸出格式也是最基本的控制臺(tái)s呼出。

logback.xml

請(qǐng)點(diǎn)擊此處輸入圖片描述

到目前為止,我們一共寫了7個(gè)配置文件,我們一起來看下最終的配置文件結(jié)構(gòu)圖。

請(qǐng)點(diǎn)擊此處輸入圖片描述

好了,今天就寫到這里了!內(nèi)容是有點(diǎn)長(zhǎng)哈,不過感興趣想學(xué)的小伙伴還請(qǐng)堅(jiān)持觀看呀!

接下來會(huì)跟大家講這種框架的應(yīng)用實(shí)例哦!想知道我會(huì)用什么來實(shí)例嗎?

獲取本篇完整版內(nèi)容,學(xué)習(xí)交流,那就加入小編的Java學(xué)習(xí)交流群吧!

616 959 444

欲知后續(xù)如何,請(qǐng)聽下回分解!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容