SpringMVC-Restful和攔截器

Restful風格

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

  1. 一個URL操做一個資源
  2. 請求的URL中不能有動詞
  3. 使用HTTP的請求方式來描述請求行爲,例如:

GET(查) POST(增長) DELETE(刪) PUT(改)   在RESTful接口中,全部的方法都是返回JSON,沒有返回頁面的(ModelAndView),所以,全部的方法上都須要添加<!--@ResponseBody-->註解。一個替代的簡化方案,是使用 @RestController 代替@Controller。@RestController其實是一個組合註解,是@Controller和<!--@ResponseBody-->的組合: 在這裏插入圖片描述web

案例

@Controller
public class SpringController {
	/**
	 * 按照id查詢 
	 * @param id
	 */
	@GetMapping("/user/{id}")
	//@ResponseBody
	public void getUserById(@PathVariable Integer id){
		System.out.println("."+id);
	}
	
	@PostMapping("/user")
	//@ResponseBody
	public void addUser(@RequestBody User user){
		System.out.println(user);
	}
	
	
	@DeleteMapping("/user/{id}")
	//@ResponseBody
	public void deleteUserById(@PathVariable Integer id){
		System.out.println(id);
	}
	
	
	@PutMapping("/user")
	//@ResponseBody
	public void updateUserById(@RequestBody User user){
		System.out.println(user);
	}
}

攔截器

 SpringMVC中的攔截器對應了Web基礎中的過濾器。 攔截器和過濾器的區別: |序號|區別 | |--|--| | 1| 通常來講,若是使用了SpringMVC框架,而後有攔截器的需求,建議使用攔截器而不是過濾器 | |2 |過濾器依賴於Servlet容器,而攔截器是SpringMVC自帶的,不依賴容器 | |3| 攔截器的功能更爲強大,由於攔截器是一種AOP風格的過濾器(實際上這個功能過濾器也能實現,只是沒有攔截器這麼簡單明瞭)|spring

案例

定義攔截器

package com.sxt.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyInterceptor implements HandlerInterceptor{

	/**
	 * 在執行controller以前執行的方法
	 * @return
	 *    true 放過請求
	 *    false 攔截請求
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("preHandle ...");
				return true;
		
	}

	/**
	 * 在controller處理完成請求後執行
	 * 在返回ModelAndView以前執行,能夠修改ModelAndView中的信息
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("postHandle ...");
		modelAndView.setViewName("/error.jsp");
		
	}

	/**
	 * 在postHandle方法執行完成後執行,不能影響返回結果
	 * 
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("afterCompletion...");
		
	}
	

}

配置攔截器

<?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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		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.3.xsd">
	
	<!-- 開啓掃描 -->
	<context:component-scan base-package="com.sxt.*"/>
	
	<!-- 開啓SpringMVC註解的方式 -->
	<mvc:annotation-driven>
		<mvc:message-converters>
			<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"></bean>
		</mvc:message-converters>
	</mvc:annotation-driven>
	<!-- 註冊攔截器 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/**"/>
			<bean class="com.sxt.interceptor.MyInterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>
	
</beans>

測試

在這裏插入圖片描述 在這裏插入圖片描述

相關文章
相關標籤/搜索