1. 程式人生 > >【Java】Gradle構建SpringMVC框架實現App請求介面(圖文超詳細)

【Java】Gradle構建SpringMVC框架實現App請求介面(圖文超詳細)

Gradle構建SpringMVC框架實現App請求介面

最近這段時間忙著在找工作,面試不是很多。閒著沒什麼事幹就想著把積累的一點後臺的知識理一理,雖然不一定非得做這方面的工作,但是以後的工作中,遇到一些問題可以快速的定位到。接觸後臺的時間很短,在上一家公司的時候也做過一些給App寫介面的工作。後臺那邊的框架也很多都不懂,就是簡單的依葫蘆畫瓢。遇到問題也有後臺小哥幫忙解決。接下來,我就用我瞭解的一點後臺知識,實現一個介面供App呼叫。

環境描述

作業系統:MacOS
編譯器:Intellij IDEA 2016
Java執行環境,Tomcat
依賴管理工具:Gradle
基礎框架:SpringMVC

Gradle構建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.gradle
compile '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再到後臺,一人包辦。想想還有點小激動對吧?