JAVA開發血淚之路:一步步搭建spring框架

前言html

做爲一個服務端開發感受一直挺排斥框架這種東西的,總以爲什麼實現邏輯都幫你封裝在裏面了,你只須要配置這配置那個,出了問題也不知道怎麼排查,以前即便寫web程序也寧願使用jetty這樣的嵌入式的web server實現,本身寫servlet,總感受從main函數開始都在本身的掌控範圍以內,可是這樣的方式的確有點原始,也看到各類各樣的開源系統使用spring實現web服務,雖然代碼老是可以看明白,可是仍是不曉得一步步是怎麼搭建的,因而抽出一個週末折騰折騰,不搞不知道,原來這玩意能把一個不熟悉的用戶搞崩潰,本文主要介紹我是如何搭建一個spring環境的(話說還真的分不清spring和springmvn),雖然在大多數web開發看來這是雕蟲小技。前端

本文使用的環境是eclipse luna+spring比較新的一個版本(按照我選擇版本的規則是除非有什麼新功能新版本才用,不然儘可能不使用最新的版本,而後選擇較新的N個版本中使用人數比較多的,例如本文選用的spring版本是4.3.7.RELEASE)。java

下面就從純工程的角度上解釋如何一步步的搭建這樣的環境的,沒有原理,有原理也是我純屬猜想的,沒有看過源碼。web

詳細步驟面試

第一步:建立一個maven工程redis

這是再熟悉不過的流程了,可是通常我不推薦選擇Archetype,只是建立一個simple project就能夠了,前者老是建立失敗(建立Archetype模式的可讓IDE作更多的事情)。其實在何謂maven工程,在我看來就是一個帶有pom.xml的java工程罷了,而後再把代碼的路徑設置爲src/main/java相似這樣的結構,因此咱們只須要用IDE幫咱們建立一個帶有pom.xml的工程就能夠了,咱們本身寫一個dependency和build參數。spring

配置的時候除了填寫正確的group id 和artifact id,主要把packaging選擇爲war,這樣能夠在tomcat下運行。數據庫

第二步:修改工程配置編程

這裏須要修改的配置有兩個,只須要注意修改以後的樣子就能夠了:json

  • 一、Project Facets:雖然不知道這裏配置什麼的,可是一次次的吃了這個的虧,這裏要配置的是Java選擇1.6以上(最好1.7吧),而後選擇Dynamic Web Module,下方出現以下的界面:

JAVA開發血淚之路:一步步搭建spring框架

 

若是沒出現則能夠先勾掉Dynamic Web Module,而後保存,而後再次點進去Project Facets,選擇Dynamic Web Module,這時候就出現了這樣的界面,注意最好不要選擇3.0,以前遇到過3.0不兼容的問題,jdk1.7 + 2.5版本是能夠正常運行的。

點進去「Further configuration avaliable…」進行配置,將Context directory修改爲,並選擇生成web.xml,保存。以下圖:

JAVA開發血淚之路:一步步搭建spring框架

 

此時你會看到你的工程結構以下圖,src/main目錄下出現了java/resources/webapp三個目錄。

JAVA開發血淚之路:一步步搭建spring框架

 

  • 二、配置Deployment Assembly,這裏配置的Source和Deploy Path,表示在工程部署的時候會將source目錄下的內容拷貝到tomcat部署目錄/Deploy Path下。這裏須要配置的以下圖所示:

JAVA開發血淚之路:一步步搭建spring框架

 

例如第一條表示會將工程中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:

JAVA開發血淚之路:一步步搭建spring框架

 

例如第一條表示會將工程中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:

JAVA開發血淚之路:一步步搭建spring框架

 

第五步:spring配置文件

spring配置文件通常取名叫」applicationContext.xml」,固然這個不是spring默認的配置名,仍是須要在web.xml中指定,這裏咱們只配置spring的配置文件,其實spring配置中主要是對一些bean的配置,這裏咱們暫時不須要建立任何bean,就只須要簡單地加一下掃描路徑就能夠了。

<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進行路由處理。

<?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,此時就能夠看到以下的輸出:

JAVA開發血淚之路:一步步搭建spring框架

 

出現了咱們想要的結果,此時的心情只能用愉悅來形容,可是咱們指定了須要攜帶user參數,若是url中不帶參數則出現以下的錯誤:

JAVA開發血淚之路:一步步搭建spring框架

 

若是不但願出現這樣的狀況能夠再helloWorld這個參數的@RequestParam修改成@RequestParam(value=」user」,required=false, defaultValue=」World」),固然這只是一個很是小的example說明註解的強大,spring還提供了豐富的註解來實現不一樣的需求,簡直就是用配置和註解來編程。

第十一步:複雜數據結構

上面的測試都是返回一個String,可是咱們通常開發的時候會涉及到複雜的數據結構,你們通常都會用json來做爲通訊的序列化工具,那麼怎麼在spring中支持json呢?在測試這個以前,先看一下如今對於複雜數據結構(例如Map)怎麼返回的。

咱們在Controller中添加一個函數:

@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中添加以下配置:

<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的樣子了。

JAVA開發血淚之路:一步步搭建spring框架

 

第十一步:折騰

好了,上面的示例已經足夠完成一個比較簡單的web服務了,固然咱們尚未前端,只不過是一般做爲服務端提供的Http服務罷了,不過有了spring咱們能夠省去大量的代碼,固然經過HTTP+JSON提供服務端接口比thrift等RPC框架要中一些,效率或許要低一些,可是它的優點是比較簡單啊,調試比較方便啊。。。感受大量的前端和服務端通訊大都使用這樣的方式。

總結

學會了spring框架的搭建,媽媽不再用擔憂我寫web接口了,固然spring還可以適配各類各樣的組件,例如一般使用的mybatis鏈接數據庫,jedis鏈接redis等;還有豐富的功能讓你儘可能經過配置和註解下降沒必要要的代碼。最近比較好的Spring boot貌似也是web開發神器。這個之後有時間再折騰。

固然本文只是記錄了血淚歷程,spring小白是如何一步步的搭建spring開發環境的,大神輕噴。。


歡迎工做一到五年的Java工程師朋友們加入Java架構開發:744677563

本羣提供免費的學習指導 架構資料 以及免費的解答

不懂得問題均可以在本羣提出來 以後還會有職業生涯規劃以及面試指導  

相關文章
相關標籤/搜索