SpringMVC檔案上傳、攔截器、異常處理
阿新 • • 發佈:2020-12-26
1、SpirngMVC檔案上傳步驟
-
匯入fileupload和io座標
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
-
配置檔案上傳解析器
<!--配置檔案上傳解析器--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--上傳檔案的編碼型別--> <property name="defaultEncoding" value="UTF-8"></property> <!--上傳檔案總大小--> <property name="maxUploadSize" value="30000000"></property> </bean>
-
編寫檔案上傳程式碼
<form action="${pageContext.request.contextPath}/user16" method="post" enctype="multipart/form-data"> <input type="text" name="username"></br> <input type="file" name="uploadFile"><br> <input type="file" name="uploadFile"><br> <input type="file" name="uploadFile"><br> <input type="submit" value="提交"> </form>
-
測試
@RequestMapping(value = "/user16") @ResponseBody public void save16(String username, MultipartFile[] uploadFile) throws IOException { System.out.println(username); for (MultipartFile multipartFile : uploadFile) { //獲取檔名 String originalFilename = multipartFile.getOriginalFilename(); //儲存檔案 multipartFile.transferTo(new File("E:\\"+originalFilename)); } }
2、Spring MVC 的攔截器鏈(Interceptor Chain)
區別 | 過濾器 | 攔截器 |
---|---|---|
使用範圍 | 是 servlet 規範中的一部分,任何 Java Web 工程都可以使用 | 是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用 |
攔截範圍 | 在 url-pattern 中配置了/*之後,可以對所有要訪問的資源攔截 | 只會攔截訪問的控制器方法,如果訪問的是 jsp,html,css,image 或者 js 是不會進行攔截的 |
自定義攔截器步驟:
-
建立攔截器類實現HandlerInterceptor介面
public class Interceptor1 implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle..."); return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle..."); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion..."); } }
方法名 說明 preHandle() 方法將在請求處理之前進行呼叫,該方法的返回值是布林值Boolean型別的,當它返回為false 時,表示請求結束,後續的Interceptor 和Controller 都不會再執行;當返回值為true 時就會繼續呼叫下一個Interceptor 的preHandle 方法 postHandle() 該方法是在當前請求進行處理之後被呼叫,前提是preHandle 方法的返回值為true 時才能被呼叫,且它會在DispatcherServlet 進行檢視返回渲染之前被呼叫,所以我們可以在這個方法中對Controller 處理之後的ModelAndView 物件進行操作 afterCompletion() 該方法將在整個請求結束之後,也就是在DispatcherServlet 渲染了對應的檢視之後執行,前提是preHandle 方法的返回值為true 時才能被呼叫 -
配置攔截器
<!--配置攔截器--> <mvc:interceptors> <mvc:interceptor> <!--配置對哪些資源執行攔截操作--> <mvc:mapping path="/**"/> <!--攔截器類的全路徑--> <bean class="cn.guixinchn.interceptor.Interceptor1"></bean> </mvc:interceptor> </mvc:interceptors>
-
測試攔截器的攔截效果
@RequestMapping(value = "/user17") @ResponseBody public ModelAndView save17(){ System.out.println("目標方法執行了。。"); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("username","張三"); modelAndView.setViewName("user"); return modelAndView; }
3、SpirngMVC異常處理
異常處理兩種方式:
-
使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResolver
<!--配置簡單對映異常處理器--> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!--配置預設異常--> <!--<property name="defaultErrorView" value="error"></property>--> <property name="exceptionMappings"> <map> <!--key為異常型別,value為錯誤的檢視--> <entry key="java.lang.ClassCastException" value="error1"></entry> <entry key="cn.guixinchn.exception.MyException" value="error2"></entry> </map> </property> </bean>
-
實現Spring的異常處理介面HandlerExceptionResolver 自定義自己的異常處理器步驟:
-
建立異常處理器類實現HandlerExceptionResolver
//引數Exception 異常物件 //返回ModelAndView,跳轉到錯誤的檢視資訊介面 public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView modelAndView = new ModelAndView(); if(e instanceof MyException){ modelAndView.addObject("info","自定義異常"); } else if (e instanceof ClassCastException) { modelAndView.addObject("info","型別轉換異常"); } modelAndView.setViewName("error"); return modelAndView; }
-
配置異常處理器
<bean class="cn.guixinchn.resolver.MyExceptionResolver"></bean>
-
編寫異常頁面、測試
@RequestMapping(value = "/user19") @ResponseBody public void save19() throws MyException { System.out.println("自定義異常....."); throw new MyException(); } @RequestMapping(value = "/user18") @ResponseBody public void save18(){ System.out.println("型別轉換異常....."); Object str = "zhangsan"; Integer num = (Integer) str; }
<html> <head> <title>Title</title> </head> <body> <h1>異常頁面</h1> <h1>${info}</h1> </body> </html>
-