文章目錄
1. 過濾器&攔截器
- 過濾器Filter依賴Servlet容器的,基於回調函數,過濾範圍廣,不但可以對資源進行過濾還可以對請求進行過濾。
- 攔截器Interceptor依賴於框架容器,基於反射機制,只過濾請求。(即只對訪問Controller的請求進行攔截)。
2. 編寫index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1> <a href="demo/test1" target="_blank">FIND1 no param</a> </h1>
<h1> <a href="back/test1" target="_blank">FIND1 no param</a> </h1>
</body>
</html>
3-1. 編寫第一個攔截器MyInterceptor.java繼承HandlerInterceptor
package com.hx.spring.mvc.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之前執行,SpringMVC中的Interceptor攔截器是鏈式調用的,可以同時存在多個Interceptor
* 然後SpringMVC會根據聲明的前後順序,依次調用
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("執行了MyInterceptor中的preHandle方法。。");
return true; //若當前返回值爲false,則鏈式調用中斷,請求結束.
}
/**
* 當preHandle的返回值爲true,然後調用了Controller之後,在DispatcherServlet進行視圖渲染之前執行,
* 也就說這個方法中可以對ModelAndView中的內容進行操作
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("執行了MyInterceptor中的postHandle方法。。");
System.out.println( modelAndView );
modelAndView.setViewName("redirect:/back/find2.html");
}
/**
* 該方法只有在preHandle返回true是纔會執行,該方法將在整個請求完成之後,即DispatcherServlet進行視圖渲染之後執行,
* 一般用來釋放資源,關閉流等
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("執行了MyInterceptor中的afterCompletion方法。。");
}
}
3-2. 編寫MyInterceptor2.java繼承WebRequestInterceptor
package com.hx.spring.mvc.interceptor;
import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.context.request.WebRequestInterceptor;
public class MyInterceptor2 implements WebRequestInterceptor{
/**
* 在調用Controller之前執行,與HandleInterceptor中的preHandle()方法的區別在於,該方法返回void類型
* 故,不可中斷請求,一般用於進行資源準備的工作
*/
@Override
public void preHandle(WebRequest request) throws Exception {
System.out.println("執行了MyInterceptor2的preHandle方法。。");
request.setAttribute("company", "HUATHY", WebRequest.SCOPE_SESSION);
}
@Override
public void postHandle(WebRequest request, ModelMap model) throws Exception {
System.out.println("執行了MyInterceptor2的postHandle方法。。");
for(String key : model.keySet()){
System.out.println( key +"\t"+ model.get(key) );
}
}
@Override
public void afterCompletion(WebRequest request, Exception ex) throws Exception {
System.out.println("執行了MyInterceptor2的afterCompletion方法。。");
}
}
4-1. 編寫控制器DemoController.java
package com.hx.spring.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller //說明這是一個控制器,這個註解是通過<context:component-scan />來掃描的
/*
* 可以出現在類或方法上,若出現在類上,則請求的url爲 類上註解的 + 方法上@RequestMapping註解的地址。
* 若類上的不寫,則url就是方法上@RequestMapping註解的url地址
*/
@RequestMapping("/demo")
public class DemoController {
@RequestMapping("/test1")
public String test1(){
System.out.println("進來了。。。");
return "redirect:/back/find1.html";
}
}
4-2. 編寫控制器BackController.java
package com.hx.spring.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller //說明這是一個控制器,這個註解是通過<context:component-scan />來掃描的
/*
* 可以出現在類或方法上,若出現在類上,則請求的url爲 類上註解的 + 方法上@RequestMapping註解的地址。
* 若類上的不寫,則url就是方法上@RequestMapping註解的url地址
*/
@RequestMapping("/back")
public class BackController {
@RequestMapping("/test1")
public ModelAndView test1(){
System.out.println("進來了。。。");
ModelAndView mav = new ModelAndView("/back/index2.jsp");
mav.addObject("name", "HUATHY");
return mav;
}
}
5. 配置spirngmvc.xml
<?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:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置註解掃描器 -->
<context:component-scan base-package="com.hx.spring.mvc" />
<!-- 放過靜態資源 -->
<mvc:default-servlet-handler />
<!-- 啓用mvc註解 , 掃描註解@RequestMapping、@ResponseBody...-->
<mvc:annotation-driven />
<!-- 配置攔截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/demo/**" /> <!-- 攔截路徑 -->
<bean class="com.hx.spring.mvc.interceptor.MyInterceptor" /> <!-- 攔截後處理器,攔截後交給誰處理 -->
</mvc:interceptor>
</mvc:interceptors>
</beans>
附:
- spirngmvc入門—springmvc的使用(1):https://blog.csdn.net/qq_40366738/article/details/104841413
- springmvc入門—springmvc的使用(2):https://blog.csdn.net/qq_40366738/article/details/104857441
- springmvc入門—springmvc的使用(3)interceptor攔截器:https://blog.csdn.net/qq_40366738/article/details/104905550