SpringMVC教程五【Restful和攔截器】

Restful風格

Restful是一種軟件設計規範,是客戶端和服務端進行數據交互的一個規範。早期使用jsp頁面開發網頁,數據交互基本都是經過表單提交,而後經過內置對像傳遞,當HTML5興起,移動互聯網興起,網站後端服務,不只要考慮PC端的網頁,也要考慮移動端數據的展現、小程序、HTML5頁面等。若是須要多個終端(Android、iOS、小程序、Pad、HTML5頁面)共用一個後端,通常來講主流方案就是使用JSON進行傳遞。RESTful則規範了請求的URL,注意RESTful只是一個規範,不是一個技術。java

在Restful中:

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);
	}
	
}

二,攔截器

1.簡介

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>

測試

在這裏插入圖片描述 可是在攔截器修改了頁面 在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述小程序

攔截器工做原理

在這裏插入圖片描述

相關文章
相關標籤/搜索