前言
作為一個服務端開發感覺一直挺排斥框架這種東西的,總覺得什么實現邏輯都幫你封裝在里面了,你只需要配置這配置那個,出了問題也不知道怎么排查,之前即使寫web程序也寧愿使用jetty這樣的嵌入式的web server實現,自己寫servlet,總感覺從main函數開始都在自己的掌控范圍之內,但是這樣的方式的確有點原始,也看到各種各樣的開源系統使用spring實現web服務,雖然代碼總是能夠看明白,但是還是不曉得一步步是怎么搭建的,于是抽出一個周末折騰折騰,不搞不知道,原來這玩意能把一個不熟悉的用戶搞崩潰,本文主要介紹我是如何搭建一個spring環境的(話說還真的分不清spring和springmvn),雖然在大多數web開發看來這是雕蟲小技。
本文使用的環境是eclipse luna+spring比較新的一個版本(按照我選擇版本的規則是除非有什么新功能新版本才用,否則盡量不使用最新的版本,然后選擇較新的n個版本中使用人數比較多的,例如本文選用的spring版本是4.3.7.release)。
下面就從純工程的角度上解釋如何一步步的搭建這樣的環境的,沒有原理,有原理也是我純屬猜測的,沒有看過源碼。
詳細步驟
第一步:創建一個maven工程
這是再熟悉不過的流程了,但是一般我不推薦選擇archetype,只是創建一個simple project就可以了,前者總是創建失?。▌摻╝rchetype模式的可以讓ide做更多的事情)。其實在何謂maven工程,在我看來就是一個帶有pom.xml的java工程罷了,然后再把代碼的路徑設置為src/main/java類似這樣的結構,所以我們只需要用ide幫我們創建一個帶有pom.xml的工程就可以了,我們自己寫一個dependency和build參數。
配置的時候除了填寫正確的group id 和artifact id,主要把packaging選擇為war,這樣可以在tomcat下運行。
第二步:修改工程配置
這里需要修改的配置有兩個,只需要注意修改之后的樣子就可以了:
1、project facets:雖然不知道這里配置什么的,但是一次次的吃了這個的虧,這里要配置的是java選擇1.6以上(最好1.7吧),然后選擇dynamic web module,下方出現如下的界面:
如果沒出現則可以先勾掉dynamic web module,然后保存,然后再次點進去project facets,選擇dynamic web module,這時候就出現了這樣的界面,注意最好不要選擇3.0,之前遇到過3.0不兼容的問題,jdk1.7 + 2.5版本是可以正常運行的。
點進去“further configuration avaliable…”進行配置,將context directory修改成,并選擇生成web.xml,保存。如下圖:
此時你會看到你的工程結構如下圖,src/main目錄下出現了java/resources/webapp三個目錄。
2、配置deployment assembly,這里配置的source和deploy path,表示在工程部署的時候會將source目錄下的內容拷貝到tomcat部署目錄/deploy path下。這里需要配置的如下圖所示:
例如第一條表示會將工程中src/main/java目錄下的源代碼編譯之后放到部署目錄/web-inf/classes目錄下,最后一條表示會將該工程的maven依賴拷貝到部署目錄/web-inf/lib目錄下。據我觀察發現,其實tomcat目錄運行過程中會將部署部署目錄/web-inf/classes、部署目錄/web-inf/lib加入到classpath中,所以將配置文件和編譯完成的class文件放到classes下,依賴的jar放到lib目錄下都是可以在啟動java程序時找得到的。
第三步:下載spring依賴
spring的jar比較多,最基本的功能也需要如下的幾個dependency:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<properties > <spring.version > 4.3 . 7 .release </spring.version> </properties > <dependencies > <dependency> <groupid> org.springframework</groupid > <artifactid> spring-context</artifactid > <version> ${spring.version}</version > </dependency> <dependency> <groupid> org.springframework</groupid > <artifactid> spring-core</artifactid > <version> ${spring.version}</version > </dependency> <dependency> <groupid> org.springframework</groupid > <artifactid> spring-beans</artifactid > <version> ${spring.version}</version > </dependency> <dependency > <groupid> org.springframework</groupid > <artifactid> spring-web</artifactid > <version> ${spring.version}</version > </dependency> <dependency> <groupid> org.springframework</groupid > <artifactid> spring-webmvc </artifactid> <version> ${spring.version}</version > </dependency> </dependencies > |
spring的不同的依賴使用的版本要保持一致。
第四步:編寫代碼
我們寫一個簡單的controller,這個controller返回一個“hello ${username}”字符串。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package com.fengyu.test; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.bind.annotation.requestparam; import org.springframework.web.bind.annotation.responsebody; import org.springframework.web.bind.annotation.restcontroller; @restcontroller @requestmapping ( "/test" ) public class simplecontroller { @requestmapping (value = "hello" , method = requestmethod.get) @responsebody public string helloworld( @requestparam ( "user" ) string username) { return "hello " + username + " !" ; } } |
第五步:spring配置文件
spring配置文件一般取名叫”applicationcontext.xml”,當然這個不是spring默認的配置名,還是需要在web.xml中指定,這里我們只配置spring的配置文件,其實spring配置中主要是對一些bean的配置,這里我們暫時不需要創建任何bean,就只需要簡單地加一下掃描路徑就可以了。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<beans xmlns= "http://www.springframework.org/schema/beans" xmlns:xsi= "http://www.w3.org/2001/xmlschema-instance" xmlns:context= "http://www.springframework.org/schema/context" xmlns:mvc= "http://www.springframework.org/schema/mvc" xsi:schemalocation="http: //www.springframework.org/schema/beans http: //www.springframework.org/schema/beans/spring-beans.xsd http: //www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http: //www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> < context:annotation-config /> <!-- 自動掃描web包 ,將帶有注解的類 納入spring容器管理 --> <context:component-scan base- package = "com.fengyu.test" ></context:component-scan> </beans> |
這種配置文件一般放在src/main/resources目錄下,前面我們已經配置部署拷貝的設置,他會在部署時被拷貝到web-inf/classes/目錄下,這里只配置了兩項其中context:annotation-config是告訴spring識別注解配置,后面的scan表示要掃描的類的package。
第六步:配置web.xml
web.xml使我們第二步配置時自動生成的,它是tomcat啟動時需要依賴的配置,里面可以配置一些servlet、filter、listener等,對于簡單使用spring而言,一般只配置一個servlet,所有的請求都有這個servlet進行路由處理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?xml version= "1.0" encoding = "utf-8" ?> <web-app xmlns:xsi= "http://www.w3.org/2001/xmlschema-instance" xmlns= "http://java.sun.com/xml/ns/javaee" xsi:schemalocation= "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id= "webapp_id" version = "2.5" > <servlet > <servlet-name> dispatcherservlet</servlet-name > <servlet- class > org.springframework.web.servlet.dispatcherservlet</servlet- class > <init-param> <param-name> contextconfiglocation</param-name > <param-value> classpath:applicationcontext.xml</param-value > </init-param> <load-on-startup> 1 </ load-on-startup> </servlet > <servlet-mapping > <servlet-name> dispatcherservlet</servlet-name > <url-pattern> /</ url-pattern> </servlet-mapping > </web-app> |
可以看到我們只配置了一個dispatcherservlet,它處理所有的url請求,它初始化需要的配置文件會classpath下找applicationcontext.xml,剛才已經介紹,在部署的時候resources下的文件會拷貝到web-inf/classes目錄下并且加入到java啟動的classpath下。
第七步:部署tomcat
首先需要下載一個tomcat,tomcat 7.x是一個不錯的選擇,由于tomcat是綠色的(大多數java實現的都是綠色的),可以直接解壓,然后在eclipse中配置。在eclipse中window->server->runtime environment中add一個tomcat實例,注意需要選擇jdk,需要選擇當前jdk支持的版本。
然后再下方任務欄里面找到servers,如果沒有可以再window->show view中選擇servers添加,添加了之后可以在這里create a new server。選擇剛剛創建的tomcat實例,然后從avaliable的resources中選擇一個加入到右邊configured中(avaliable是根據工程中是否有web.xml生成的)。
第八步:配置tomcat
雙擊新創建的tomcat server,進入overview頁面,這個頁面可以配置這個工程運行tomcat實例,主要配置包括端口號,部署目錄等等,如果端口或文件不沖突的話盡量不要修改,需要修改的一處是server options中勾選上“publish module contexts to separate xml files”,雖然不知道這個是做什么的,但是血和淚的教訓告訴我要選上這個,直接保存。
第九步:啟動tomcat
這里可能有人要問了,為什么eclipse上沒有配置tomcat的插件啊,我到哪里去啟動tomcat!難道沒有那個貓頭就不行了嗎?說實話,配置那個貓頭經常遇到網絡問題失敗,于是不再嘗試了,而直接通過右擊第七步創建的tomcat實例就可以完成貓頭所能完成的所有功能,為什么還配置那個插件呢?右鍵start,然后祈禱啟動的時候不要出現什么錯誤,出現錯誤就google一下吧,基本上spring的問題都有人踩過坑的。
第十步:測試
啟動完成之后,一般不會出現什么錯誤,打開瀏覽器輸入http://localhost:8080/springtest/test/hello?user=world,此時就可以看到如下的輸出:
出現了我們想要的結果,此時的心情只能用愉悅來形容,但是我們指定了需要攜帶user參數,如果url中不帶參數則出現如下的錯誤:
如果不希望出現這樣的情況可以再helloworld這個參數的@requestparam修改為@requestparam(value=”user”,required=false, defaultvalue=”world”),當然這只是一個非常小的example說明注解的強大,spring還提供了豐富的注解來實現不同的需求,簡直就是用配置和注解來編程。
第十一步:復雜數據結構
上面的測試都是返回一個string,但是我們一般開發的時候會涉及到復雜的數據結構,大家一般都會用json來作為通信的序列化工具,那么怎么在spring中支持json呢?在測試這個之前,先看一下現在對于復雜數據結構(例如map)怎么返回的。
我們在controller中添加一個函數:
1
2
3
4
5
6
7
|
@requestmapping (value = "hellomap" , method = requestmethod.get) @responsebody public map<string, string> hellomap( @requestparam (value= "user" ,required= false , defaultvalue= "world" ) string username) { map<string, string> ret = new hashmap<string, string>(); ret.put( "hello" , username ); return ret ; } |
然后再瀏覽器中測試一下,出現如下的錯誤” the resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request “accept” headers.”,這個感覺是因為accept默認只接受text格式,而這個接口的返回值沒有返回text對象。
如果要支持json,其實只需要在spring中配置一下message-converters就可以了,每一個json庫都提供這樣的converter的,我們這里以fastjson作為示例吧,首先需要在pom.xml添加fastjson的依賴。然后在applicationcontext.xml中添加如下配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<mvc:annotation-driven> <mvc:message-converters register-defaults= "false" > <bean class = "com.alibaba.fastjson.support.spring.fastjsonhttpmessageconverter" > <property name= "supportedmediatypes" > <list> <value> text/html; charset=utf- 8 </value > <value> application/json; charset=utf- 8 </value > </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> |
這時候再重試剛才的url發現可以返回map轉換成json的樣子了。
第十一步:折騰
好了,上面的示例已經足夠完成一個比較簡單的web服務了,當然我們還沒有前端,只不過是通常作為服務端提供的http服務罷了,不過有了spring我們可以省去大量的代碼,當然通過http+json提供服務端接口比thrift等rpc框架要中一些,效率或許要低一些,但是它的優勢是比較簡單啊,調試比較方便啊。。。感覺大量的前端和服務端通信大都使用這樣的方式。
總結
學會了spring框架的搭建,媽媽再也不用擔心我寫web接口了,當然spring還能夠適配各種各樣的組件,例如通常使用的mybatis連接數據庫,jedis連接redis等;還有豐富的功能讓你盡量通過配置和注解降低不必要的代碼。最近比較好的spring boot貌似也是web開發神器。這個以后有時間再折騰。
當然本文只是記錄了血淚歷程,spring小白是如何一步步的搭建spring開發環境的,大神輕噴。。
本文代碼可以在 https://github.com/terry-chelsea/spring-demo.git 找到
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/yu616568/article/details/70739976