- resultful風格
- 異常處理
1.Restfule風格
Restfule風格是一種軟件架構風格,而不是標准,只是提供了一種設計原則和約束條件。主要適用於客戶端和服務器端交互的軟件。是基於http協議實現。目的是為了提高系統的可伸縮性,降低應用之間的耦合度,方便框架分布式處理程序。基於這個風格的軟件可更加的簡單、更有層次,更易於實現緩存的機制。
在resultful風格中,用戶請求的url使用同一個URL而用請求方式:get/post/delete/put等方式對請求的處理方法進行區分。這樣可以在前后台分離的開發中讓前端開發人員不會對請求的資源地址產生混淆,形成一個統一的接口。
使用區別:在http協議中,四個表示操作方式的動詞:GET/Post/put/Delete,他們分別對應四種基本操作。Get用來獲取資源。post用來新建立資源,也可以更新資源。put用來更新資源。Delete用來刪除資源
一般格式如下:
@RequestMapping(value="{id}",method=RequestMethod.GET)
@RequestMapping(value="{id}",method=RequestMethod.POST)
@RequestMapping(value="{id}",method=RequestMethod.DELETE)
@RequestMapping(value="{id}",method=RequestMethod.PUT)
現在controller類中進行使用如下:
1 @Controller 2 @RequestMapping("users") 3 public class UsersController { 4 5 @RequestMapping(value="{uid}",method=RequestMethod.GET)//查詢 6 public String fingById(@PathVariable("uid") int id) { 7 System.out.println("===findbyid==="); 8 int a=10/0; 9 return "index"; 10 } 11 12 @RequestMapping(method=RequestMethod.POST)//添加 13 public String addUsers(Users users) { 14 System.out.println("===addUsers==="); 15 System.out.println(users); 16 return "index"; 17 } 18 19 @RequestMapping(method=RequestMethod.PUT)//修改 20 @ResponseBody 21 public String updateUsers(Users users) { 22 System.out.println("===updateUsers==="); 23 System.out.println(users); 24 return "index"; 25 } 26 27 @RequestMapping(value="{id}", method=RequestMethod.DELETE)//刪除 28 @ResponseBody 29 public String delete(@PathVariable int id) { 30 System.out.println(id+"===delete==="); 31 return "index"; 32 } 33 }
編寫完成后進行測試,在這里我們用一個google的插件進行測試,可以選擇提交方式等十分的方便
測試GET和POST均通過,顯示200狀態碼(通過)
而對於其中的PUT和DELETE我們在測試時發現並不能正確通過
因為瀏覽器端只可通過GET和POST,所以我們需要在測試時添加屬性_method=PUT/_method=DELETE,對應的需要在配置文件中加入一個過濾器【HiddenHttpMethodFilter】這個過濾器的作用是將POST提交的_method=PUT/_method=DELETE通過轉化為PUT/DELETE
1 <filter> 2 <filter-name>hiddenHttpMethodFilter</filter-name> 3 <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 4 </filter> 5 <filter-mapping> 6 <filter-name>hiddenHttpMethodFilter</filter-name> 7 <url-pattern>/*</url-pattern> 8 </filter-mapping>
至此測試通過如下
2.異常處理
在上面的controller類中大家可能發現有一個地方會出錯,拋出異常即int a=10/0,我們現在進行處理;
1 @RequestMapping(value="{uid}",method=RequestMethod.GET)//查詢 2 public String fingById(@PathVariable("uid") int id) { 3 System.out.println("===findbyid==="); 4 int a=10/0;//拋出異常 5 return "index"; 6 }
對於此異常有兩種處理方式,實際算是一種吧,看個人理解
第一種:在本類中加入以下代碼
//該類中發生異常時由該方法來處理 @ExceptionHandler public ModelAndView error(Exception exception) { ModelAndView mv=new ModelAndView(); mv.addObject("error", exception.getMessage()); mv.setViewName("error"); return mv; }
當該類中發生異常時由該方法來處理,對應的可以在前端頁面進行接收這個錯誤信
第二種:新建一個類,用來接收獲得的所有的異常,以此避免在每一個類中進行異常處理
1 @ControllerAdvice 2 public class ExceptionController { 3 4 //該類中發生異常時由該類來處理 5 @ExceptionHandler 6 public ModelAndView error(Exception exception) { 7 ModelAndView mv=new ModelAndView(); 8 mv.addObject("error", exception.getMessage()); 9 mv.setViewName("error"); 10 return mv; 11 } 12 }
前端頁面代碼,其中需加入isErrorPage="true"屬性,意思是此頁面為錯誤信息顯示頁面,我們再次接收錯誤信息,當處理了上面的異常后跳出到這里顯示
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8" isErrorPage="true"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <meta charset="UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 ${error } 11 </body> 12 </html>
測試結果,成功顯示異常信息:
Tips(SpringMVC部分注解)
SpringMVC注解:
1@Controller:標注該類為控制層類
2.@RequestMapping:標注請求的地址
3.@ResponseBody:把java對象轉化為json對象
4.@Valid:標注校驗該數據
5.@PathVariable:接收uri地址的值賦值給參數
6.@SessionAttributes:保存到Session中
7.@RequestParam:接收參數若參數名不同可用,當沒傳參數值時可設置默認值
8.@ExceptionAdivice:標注一個類為異常處理類
9.@EcceptionHandler:標注一個方法為異常處理方法
10.@InitBinder:時間參數處理格式