Restful是一種軟件設計規範,是客戶端和服務端進行數據交互的一個規範。早期使用jsp頁面開發網頁,數據交互基本都是經過表單提交,而後經過內置對像傳遞,當HTML5興起,移動互聯網興起,網站後端服務,不只要考慮PC端的網頁,也要考慮移動端數據的展現、小程序、HTML5頁面等。若是須要多個終端(Android、iOS、小程序、Pad、HTML5頁面)共用一個後端,通常來講主流方案就是使用JSON進行傳遞。RESTful則規範了請求的URL,注意RESTful只是一個規範,不是一個技術。java
1.一個URL操做一個資源 2.請求的URL不能有動詞 3.使用HTTP的請求方式來描述請求行爲 在restful接口中,全部的方法都是返回json數據,沒有返回頁面(modelandview),所以,全部的方法上面都要添加@restponsebody註解。一個代替的簡單方案,是使用@RestController代替@Controller,@RestController是一個組合註解,是@Controller和@ResponseBody的組合: web
package com.sxt; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.sxt.bean.Book; @RestController public class Conreoller { @PostMapping("/book") @ResponseBody public void getbook(@RequestBody Book book){ System.out.println(book); } @GetMapping("/book/{id}") @ResponseBody public void getbookid(@PathVariable Integer id){ System.out.println(id); } @DeleteMapping("/book/{id}") @ResponseBody public void getbookid1(@PathVariable Integer id){ System.out.println(id); } @PutMapping("/book") @ResponseBody public void getbookid1(@RequestBody Book book){ System.out.println(book); } }
SpringMVC中的攔截器對應了Web基礎中的過濾器,過濾器和攔截器的區別: |序號| 區別 | |--|--| | 1 | 通常來講,若是使用了SpringMVC框架,而後有攔截的需求,建議使用攔截器而不是過濾器 | | 2 | 過濾器依賴於Servlet容器,而攔截器是SpringMVC自帶的,不依賴於容器 | | 3 | 攔截器的功能更增強大,由於攔截器是一種AOP風格的過濾器 |spring
package com.sxt.fifle; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; /** * 自定義攔截器 * @author Administrator * */ public class MyFifle implements HandlerInterceptor{ /** * 進入Handler以前調用的方法 * 處理: * 用於身份確認和受權 * 好比確認當前請求是否登錄,若是登錄就方法,不然攔截跳回登錄界面 * @return * true 放過 * false 攔截 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("執行了"); return true; } /** * 進入Handler以後,返回ModelAndView對象以前執行 * 能夠修改調整的視圖 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("中間執行了"); modelAndView.setViewName("/user.jsp"); } /** * 執行完成Handler以後執行此方法, * 應用場景: * 統一異常處理,統一日誌處理,資源釋放 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("末尾執行了"); } }
第一個攔截器的preHandle方法返回false(後面方法都沒有執行了): preHandle 第一個攔截器的preHandle方法返回true, 第二個攔截器的preHandle方法返回false,此時,第一個攔截器的afterCompletion方法執行了,第二個攔截器的preHandle方法執行了。 規則:1. 全部攔截器的preHandle方法返回true時,postHandle方法纔會執行。 2. 攔截器本身的preHandle方法返回true時,後面的攔截器纔會執行,同時他本身的afterCompletion也會執行。 3. 攔截器的執行順序和xml中的定義順序有關。(preHandle按照定義的順序執行,postHandle和afterCompletion執行順序與定義順序相反)json
<!-- 開啓SpringMVC註解的方式 --> <mvc:annotation-driven > </mvc:annotation-driven> <!-- 開啓掃描 --> <context:component-scan base-package="com.sxt"/> <!-- 攔截器配置 --> <mvc:interceptors> <mvc:interceptor> <!-- ** 表示當前目錄及其子目錄路徑 --> <mvc:mapping path="/**"/> <!-- 自定義攔截器的全路徑 --> <bean class="com.sxt.fifle.MyFifle"/> </mvc:interceptor> </mvc:interceptors>
可是在攔截器修改了頁面
小程序