優雅的SpringMVC和Restful


一.前言

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

我們看一下整體代碼:image 當然這下面還有一大串。。

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

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

image

image

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

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

二.實現

1.jar包導入

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

image

這些在后面的操作全部都用到,所以全都導進去好了。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資源,當然可以是其他名稱,只不過你的配置和目錄要一致

image

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

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

image

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

image

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

3.編寫代碼:

首先開始擼MyController:

image

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

image

image

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

下面看一下@RequestMap注解,這個注解就是URL映射了:image.

可以看到,我剛剛的請求是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

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

image

最后的return “hello”;

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

我們測試一下:

image

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

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

image

先創建一個Person:

image

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

最后我們測試一下:

image

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

控制台也輸出了:image

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

3.Restful登場

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

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

image

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

image

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

可以看到,這個請求的狀態:image

是成功的,我們再看一下控制台輸出:image

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

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

image

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

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

4.json加盟

新建一個controller:image

這樣寫道:image

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

image

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

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

 

image

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

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

image

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

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

三.結語

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM