1. 程式人生 > >springmvc(5)攔截器

springmvc(5)攔截器

轉移 void dex con value mvc框架 view ret exception

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>
     <bean  class="com.MrChengs.Interceptor.MyInterceptor"></bean>
</mvc:interceptors> 

技術分享圖片

攔截器的攔截規則: 攔截規則很多
<!-- 攔截器註冊到mvc框架中 -->
<mvc:interceptors>
     <mvc:interceptor>
           <mvc:mapping path="/view.action"/>
           <bean  class="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>
           <bean  class="com.MrChengs.Interceptor.MyInterceptor"></bean>
           <bean  class="com.MrChengs.Interceptor.MyInterceptor2"></bean>
</mvc:interceptors>

  

執行流程:

preHandle...
preHandle2...
views方法....
name:小明
pwd:xiaoming
postHandle2...
postHandle...
afterCompletion2...
afterCompletion...

當然攔截器的接口不止一個,但是我們在操作中使用最多的還是本次實驗中的這個接口。

其余的HandlerInterceptor,WebRequestInterceptor可以在晚上找幾篇博文看一下了解即可。

springmvc(5)攔截器