一.前言
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加盟
這里直接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,剩下的處理邏輯,這里就不贅述了。希望這篇文章對新人有所幫助吧。