springmvc(5)攔截器
1.什麼是攔截器
是指通過統一的攔截從瀏覽器傳送到伺服器的請求來完成相應服務增強
2.攔截器的基本原理
可以通過配置過濾器解決亂碼問題
和過濾器非常相似
3.搭建工程
注意jar包
此時的工程是完成後建立的
web.xml
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
springmvc.xml
<context:component-scan base-package="com.Mrcheng.controller"></context:component-scan> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> <mvc:annotation-driven></mvc:annotation-driven> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean>
ControllerTest.java
@Controller public class ControllerTest { @RequestMapping("/login") public String login(){ return "view"; } @RequestMapping("/view") public ModelAndView views(String name,String pwd){ ModelAndView mv = new ModelAndView(); System.out.println("views方法...."); System.out.println("name:" + name); System.out.println("pwd:" + pwd); mv.addObject("msg", "views方法中的msg"); mv.setViewName("success"); return mv; } }
index.jsp
用於向view.jsp做跳轉
<body> This is my JSP page. <br> <a href="login">to login</a> </body>
view.jsp
主要做測試的頁面
<form action="view" method="post"> user:<input type="text" name="name" ><br> pwd:<input type="password" name="pwd"><br> <input type="submit" value="submit"> </form> </body>
success.jsp
是view.jsp做跳轉成功的頁面測試
<body> <h1>success</h1> msg:${msg} </body>
test.jsp
主要做攔截請求的測試
<body> <h4>攔截請求的轉移測試</h4> </body>
在Tomcat上執行
亂碼測試:
提交之後看控制檯的列印結果:
此時輸入中文的情況下會有亂碼的情況出現
4.對亂碼進行攔截和處理(過濾器)
在web.xml檔案中配置filter
配置程式碼:
<param-name> encoding </param-name>固定值
<filter> <filter-name>filter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf8</param-value> </init-param> </filter> <filter-mapping> <filter-name>filter</filter-name> <url-pattern>*</url-pattern> </filter-mapping>
此時的測試中文是沒有亂碼的@!!!
5.攔截器的實現
自定義攔截器:
MyInterceptor.java
需要實現介面 HandlerInterceptor
public class MyInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
request.setCharacterEncoding("utf-8"); System.out.println("preHandle"); return true; } @Override public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } @Override public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion"); } }
在springmvc.xml檔案中註冊:
<!-- 攔截器註冊到mvc框架中 -->
<mvc:interceptors>
<beanclass="com.MrChengs.Interceptor.MyInterceptor"></bean>
</mvc:interceptors>
攔截器的攔截規則:
攔截規則很多
<!-- 攔截器註冊到mvc框架中 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/view.action"/> <beanclass="com.MrChengs.Interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
6.攔截器的三種方法介紹
1.preHeader 在請求之前被呼叫
是否需要將當前的當前的請求攔截下來
為true表示進行攔截
為false表示不進行攔截,後面的兩個方法不會執行
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler)
request:請求
response:響應
handler:攔截請求的目標的物件 此時是ControllerTest的views方法
2.postHandler 在請求處理被呼叫
public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView)
modelAndView:可以改變顯示的檢視,或者修改方法發往的檢視
測試程式碼:

3.afterCompletion 在請求結束之後才進行呼叫
主要用於關閉一些資源的操作
7.多個攔截器的使用

springmvc.xml配置檔案
假設同時攔截所有的請求
<!-- 攔截器註冊到mvc框架中 --> <mvc:interceptors> <beanclass="com.MrChengs.Interceptor.MyInterceptor"></bean> <beanclass="com.MrChengs.Interceptor.MyInterceptor2"></bean> </mvc:interceptors>
執行流程:
preHandle... preHandle2... views方法.... name:小明 pwd:xiaoming postHandle2... postHandle... afterCompletion2... afterCompletion...
當然攔截器的介面不止一個,但是我們在操作中使用最多的還是本次實驗中的這個介面。
其餘的HandlerInterceptor,WebRequestInterceptor可以在晚上找幾篇博文看一下了解即可。