SpringMvc-10.14上傳、攔截器、異常處理

hh兩個h發表於2020-10-14

1.SpringMVC實現檔案上傳:
和Servlet方式的本質一樣,都是通過commons-fileupload.jar和commons-io.jar
SpringMVC可以簡化檔案上傳的程式碼,但是必須滿足條件:實現MultipartResolver介面;而該介面的實現類SpringMVC也已經提供了CommonsMultipartResolver

具體步驟:(直接使用CommonsMultipartResolver實現上傳)
a.jar包
commons-fileupload.jar、commons-io.jar
b.配置CommonsMultipartResolver
將其加入SpringIOC容器

		
	<!-- 配置CommonsMultipartResolver,用於實現檔案上傳
	將其加入SpringIOC容器.
	springIoc容器在初始化時,會自動尋找一個Id="multipartResolver"的bean,並將其加入Ioc容器
	 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
			<property name="defaultEncoding" value="UTF-8"></property>
			<!-- 上傳單個檔案的最大值,單位Byte;如果-1,表示無限制 -->
			<property name="maxUploadSize"  value="104857600"></property>
	</bean>

c.處理方法

		//檔案上傳處理方法
		@RequestMapping(value="testUpload") //abc.png
		public String testUpload(@RequestParam("desc") String desc  , @RequestParam("file") MultipartFile file  ) throws IOException {
			
			System.out.println("檔案描述資訊:"+desc);
			//jsp中上傳的檔案:file
			
			InputStream input = file.getInputStream() ;//IO
			String fileName = file.getOriginalFilename() ;
			
			OutputStream out = new FileOutputStream("d:\\"+fileName) ;
			
			
			byte[] bs = new byte[1024];
			int len = -1;
			while(( len = input.read(bs)) !=-1 ) {
				out.write(bs, 0, len);
			}
			out.close();
			input.close();
			//將file上傳到伺服器中的 某一個硬碟檔案中
		System.out.println("上傳成功!");
			
			return "success";
		}

	<form action="handler/testUpload" method="post"  enctype="multipart/form-data">
		<input type="file" name="file" />
		描述:<input name="desc" type="text" />
		
		<input type="submit" value="上傳">
	</form>
	<form action="handler/testUpload" method="post"  enctype="multipart/form-data">
		<input type="file" name="file" />
		描述:<input name="desc" type="text" />
		
		<input type="submit" value="上傳">
	</form>

框架:將原來自己寫的1000行程式碼,變成:框架幫你寫900行,剩下100行自己寫

控制器:handler/servlet/controller/action

2.攔截器
攔截器的原理和過濾器相同。
SpringMVC:要想實現攔截器,必須實現一個介面HandlerInterceptor

ctrl+shift+r :自己編寫的程式碼.java .jsp .html
ctrl+shift+t :jar中的程式碼

a.編寫攔截器implements HandlerInterceptor

package org.lanqiao.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{

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("攔截請求");  //
		return true;//true:攔截操作之後,放行 ;false:攔截之後不放行,請求終止;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("攔截響應");
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("檢視(jsp)被渲染完畢");
	}

}

b.配置:將自己寫的攔截器配置到springmvc中(spring)

<!-- 將自己寫的攔截器 配置到springmvc中(spring);預設攔截全部請求 -->
	<mvc:interceptors>
		
			<!-- 配置具體的攔截路徑 -->
			<mvc:interceptor>
				<!-- 指定攔截的路徑,基於ant風格 -->
				<mvc:mapping path="/**"/>  
				<!-- 指定攔不截的路徑 -->
				<mvc:exclude-mapping path="/handler/testUpload"/> 
				<bean  class="org.lanqiao.interceptor.MyInterceptor"></bean>
			</mvc:interceptor>
			
				<!-- 配置具體的攔截路徑 -->
			<mvc:interceptor>
				<!-- 指定攔截的路徑,基於ant風格 -->
				<mvc:mapping path="/**"/>  
				<!-- 指定攔不截的路徑 -->
				<mvc:exclude-mapping path="/handler/testUpload"/> 
				<bean  class="org.lanqiao.interceptor.MySecondInterceptor"></bean>
			</mvc:interceptor>
	</mvc:interceptors>

攔截器1攔截請求- 攔截器2攔截請求 - 請求方法 - 攔截器2處理相應-攔截器1處理相應- 只會被最後一個攔截器的afterCompletion()攔截

如果有多個攔截器,則每個攔截器的preHandle postHandle都會在相應時機各被觸發一次;但是afterCompletion,只會執行最後一個攔截器的該方法。
在這裡插入圖片描述

相關文章