實例Rest風格+SpringMVC+中文亂碼解決

什麼是Restful風格

Restful 是⼀種 web 軟件架構⻛格,它不是標準也不是協議,它倡導的是⼀個資源定位及資源操作的⻛格。
什麼是 REST:
REST(英⽂: Representational State Transfer,簡稱 REST)描述了⼀個架構樣式的⽹絡系統, ⽐如web 應⽤程序。它⾸次出現在 2000 年 Roy Fielding 的博⼠論⽂中,他是 HTTP 規範的主要編寫者之⼀。在⽬前主流的三種 Web 服務交互⽅案中, REST 相⽐於 SOAP(Simple Object Access protocol,簡單對象訪問協議)以及 XML-RPC 更加簡單明瞭,⽆論是對 URL 的處理還是對 Payload 的編碼,
REST 都傾向於⽤更加簡單輕量的⽅法設計和實現。值得注意的是 REST 並沒有⼀個明確的標準,⽽更像是⼀種設計的⻛格。
它本身並沒有什麼實⽤性,其核⼼價值在於如何設計出符合 REST ⻛格的⽹絡接⼝。

Restful 的優點

它結構清晰、符合標準、易於理解、擴展⽅便,所以正得到越來越多⽹站的採⽤。

Restful 的特性

資源(Resources):⽹絡上的⼀個實體,或者說是⽹絡上的⼀個具體信息。
它可以是⼀段⽂本、⼀張圖⽚、⼀⾸歌曲、⼀種服務,總之就是⼀個具體的存在。可以⽤⼀個 URI(統⼀資源定位符)指向它,每種資源對應⼀個特定的 URI 。要獲取這個資源,訪問它的 URI 就可以,因此URI 即爲每⼀個資源的獨⼀⽆⼆的識別符。

表現層(Representation):把資源具體呈現出來的形式,叫做它的表現層 (Representation)。⽐如,⽂本可以⽤ txt 格式表現,也可以⽤ HTML 格式、 XML 格式、 JSON 格式表現,甚⾄可以採⽤⼆進制格式。

狀態轉化(State Transfer):每發出⼀個請求,就代表了客戶端和服務器的⼀次交互過程。
HTTP 協議,是⼀個⽆狀態協議,即所有的狀態都保存在服務器端。因此,如果客戶端想要操作服務器, 必須通過某種手段,讓服務器端發生“狀態轉化”(State Transfer)。而這種轉化是建⽴在表現層之上的,所以就是 “ 表現層狀態轉化” 。具體說, 就是 HTTP 協議⾥⾯,四個表示操作⽅式的動詞:GET 、 POST 、 PUT 、 DELETE 。它們分別對應四種基本操作: GET ⽤來獲取資源, POST ⽤來新建資源, PUT ⽤來更新資源, DELETE ⽤來刪除資源。

RESTful 的示例:

rest是⼀個url請求的⻛格,基於這種⻛格設計請求的url沒有rest的話,原有的url設計:
http://localhost:8080/user/queryUserById.action?id=3
url中定義了動作(操作),參數具體鎖定到操作的是誰。

有了rest⻛格之後,rest中,認爲互聯⽹中的所有東⻄都是資源,既然是資源就會有⼀個唯⼀的uri標識它,代表它。
用rest風格來表示:http://localhost:8080/user/3 代表的是id爲3的那個⽤戶記錄(資源)

鎖定資源之後如何操作它呢?常規操作就是增刪改查
根據請求⽅式不同,代表要做不同的操作
get 查詢,獲取資源
post 增加,新建資源
put 更新
delete 刪除資源

rest⻛格帶來的直觀體現:就是傳遞參數⽅式的變化,參數可以在uri中了

/account/1 HTTP GET :得到 id = 1 的 account
/account/1 HTTP DELETE:刪除 id = 1 的 account
/account/1 HTTP PUT:更新 id = 1 的 account

URL:資源定位符,通過URL地址去定位互聯⽹中的資源(抽象的概念,⽐如圖⽚、視頻、 app服務等)。
RESTful ⻛格 URL:互聯⽹所有的事物都是資源,要求URL中只有表示資源的名稱,沒有動詞。
RESTful⻛格資源操作:使⽤HTTP請求中的method⽅法put、 delete、 post、 get來操作資源。 分別對
應添加、刪除、修改、查詢。不過⼀般使⽤時還是 post 和 get。 put 和 delete⼏乎不使⽤。
RESTful ⻛格資源表述:可以根據需求對URL定位的資源返回不同的表述(也就是返回數據類型,⽐如XML、 JSON等數據格式)。
Spring MVC ⽀持 RESTful ⻛格請求,具體講的就是使⽤ @PathVariable 註解獲取 RESTful ⻛格的請求
URL中的路徑變量。

前端頁面

<div>
後臺Handler⽅法
<h2>SpringMVC對Restful⻛格url的⽀持</h2>
<fieldset>
<p>測試⽤例: SpringMVC對Restful⻛格url的⽀持</p>
<a href="/demo/handle/15">rest_get測試</a>
<form method="post" action="/demo/handle">
<input type="text" name="username"/>
<input type="submit" value="提交rest_post請求"/>
</form>
<form method="post" action="/demo/handle/15/lisi">
<input type="hidden" name="_method" value="put"/>
<input type="submit" value="提交rest_put請求"/>
</form>
<form method="post" action="/demo/handle/15">
<input type="hidden" name="_method" value="delete"/>
<input type="submit" value="提交rest_delete請求"/>
</form>
</fieldset>
</div>

後端:

/*
* restful get /demo/handle/15
*/
@RequestMapping(value = "/handle/{id}",method ={RequestMethod.GET})
public ModelAndView handleGet(@PathVariable("id") Integer id){
Date date = new Date();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("date",date);
modelAndView.setViewName("success");
return modelAndView;
}
/*
* restful post /demo/handle
*/
@RequestMapping(value = "/handle",method = {RequestMethod.POST})
public ModelAndView handlePost(String username) {
Date date = new Date();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("date",date);
modelAndView.setViewName("success");
return modelAndView;
}
/*
* restful put /demo/handle/15/lisi
*/
@RequestMapping(value = "/handle/{id}/{name}",method ={RequestMethod.PUT})
public ModelAndView handlePut(@PathVariable("id") Integer id,@PathVariable("name") String username) {
Date date = new Date();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("date",date);
modelAndView.setViewName("success");
return modelAndView;
}
/*
* restful delete /demo/handle/15
*/
@RequestMapping(value = "/handle/{id}",method = {RequestMethod.DELETE})
public ModelAndView handleDelete(@PathVariable("id") Integer id) {
Date date = new Date();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("date",date);
modelAndView.setViewName("success");
return modelAndView;
}

中文亂碼問題:

web.xml裏面配置springmvc過濾器:

<!--springmvc提供的針對post請求的編碼過濾器-->
<filter>
  <filter-name>encoding</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
</filter>


<filter-mapping>
  <filter-name>encoding</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

測試:

如果是get請求出現亂碼,則需要修改Tomcat下server.xml的配置:

<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"/>

配置controller中能夠處理put請求的過濾器,在web.xml中配置:

  <!--配置springmvc請求方式轉換過濾器,會檢查請求參數中是否有_method參數,如果有就按照指定的請求方式進行轉換-->
  <filter>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

通過請求方式進行區分,而不是通過uri,相同的uri不同的處理。

歡迎訪問:

微信公衆號(程序員資料站):code_data

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章