【Java】Gradle構建SpringMVC框架實現App請求介面(圖文超詳細)
Gradle構建SpringMVC框架實現App請求介面
最近這段時間忙著在找工作,面試不是很多。閒著沒什麼事幹就想著把積累的一點後臺的知識理一理,雖然不一定非得做這方面的工作,但是以後的工作中,遇到一些問題可以快速的定位到。接觸後臺的時間很短,在上一家公司的時候也做過一些給App寫介面的工作。後臺那邊的框架也很多都不懂,就是簡單的依葫蘆畫瓢。遇到問題也有後臺小哥幫忙解決。接下來,我就用我瞭解的一點後臺知識,實現一個介面供App呼叫。
環境描述
作業系統:MacOS
編譯器:Intellij IDEA 2016
Java執行環境,Tomcat
依賴管理工具:Gradle
基礎框架:SpringMVCGradle構建springMVC框架
開啟我們的編譯器,建立一個新的工程,選擇Gradle,勾選Web,如下圖所示:
建立工程點選Next,填寫GroupId和ArtfactId(GroupId:專案的唯一標識,ArtfactId:一般為專案名稱),如圖:
建立工程依然Next,配置一些Gradle的相關資訊,具體的我不是很瞭解,這裡選擇的是會自己去下載相應的Gradle版本。當然也可以使用本地Gradle,建議先下載到本地,不然就自己準備梯子。這個下載速度真的感人。
建立工程點選Next,專案建立完成。基礎的工程目錄結構如下圖:
基礎工程目錄接下來配置Tomcat伺服器,不知道怎麼描述,我們還是看圖說話吧,編譯器右上角如圖的地方,點選一個Tomcat服務。
配置Tomcat伺服器左上角的新增按鈕點選新增一個Tomcat Server 選擇Local
新增Tomcat Server輸入一個Name,我們發現右下角有一個錯誤提示,是讓你配置一個路徑,點選Fix隨便選一個就好了。然後點選Apply,再點選OK。這樣,我們的Tomcat Server就配置完成了。還是圖:
配置Tomcat Server如果不出什麼意外的話,程式可以跑起來了。為了看效果,接下來我們到src目錄下的main目錄下的webapp目錄中找到index.jsp檔案,在body中隨意的輸入一點文字。
修改index.jsp檔案執行程式,如果可以看到預設的jsp頁面,表示一切到這裡都很正常。
執行成功的jsp頁面到這裡,基礎的工程搭建出來了,接著呢,我們利用Gradle匯入SpringMVC的框架
開啟工程目錄下的build.gradle檔案,在dependencies中引入框架。這個我覺得就相當於iOS開發中的cococaPods。一個構建和管理三方依賴的外掛。
build.gradlecompile 'org.springframework:spring-webmvc:4.3.6.RELEASE'
這裡會自動的去下載框架需要的jar包,這裡還是要會科學上網。不然這個下載速度真不是一個慢字能夠描述的。修改了這個檔案之後,就會自動去下載了。有時候網不好的話,會失敗的。失敗之後可以在如上圖所示的最右邊的側邊欄中選中Gradle,然後點選重新整理就好了。
SpringMVC引入完成,接著我們去java目錄下建一個包,接著新建一個類出來。
新建一個包
在剛剛建的包下建一個DemoController的類接下來在DemoController中簡單的寫幾行程式碼
@Controller @RequestMapping("test") public class DemoController { @RequestMapping(value = "/hello", method = RequestMethod.GET) @ResponseBody public Map hello() { Map map = new HashMap(); map.put("msg", "請求成功"); map.put("data", "浪漫戀星空"); return map; } }
註解的意思呢,我也解釋不清楚,只知道這樣寫。先把這些東西知道怎麼用了再慢慢的去研究下。
修改了程式碼,我們重新啟動一下伺服器。還是可以正常的看到我們剛剛的頁面,接下來在位址列輸入下面的地址,當然這個地址是我Demo中隨意寫的。它的構成也很簡單,就是本機的地址加上@RequestMapping裡面的東西拼接起來的。
http://localhost:8080/test/hello
然後,開心的敲了一下回車。我們就可以得到我們的資料了。等等,這麼簡單?看圖:
錯誤頁面喜聞樂見,說好的資料呢。習慣了Xcode崩潰在main的地方,到這裡,是不是感覺一臉懵逼?別急,剛剛我們雖然引入了SpringMVC框架,但是還需要在專案中作一些配置。感覺後臺的東西真的太雜了,各種配置工程,反正我是很不習慣。開啟Project Structure(編譯器介面的右上角的地方),找到Web Gradle模組,並點選Deployment Descriptors欄右側的加號新增web.xml檔案。如圖:
建立web.xml檔案開啟剛剛建立的web.xml檔案,在該檔案中新增如下對映
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
再次重啟伺服器,在位址列輸入前面的地址。然後我發現還是一個404的瀏覽錯誤,因為自己對於後臺基本的配置不是很瞭解,在這裡倒騰了很久。
剛剛我們在建立web.xml的時候是預設的路徑,我這邊是在.idea目錄的modules目錄的WEB-INF下,而這個路徑查資料說是必須在webapp目錄下的WEB-INF中,然而我初始的工程中沒有這個檔案。沒有怎麼辦,new一個出來就完事了。建立好了之後把我們之前的web.xml檔案拖到webapp目錄的WEB-INF下,重啟伺服器。還是剛剛的地址。tomcat返回異常資訊,nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]。這是因為剛剛我們在web.xml中配置了一個dispatcher,我們需要同時給這個dispatcher建立一個dispatcher-servlet.xml,還是在webapp目錄的WEB-INF中。
注意:dispatcher-servlet.xml這是一個Spring Config檔案,它的名字是有規定的,就是剛剛在web.xml中配置的servlet-name-servlet.xml。
建立Spring Config檔案建立好這個檔案之後,在dispatcher-servlet.xml中輸入下面的內容。
<?xml version="1.0" encoding="UTF-8"?> <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:component-scan base-package="cn.iotguard.demo.controller"></context:component-scan> <mvc:annotation-driven></mvc:annotation-driven> </beans>
再次重啟伺服器,位址列輸入最開的地址。
錯誤資訊這次又出現瞭如圖的錯誤資訊,大致可以知道這是一個跟資料型別相關的報錯,因為我們App端拿到伺服器的資料通常都是json格式的。而我們在程式碼中是直接返回的一個map,@ResponseBody這個註解是SpringMVC框架中的,通過它可以自動轉換成json資料格式。通過這些知識,然後百度關鍵字,SpringMVC整合json。然後發現,還需要給框架整合一個json解析的jar包,這裡就使用fastjson。修改dispatcher-servlet.xml的檔案內容如下
<?xml version="1.0" encoding="UTF-8"?> <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:component-scan base-package="com.xingkong.controller"></context:component-scan> <mvc:annotation-driven> <!--配置@ResponseBody由fastjson解析--> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="defaultCharset" value="UTF-8"/> </bean> <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"/> </mvc:message-converters> </mvc:annotation-driven> <mvc:default-servlet-handler/> <bean id="fastJsonpResponseBodyAdvice" class="com.alibaba.fastjson.support.spring.FastJsonpResponseBodyAdvice"> <constructor-arg> <list> <value>callback</value> <value>jsonp</value> </list> </constructor-arg> </bean> </beans>
最後別忘了新增fastjson的依賴。修改build.gradle檔案。
compile group: 'com.alibaba', name: 'fastjson', version: '1.2.28'
這裡給大家一個倉庫網站,在這個網站可以找到很多我們需要的jar包的gradle依賴的新增。
新增完依賴之後,重啟伺服器。接下來幹什麼不用再說了吧,都要說哭了。
終於等到你。。。還好我沒。。。(額。。。有點偏了! )!
正確請求到的資料倒騰這麼久,終於還是出來了是吧。現在開啟我們的Xcode,隨意做一個網路請求。看看能不能把我們的資料請求回來。
[ZZTNetworkingManager GET:@"http://localhost:8080/test/hello" parameters:nil success:^(id responseObject) { NSLog(@"%@",responseObject); } failure:^(NSError *error) { NSLog(@"%@",error); }];
這裡就是隨便拿了一個專案中的網路請求方法,封裝的AF,懶得重新去建工程pod三方,這裡就偷個懶。執行程式,心態瞬間就炸了,請求失敗了。報錯如下:
{Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: internal server error (500)
看到這個報錯大家應該都不會很陌生吧,剛剛開始工作的iOS開發,如果遇到一個也是第一次給iOS端寫介面的後臺小兄弟,然後兩個就懵逼了。這裡實際上就算iOS端和後臺沒有約定contentType,正經一點的公司這些東西可能是老大們約定好了的。如果遇到都是新手的話,這是必踩的坑。
修改DemoController中的程式碼如下:
@Controller @RequestMapping("test") public class DemoController { @RequestMapping(value = "/hello", method = RequestMethod.GET, produces="application/json;charset=UTF-8") @ResponseBody public Map hello() { Map map = new HashMap(); map.put("msg", "請求成功"); map.put("data", "浪漫戀星空"); return map; } }
在@RequestMapping中新增一個produces="application/json;charset=UTF-8"就好了。
再次請求介面,可以看到控制檯返回了請求到的資料。
[00:02:00] __31-[ZZTHotController viewDidLoad]_block_invoke [第35行] { "msg" : "請求成功", "data" : "浪漫戀星空" }
以上就是Gradle構建SpringMVC框架實現App請求介面的內容介紹。當然,這是一些後臺很基礎的試用。稍微有一點後臺基礎的人都覺得這個很簡單,雖然我作為一個移動端開發,但是我也有一顆後臺的心好吧。感興趣的移動端朋友可以試試寫著玩。無聊了再學點資料庫設計,再懂一些連線池技術,sql相信都會一些。搞不好哪天就自己倒騰一個像模像樣的App出來。從設計到App再到後臺,一人包辦。想想還有點小激動對吧?