之前寫(xiě)了關(guān)于Maven入門(mén)介紹與Spring入門(mén)介紹兩篇文章,本篇文章主要介紹使用IntelliJ IDEA搭建一個(gè)maven+web+spring的項(xiàng)目,在搭建的過(guò)程中會(huì)用到前面兩篇文章中相關(guān)的知識(shí)點(diǎn),如有不熟悉的,可以先看下前面兩篇文章。
Maven+Web+Spring項(xiàng)目搭建
步驟1:
注意不要選中紅線標(biāo)注的地方,因?yàn)閍rchetype是模板、原型的意思,所以Create from archetype就是根據(jù)選中的模板快速創(chuàng)建出一個(gè)對(duì)應(yīng)的項(xiàng)目,比如你選中下面webapp模板,就能快速創(chuàng)建出一個(gè)webapp項(xiàng)目。但是它最大的缺點(diǎn)就是創(chuàng)建速度太慢了。
填寫(xiě)工程的GroupId、ArtifactId,GroupId、ArtifactId有什么作用?我在Maven入門(mén)介紹中已經(jīng)介紹了。
步驟3:
選擇項(xiàng)目存放的位置。
步驟4:
特別注意下用紅色圓圈標(biāo)注的地方,可以看出文件夾的顏色發(fā)生了變化,在resources文件夾多了一個(gè)小標(biāo)志。為什么這些文件夾的顏色會(huì)發(fā)生變化呢?這是因?yàn)镸aven遵循約定優(yōu)于配置,約定了這些文件夾分別存放不同的東西。如果沒(méi)有發(fā)生變化,則需要自己手動(dòng)來(lái)配置,點(diǎn)擊紅色圓圈標(biāo)注的位置,打開(kāi)項(xiàng)目的工程設(shè)置,如圖:
打開(kāi)項(xiàng)目的工程設(shè)置后如下圖所示:
比如你選中src/main/java目錄,然后在點(diǎn)擊Sources就配置成功了,其他的也是同樣的方法,記得最后要點(diǎn)擊OK按鈕,這樣設(shè)置才會(huì)生效的。關(guān)于Maven具體都約定了哪些目錄存放哪些東西,可以看下我之前關(guān)于Maven入門(mén)介紹的文章。
步驟5:
Project(工程): A標(biāo)注的地方,選擇該項(xiàng)目組件使用的SDK,比如使用的是jdk1.8版本。B標(biāo)注的地方,選擇該項(xiàng)目組件支持到j(luò)dk哪個(gè)版本,比如使用的jdk1.8版本,但是在這里可以選擇最低支持到j(luò)dk1.7版本。
步驟6:
Modules(組件): 從圖中可以看到此項(xiàng)目沒(méi)有任何服務(wù)組件,因?yàn)槲覀兪鞘謩?dòng)創(chuàng)建Maven,沒(méi)有選擇任何Maven模板,這個(gè)在前面說(shuō)過(guò)沒(méi)有選的原因,因此需要我們進(jìn)行添加,在這里可以添加我們想要的服務(wù)組件,比如web組件、spring組件等,如下圖所示:
步驟7:
選擇添加web組件,添加之后,選中添加的web組件,如下圖所示:
可以看到我們要對(duì)web組件配置三個(gè)地方,在介紹具體的配置前,我們有必要先了解一下Java Web應(yīng)用程序的規(guī)范目錄結(jié)構(gòu),如下圖表所示:
目錄 | 描述 |
---|---|
/webapp | Web應(yīng)用的根目錄,所有的JSP和HTML文件都存放在此目錄下 |
/webapp/WEB-INF | 存放web應(yīng)用的發(fā)布描述文件web.xml |
/webapp/WEB-INF/classes | 存放各種class文件,Servlet類文件也放于此目錄下 |
/webapp/WEB-INF/lib | 存放web應(yīng)用所需要的各種jar文件 |
WEB-INF目錄是一個(gè)專用區(qū)域,當(dāng)前的web應(yīng)用不能把此目錄中的內(nèi)容提供給用戶,這個(gè)目錄下的文件只供當(dāng)前的web應(yīng)用使用,里面包含不應(yīng)該由客戶端直接下載的資源。簡(jiǎn)單來(lái)說(shuō)就是我們可以看到一個(gè)web應(yīng)用程序中的jsp、html文件,但里面的jar包、classes文件是看不到的。在項(xiàng)目開(kāi)發(fā)的過(guò)程中,盡量按照web應(yīng)用程序的規(guī)范目錄結(jié)構(gòu)來(lái)存儲(chǔ)相應(yīng)的文件,這樣會(huì)帶給我們?cè)S多好處,比如項(xiàng)目存放位置比較統(tǒng)一,通用性會(huì)比較好。在Maven項(xiàng)目中,如果想依賴某個(gè)jar包,只需要在pom.xml中添加下配置即可,那么這就會(huì)有個(gè)疑問(wèn)了?我們依賴的jar包并沒(méi)有存放在/WEB-INF/lib文件夾下面,這和我們上面所說(shuō)的不符。對(duì)于這個(gè)問(wèn)題,我們做個(gè)簡(jiǎn)單的驗(yàn)證,在pom.xml中配置對(duì)slf4j jar包的依賴,同時(shí)在WEB-INF/lib下面添加json-simple-1.1.1.jar包,如下圖所示:
現(xiàn)在我們點(diǎn)擊C標(biāo)注的地方,開(kāi)始打出來(lái)一個(gè)war包出來(lái),存放的位置如下圖所示:
接下來(lái)我們把打好的war包,放在本地Tomcat webapps目錄下面,并啟動(dòng)tomcat,啟動(dòng)tomcat后,會(huì)自動(dòng)解析maven-springmvc.war包的,如下圖所示:
從圖中可以看出,通過(guò)maven依賴的jar包在打包的時(shí)候被放在了WEB-INF/lib目錄下面,跟前面說(shuō)的規(guī)范目錄結(jié)構(gòu)相吻合。不過(guò)在實(shí)際項(xiàng)目開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)在打包的時(shí)候把lib下面的包給排除掉,lib下面的包由公司的運(yùn)維人員去手動(dòng)添加。現(xiàn)在我們對(duì)web應(yīng)用程序有了一個(gè)大概的了解,來(lái)繼續(xù)看下步驟7需要配置的三個(gè)地方,先看下B標(biāo)注的地方(Web Resources Directory)web資源目錄,就是web應(yīng)用的根目錄,點(diǎn)擊進(jìn)行編輯,更改其路徑為/src/main/webapp即可。A標(biāo)注的地方(Web Module Deployment Descriptor)是web應(yīng)用的發(fā)布描述文件,也就是要配置web.xml的位置,這個(gè)前面也有講解到,需要更改路徑配置到src/main/webapp/WEB-INF/web.xml路徑下面。A、B配置好后如下圖所示:
在配置web.xml存放位置的時(shí)候,需要注意一點(diǎn),如下圖所示:
在選擇描述版本的時(shí)候,如果你是基于Tomcat8.0的話,選擇3.1版本,如果是基于Tomcat7.0的話,選擇3.0版本,這個(gè)一定要注意,別選錯(cuò)了。
最后看下C標(biāo)注的地方,Web Facet resources are not included in an artifact,其中Facets表示當(dāng)前項(xiàng)目適配的服務(wù)組件,Artifacts描述了當(dāng)前項(xiàng)目發(fā)布的信息,C標(biāo)注翻譯過(guò)來(lái)就是說(shuō)當(dāng)前項(xiàng)目發(fā)布信息中沒(méi)有包含web服務(wù)組件的發(fā)布信息,可以點(diǎn)擊標(biāo)注右邊的Create Artifact創(chuàng)建一個(gè)web服務(wù)組件的發(fā)布信息,然后就可以在Artifacts里面看到web服務(wù)組件的發(fā)布信息了。
步驟8:
在Facets一欄中,我們可以看到當(dāng)前項(xiàng)目適配的服務(wù)組件是web組件,如果在Modules也添加了Spring服務(wù)組件,在這里也可以看到適配的服務(wù)組件既有web組件,也有spring組件了。
步驟9:
如果在步驟7點(diǎn)擊了Create Artifact,在這里就可以看到web項(xiàng)目的發(fā)布信息,特別要注意紅色標(biāo)注的地方一定要是war包,否則運(yùn)行的時(shí)候會(huì)報(bào)錯(cuò)的。如果不是war包的話,可以先給移除掉,手動(dòng)來(lái)重新添加,如下圖所示:
到這里為止,一個(gè)maven+web的項(xiàng)目已經(jīng)創(chuàng)建好了,點(diǎn)擊確定按鈕之后當(dāng)前項(xiàng)目的目錄結(jié)構(gòu)如下圖所示:
如果項(xiàng)目中有需要添加自己的jar包,而不是通過(guò)maven依賴于某個(gè)jar包,可以在WEB-INF/lib下面添加自己的jar包,這個(gè)在前面有講到過(guò)的,如下圖所示:
步驟10:
點(diǎn)擊Edit COnfiguartions開(kāi)始配置tomcat,如下圖所示:
選擇Local之后的頁(yè)面如下圖所示:
在這個(gè)頁(yè)面出現(xiàn)了一個(gè)警告,Warning: No artifacts marked for deployment,就是說(shuō)當(dāng)前web項(xiàng)目沒(méi)有部署到Tomcat服務(wù)器中,那我們來(lái)進(jìn)行部署一下,如下圖所示:
選擇Artifacts之后頁(yè)面如下圖所示:
這樣就把web項(xiàng)目部署到Tomact服務(wù)器上了,在回到Server選項(xiàng)上,如下圖所示:
注意紅色標(biāo)注的地方建議都選擇Update classes and resources,這樣在你更改了一個(gè)類的話,不需要重新啟動(dòng)Tomcat服務(wù)器就可以生效了,因?yàn)镴ava本身是不支持熱部署的,如果想支持熱部署的話,需要配置一個(gè)相應(yīng)插件的,具體大家可以搜下怎么做,這里不做詳細(xì)說(shuō)明。
步驟11:
如果此時(shí)我們創(chuàng)建一個(gè)java類,繼承自HttpServlet,會(huì)發(fā)現(xiàn)報(bào)錯(cuò)的,為什么報(bào)錯(cuò)呢?是因?yàn)槲覀冎皇前旬?dāng)前的項(xiàng)目部署到tomcat服務(wù)器上,但是當(dāng)前的項(xiàng)目并沒(méi)有依賴于tomcat,而tomcat中包含了servlet-api.jar包,所有就會(huì)報(bào)錯(cuò)了。我們?cè)陧?xiàng)目中添加對(duì)Tomcat的依賴,如下圖所示:
點(diǎn)擊Library后頁(yè)面如下圖所示:
注意紅色標(biāo)注的地方為Provided,它代表的含義是表示整個(gè)應(yīng)用生命周期都會(huì)一直存在的。到現(xiàn)在整個(gè)web服務(wù)組件就全部配置好了,接下來(lái)看下Spring服務(wù)組件的配置了。
步驟12:
跟添加web服務(wù)組件一樣,在Modules添加Spring服務(wù)組件,如下圖所示:
添加spring服務(wù)組件之后頁(yè)面如下所示:
在紅色標(biāo)注的地方會(huì)看到一個(gè)警告,就是說(shuō)spring服務(wù)組件缺少依賴的jar包。添加一個(gè)spring服務(wù)組件,總共需要三步配置:1、添加依賴jar包;2、配置dispatcherServlet;3、啟動(dòng)注解、配置靜態(tài)資源訪問(wèn)等。我們先看添加依賴的jar包,如下圖所示:
添加依賴的jar包,每個(gè)jar包的作用以及添加日志jar包需要注意的事項(xiàng),都在我之前寫(xiě)的Spring入門(mén)介紹有介紹到,這里就不詳細(xì)說(shuō)明了。接下來(lái)看如何配置dispatcherServlet,如下圖所示:
每行配置的具體作用,可以看我之前寫(xiě)的Spring入門(mén)介紹,這里就不詳細(xì)說(shuō)明了。最后看下啟動(dòng)注解、配置靜態(tài)資源訪問(wèn),如下圖所示:
這些都配置完成后,我們打開(kāi)工程設(shè)置頁(yè)面,如下所示:
這個(gè)時(shí)候在看紅色標(biāo)注的地方,就會(huì)看到applicationContext-springmvc.xml,說(shuō)明dispatcherServlet配置成功了。
步驟13:
下面我們寫(xiě)個(gè)簡(jiǎn)單的demo,來(lái)驗(yàn)證下我們搭建的項(xiàng)目maven+web服務(wù)組件+spring服務(wù)組件是否正確,如下圖所示:
然后啟動(dòng)tomcat,如果看到下面的日志信息,說(shuō)明spring服務(wù)組件啟動(dòng)了,如下圖所示:
tomcat啟動(dòng)后,首先會(huì)報(bào)404錯(cuò)誤的,然后在localhost:8083后面,輸入hello,就可以看到welcome.jsp頁(yè)面的信息了,如下圖所示:
通過(guò)這樣一個(gè)簡(jiǎn)單的demo就驗(yàn)證了我們搭建的項(xiàng)目是沒(méi)有問(wèn)題的。
總結(jié)
在Maven入門(mén)介紹、Web應(yīng)用程序目錄規(guī)范介紹中,都提到了一個(gè)詞約定優(yōu)于配置,那什么是約定優(yōu)于配置呢?約定優(yōu)于配置帶給我們有哪些好處呢?
約定優(yōu)于配置,是一種軟件設(shè)計(jì)范式,旨在減少軟件開(kāi)發(fā)人員需要做決定的數(shù)量,獲得簡(jiǎn)單的好處,而又不失靈活性。簡(jiǎn)單來(lái)說(shuō),開(kāi)發(fā)人員僅需規(guī)定應(yīng)用中不符合約定的部分。比如,如果模型中有一個(gè)名為Sale類,那么數(shù)據(jù)庫(kù)中對(duì)應(yīng)的表名就為sales。只有在偏離這一約定時(shí),例如將該表名命名為products_sold,才需要寫(xiě)有關(guān)這個(gè)名字的配置。再比如Maven項(xiàng)目約定了源代碼的存放位置,所以只需配置很少的信息就可以自動(dòng)完成編譯、測(cè)試和打包等工作。再比如iOS開(kāi)發(fā)中,聲明一個(gè)屬性,系統(tǒng)會(huì)自動(dòng)給你添加getter與setter方法,這其實(shí)也是一種約定。可見(jiàn)約定優(yōu)于配置在很多語(yǔ)言、框架設(shè)計(jì)的時(shí)候都被采用到了。
參考文章
http://www.cnblogs.com/wql025/p/5215570.html
http://www.splaybow.com/post/tomcatfolder09311611122007.html
https://zh.wikipedia.org/wiki/%E7%BA%A6%E5%AE%9A%E4%BC%98%E4%BA%8E%E9%85%8D%E7%BD%AE