1. 程式人生 > >優雅的SpringMVC和Restful

優雅的SpringMVC和Restful

mvd 編寫 pad ont 百度 null src static framework

一.前言

1.前段時間一直在寫微信小程序的請求,終於把客戶端的請求弄好了,可是服務端呢,該怎麽寫,糾結了半天,用servlet暫時寫好了一個:http://www.cnblogs.com/JJDJJ/p/7299274.html

我們看一下整體代碼:技術分享 當然這下面還有一大串。。

有沒有發現,這些代碼非常亂,以至於現在的我看著腦兒疼。

2.後來想著用API的那種形式寫一個服務端,小程序這邊post過去json格式數據,然後服務端獲取json,接著對數據進行操作,最後返回結果就行了。類似百度外賣API這樣的:

技術分享

技術分享

可以看到,在request和response中的json數據非常優雅。

那麽我們怎麽寫出這樣優雅的API服務端給客戶端調用呢。終於找到了一個比較好的實現方式:Restful

二.實現

1.jar包導入

我們現在從零開始,首先創建一個project,然後導入jar包:

技術分享

這些在後面的操作全部都用到,所以全都導進去好了。CSDN上這些資源應該爛大街的。

2.項目結構搭建:

首先在src下添加xml:springmvc-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-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"
> <!-- scan the package and the sub package --> <context:component-scan base-package="com.restful" /> <!-- 配置視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!-- don‘t handle the static resource --> <mvc:default-servlet-handler/> <!-- if you use annotation you must configure following setting --> <mvc:annotation-driven/> </beans>

接著在web.xml裏面添加:

<servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!-- 配置 DispatcherServlet 的一個初始化參數: 配置 SpringMVC 配置文件的位置和名稱 -->
        <!-- 實際上也可以不通過 contextConfigLocation 來配置 SpringMVC 的配置文件, 而使用默認的. 默認的配置文件為: 
            /WEB-INF/<servlet-name>-servlet.xml -->
        <!-- <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet2.xml</param-value> 
            </init-param> -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

然後我們看這行xml配置,需要配置視圖解析器,在WEB-INF下創建jsp文件夾用,來存放jsp資源,當然可以是其他名稱,只不過你的配置和目錄要一致

技術分享

接著在jsp文件夾裏面創建一個hello.jsp文件,老規矩,在頁面上寫上hello world :D

下面開始建包,還記得xml配置了這句嗎

技術分享

他需要掃描com.restful包,所以我們新建一個,然後再在這個包裏新建一個Controller。

技術分享

這樣差不多項目結構就搭建好了

3.編寫代碼:

首先開始擼MyController:

技術分享

@Controller 的意思是註冊一個bean到spring容器中,讓spring容器知道,你這個類是個控制器,如果沒有這個註解,會報404,我們用postman(一個發送請求工具,可以百度)測試發現:

技術分享

技術分享

就算你寫了URL映射也是一樣

下面看一下@RequestMap註解,這個註解就是URL映射了:技術分享.

可以看到,我剛剛的請求是http://localhost:6789/RestFul/mvc/xxx/xxx

而不是http://localhost:6789/RestFul/mvb或者http://localhost:6789/RestFul/mvd

這個URL取決於這個註解裏的值。寫錯了一樣報404。

接著是方法上面的Mapping,同理,這邊寫什麽,請求的url就是什麽,我這裏寫了一個/hello,請求就是:

http://localhost:6789/RestFul/mvc/hello

接著看這個方法裏面,有兩個參數,你可以試試請求url:

http://localhost:6789/RestFul/mvc/hello?name=zjj&age=20和http://localhost:6789/RestFul/mvc/hello?name=adminj&age=233

分別輸出了什麽,上面操作沒問題應該輸出這個:

技術分享

最後的return “hello”;

則是返回的視圖的名字,還記得之前配置視圖解析器的時候嗎,前綴是WEB-INF/jsp,後綴就是.jsp。那麽中間部分jsp的名字呢,就是這個hello,連起來就是hello.jsp

我們測試一下:

技術分享

可以看到輸入這個url後直接跳轉到了之前創建的hello.jsp。

那麽問題來了,這個url利用?拼接的參數,那我們需要獲取一個對象的時候該怎麽辦呢,別擔心,把方法的參數設成一個實體類,他會自動幫你裝箱:

技術分享

先創建一個Person:

技術分享

接著是在hello.jsp同目錄下創建一個Person.jsp

最後我們測試一下:

技術分享

這裏參數對應了Person類裏的屬性

控制臺也輸出了:技術分享

可以看到,這個方法的參數,變成了一個對象,你在url中用&拼接參數的話,只要參數和屬性對應,他就會自動幫你裝箱。

3.Restful登場

上面只是spring mvc的簡單應用,當然我們為了完成目標:API服務端 是不夠的。我們還需要用restful。

新建一個RestController控制器,再寫一個post方法:

技術分享

這個@PathVariable的意思就是動態的獲取請求url中的參數,比如我現在用工具發一個post請求:

技術分享

可以看到,這個請求url是:http://localhost:6789/RestFul/rest/user/1

可以看到,這個請求的狀態:技術分享

是成功的,我們再看一下控制臺輸出:技術分享

成功輸出了方法名和傳入的ID參數

當然,restful包括其他幾種請求方式,比如GET/DELETE/PUT 這裏就不一一舉例,可以自己寫幾個然後用postman測試,這裏有許多不同的請求方式:

技術分享

(網頁中輸入url的方式是GET)

恭喜,到這裏已經簡單的入門了,但是我們還不夠。我們的目標中,還有一個重要的東西:json數據的傳輸

4.json加盟

新建一個controller:技術分享

這樣寫道:技術分享

這裏直接return p,剛開始你會覺得很奇怪,但是你測試一下:

技術分享

嗯,很強大,直接return 了一個json格式數據。

那我們要是post一個json格式數據過去,應該怎麽做呢?繼續寫道:

技術分享

這裏,我們添加了一個參數,是User類,前面有一個@RequestBody註解,這個註解就是用來接受json數據的

然後返回一個map類型的數據,你會發現測試的結果,神奇的非常優雅:

技術分享

可以看到,我們post了一組json數據,其中name和id必須和User類裏的屬性對應,少字段沒事,只會顯示null或者0,比如上面的birth,我在post的時候就沒有這個字段,他這裏就直接顯示null了,不能錯,錯了回直接報400.

(玩過json轉Obj或者Obj轉json的朋友應該知道,在轉換類裏實現了序列化後還需要把json的字段和Obj的屬性對應,不然回出錯)

三.結語

到此,基本上我們的目標實現的差不多了,接受json和返回數據都實現了,用了spring mvc和restful,而不是servlet,剩下的處理邏輯,這裏就不贅述了。希望這篇文章對新人有所幫助吧。

優雅的SpringMVC和Restful