1. 文件上傳
在web開發中一般會有文件上傳的操作
一般JavaWeb開發中文件上傳使用的 Apache組織的Commons FileUpload組件
SpringMVC中使用 MultipartFile file對象接受上傳文件,必須保證 后台參數的名稱和表單提交的文件的名稱一致
文件上傳必須條件
- 表單必須post
- 表單必須有 file 文件域
- 表單的 enctype="multipart/form-data"
1)拷貝jar包
|
2) 准備jsp頁面
1 <fieldset> 2 3 <legend>單個文件上傳</legend> 4 5 <form action="${pageContext.request.contextPath}/upload.do" method="post" enctype="multipart/form-data"> 6 7 姓名: <input name="username"><br> 8 9 頭像: <input type="file" name="headImg"><br> 10 11 <button type="submit">提交</button> 12 13 </form> 14 15 </fieldset>
3) 后台代碼
SpringMVC中使用 MultipartFile file對象接受上傳文件,必須保證 后台方法MultipartFile 參數的名稱和表單提交的文件的名稱一致
1 //SpringMVC中使用 MultipartFile file對象接受上傳文件,必須保證 后台參數的名稱和表單提交的文件的名稱一致 2 3 @RequestMapping("/upload") 4 5 public String singleUpload(MultipartFile headImg,@RequestParam("username")String username) throws IOException { 6 7 8 9 System.out.println(headImg.getName());//獲取上傳文件的表單名稱 10 11 System.out.println(headImg.getContentType());//MIME類型 12 13 System.out.println(headImg.getSize());//文件大小 14 15 System.out.println(headImg.getOriginalFilename());//獲取上傳文件的完整名稱 16 17 //獲取上傳文件對應的輸入流 18 19 //InputStream in = headImg.getInputStream(); 20 21 22 23 //創建一個磁盤目錄用於保存文件 24 25 File destFile= new File("c:/upload"); 26 27 if(!destFile.exists()) { 28 29 destFile.mkdir(); 30 31 } 32 33 //使用uuid作為文件隨機名稱 34 35 String fileName = UUID.randomUUID().toString().replaceAll("-", ""); 36 37 //使用FileNameUtils獲取上傳文件名的后綴 38 39 String extension = FilenameUtils.getExtension(headImg.getOriginalFilename());// jpg , png 等等 40 41 //創建新的文件名稱 42 43 String newFileName = fileName + "."+extension; 44 45 46 47 //創建要保存文件的File對象 48 49 File file = new File(destFile, newFileName); 50 51 //保存文件到本地磁盤 52 53 headImg.transferTo(file); 54 55 56 57 return "redirect:/upload.jsp"; 58 59 }
4)配置文件上傳解析器
1 配置文件上傳解析器:bean的名字是固定的 2 3 使用spring表達式 #{1024*1024} 4 5 6 7 <!-- 配置文件上傳解析器:bean的名字是固定的,底層使用的名稱注入 --> 8 9 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 10 11 <!-- 設置上傳文件的最大尺寸為1MB --> 12 13 <property name="maxUploadSize" value="#{1024 * 1024}"></property> 14 15 </bean>
5) 多文件上傳
1 <fieldset> 2 3 <legend>單個文件上傳</legend> 4 5 <form action="${pageContext.request.contextPath}/uploads.do" method="post" enctype="multipart/form-data"> 6 7 文件1: <input type="file" name="headImgs"><br> 8 9 文件2: <input type="file" name="headImgs"><br> 10 11 文件3: <input type="file" name="headImgs"><br> 12 13 <button type="submit">提交</button> 14 15 </form> 16 17 </fieldset>
1 @RequestMapping("/uploads") 2 3 public String singleUploads(MultipartFile[] headImgs) throws IOException { 4 5 6 7 8 9 //創建一個磁盤目錄用於保存文件 10 11 File destFile= new File("c:/upload"); 12 13 if(!destFile.exists()) { 14 15 destFile.mkdir(); 16 17 } 18 19 for (int i = 0; i < headImgs.length; i++) { 20 21 MultipartFile headImg = headImgs[i]; 22 23 24 25 //使用uuid作為文件隨機名稱 26 27 String fileName = UUID.randomUUID().toString().replaceAll("-", ""); 28 29 //使用FileNameUtils獲取上傳文件名的后綴 30 31 String extension = FilenameUtils.getExtension(headImg.getOriginalFilename());// jpg , png 等等 32 33 //創建新的文件名稱 34 35 String newFileName = fileName + "."+extension; 36 37 38 39 //創建要保存文件的File對象 40 41 File file = new File(destFile, newFileName); 42 43 //保存文件到本地磁盤 44 45 try { 46 47 headImg.transferTo(file); 48 49 } catch (Exception e) { 50 51 e.printStackTrace(); 52 53 } 54 55 } 56 57 return "redirect:/upload.jsp"; 58 59 }
2. 文件下載
文件下載,SpringMVC並沒有做過多的封裝,還是使用原來的下載方式
1 package cn.zj.springmvc.controller; 2 3 4 5 import java.io.FileInputStream; 6 7 import java.io.IOException; 8 9 10 11 import javax.servlet.ServletOutputStream; 12 13 import javax.servlet.http.HttpServletResponse; 14 15 16 17 import org.apache.commons.io.IOUtils; 18 19 import org.springframework.stereotype.Controller; 20 21 import org.springframework.web.bind.annotation.RequestMapping; 22 23 24 25 @Controller 26 27 public class DownloadController { 28 29 /* 30 31 * 下載文件思路 32 33 * 1. 接受需要下載文件名稱,根據文件名稱,找到磁盤對應的文件,讀取到內存中形成一個輸入流 34 35 * 2. 將輸入流通過響應對象(HttpServletResponse)響應給瀏覽器(下載) 36 37 * 38 39 * 注意:Web一般只會下載小型文件 40 41 * 42 43 */ 44 45 @RequestMapping("/download") 46 47 public void upload(String fileName ,HttpServletResponse response) throws IOException { 48 49 //0. 判斷是否vip,有積分,金豆 50 51 //TODO 52 53 54 55 //1. 接受文件名,讀取磁盤對應的文件,創建輸入流對象 56 57 58 59 FileInputStream inputStream = new FileInputStream("C:/"+fileName); 60 61 62 63 //2.獲取響應對象的輸出流 64 65 ServletOutputStream outputStream = response.getOutputStream(); 66 67 68 69 70 71 //3.文件下載文件名的編碼使用ISO-08859-1編碼 72 73 //我們需要將我們UTF-8的 filename轉換ISO-8859-1編碼 74 75 //3.1先將字符串以UTF-8轉換成字節數組 76 77 byte[] bytes = fileName.getBytes("UTF-8"); 78 79 //3.2再將字節數組以 ISO-8859-1轉換字符串 80 81 fileName = new String(bytes, "ISO-8859-1"); 82 83 84 85 86 87 //4.響應的內容應該是以附件的形式響應給瀏覽器(設置響應頭) 88 89 response.setHeader("Content-Disposition", "attachment;filename="+fileName); 90 91 92 93 //5.響應文件給瀏覽器 94 95 IOUtils.copy(inputStream, outputStream); 96 97 98 99 } 100 101 102 103 }
3. SpringMVC的攔截器
攔截器 : Interceptor
Spring MVC 的攔截器類似於Servlet 開發中的過濾器Filter,用於對Controller進行預處理和后處理。
使用SpringMVC攔截器步驟:
1)定義攔截器類,實現接口 org.springframework.web.servlet.HandlerInterceptor
2)在applicationContext.xml中配置攔截器
攔截器方法的執行時機:
1):preHandle:控制器方法執行之前執行,返回結果為true表示放行,如果返回為false,表示攔截(可以做權限攔截,登錄檢查攔截).
2):postHandle:控制器方法執行后,視圖渲染之前執行(可以加入統一的響應信息).
3):afterCompletion:視圖渲染之后執行(處理Controller異常信息,記錄操作日志,清理資源等)
1) 自定義攔截器
1 public class CheckLoginInterceptor implements HandlerInterceptor { 2 3 //1):preHandle:控制器方法執行之前執行,返回結果為true表示放行,如果返回為false,表示攔截(可以做權限攔截,登錄檢查攔截). 4 5 // true : 放行 false :不放行 6 7 @Override 8 9 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 10 11 throws Exception { 12 13 14 15 System.out.println("攔截器執行了......"); 16 17 //從Session中獲取登錄信息 18 19 String username = (String)request.getSession().getAttribute("username"); 20 21 System.out.println(username); 22 23 24 25 if(username !=null) { 26 27 //放行 28 29 return true; 30 31 }else { 32 33 //跳轉到登錄頁面去 34 35 response.sendRedirect(request.getContextPath()+"/login.jsp"); 36 37 return false; 38 39 } 40 41 } 42 43 44 45 //postHandle:控制器方法執行后,視圖渲染之前執行(可以加入統一的響應信息). 46 47 @Override 48 49 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 50 51 ModelAndView modelAndView) throws Exception { 52 53 } 54 55 56 57 //afterCompletion:視圖渲染之后執行(處理Controller異常信息,記錄操作日志,清理資源等 58 59 @Override 60 61 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 62 63 throws Exception { 64 65 } 66 67 }
2)攔截器的配置的配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 5 xmlns:p="http://www.springframework.org/schema/p" 6 7 xmlns:mvc="http://www.springframework.org/schema/mvc" 8 9 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 10 11 xsi:schemaLocation=" 12 13 http://www.springframework.org/schema/beans 14 15 http://www.springframework.org/schema/beans/spring-beans.xsd 16 17 http://www.springframework.org/schema/mvc 18 19 http://www.springframework.org/schema/mvc/spring-mvc.xsd 20 21 "> 22 23 24 25 <!-- 配置springmvc的注解驅動 --> 26 27 <mvc:annotation-driven/> 28 29 30 31 32 33 34 35 <!-- 配置攔截器 :可以有多個攔截器--> 36 37 <mvc:interceptors> 38 39 <!--配置檢查登錄攔截器 --> 40 41 <mvc:interceptor> 42 43 44 45 <!-- 配置攔截的規則 46 47 只會攔截 控制器請求,不會攔截jsp頁面 48 49 /* 50 51 只能攔截一級 如 : /list.do /delete.do 52 53 如:/user/list.do , /user/delete.do 二級 不能攔截 54 55 /** 56 57 可以攔截多級 無論幾級都可以 如 /a/b/c/d/list.do 58 59 --> 60 61 <mvc:mapping path="/**"/> 62 63 64 65 <!-- 排除攔截的地址,多個地址使用逗號隔開 66 67 /user/login.do 68 69 70 71 72 73 --> 74 75 <mvc:exclude-mapping path="/user/login.do"/> 76 77 78 79 <!-- 攔截器的類型 --> 80 81 <bean class="cn.zj.ssm.interceptor.CheckLoginInterceptor"/> 82 83 84 85 </mvc:interceptor> 86 87 </mvc:interceptors> 88 89 90 91 92 93 </beans>
4. 使用poi組件導出excel文件
使用POI組件實現Excel數據的處理.
1)入門案例
[1] 導入jar包
[2] 案例代碼
1 //使用POI創建excel文件到本地 2 3 @Test 4 5 public void testName() throws Exception { 6 7 //1.創建數據,用於本地創建excel 8 9 HSSFWorkbook book = new HSSFWorkbook(); 10 11 //2.創建一個sheet 工作區域 12 13 HSSFSheet sheet = book.createSheet(); 14 15 //3.創建一行: 從0開始,代表第一行 16 17 HSSFRow row = sheet.createRow(0); 18 19 //4.創建一個個單元格 20 21 HSSFCell cell1 = row.createCell(0); 22 23 //5.設置單元格的數據 24 25 cell1.setCellValue("張三"); 26 27 28 29 HSSFCell cell2 = row.createCell(1); 30 31 cell2.setCellValue(20); 32 33 34 35 //將數據保存到本地 36 37 try { 38 39 book.write(new File("d:/測試.xlsx")); 40 41 } catch (Exception e) { 42 43 e.printStackTrace(); 44 45 // TODO: handle exception 46 47 } 48 49 }
2) 使用POI導出數據庫的所有用戶信息
1 // 導出用戶信息 2 3 @RequestMapping("/exprot") 4 5 public void export(HttpServletResponse response) { 6 7 8 9 10 11 //創建POI的數據對象 12 13 HSSFWorkbook book = new HSSFWorkbook(); 14 15 //創建sheet 16 17 HSSFSheet sheet = book.createSheet(); 18 19 //創建標題列 20 21 HSSFRow titleRow = sheet.createRow(0); 22 23 //創建表單單元格並設置值 24 25 titleRow.createCell(0).setCellValue("編號"); 26 27 titleRow.createCell(1).setCellValue("姓名"); 28 29 titleRow.createCell(2).setCellValue("郵箱"); 30 31 titleRow.createCell(3).setCellValue("電話"); 32 33 34 35 List<User> users = service.list(); 36 37 //循環學生 38 39 for (int i = 0; i < users.size(); i++) { 40 41 //獲取每個學生 42 43 User user = users.get(i); 44 45 //創建學生列 46 47 HSSFRow row = sheet.createRow(i+1); 48 49 //創建學生信息對應的單元格並設置數據 50 51 row.createCell(0).setCellValue(user.getId()); 52 53 row.createCell(1).setCellValue(user.getName()); 54 55 row.createCell(2).setCellValue(user.getEmail()); 56 57 row.createCell(3).setCellValue(user.getPhone()); 58 59 } 60 61 62 63 try { 64 65 //設置響應頭,響應的內容是為附件形式 66 67 response.addHeader("Content-Disposition", 68 69 "attachment;filename=" + new String("學生信息.xlsx".getBytes(), "ISO-8859-1")); 70 71 72 73 book.write(response.getOutputStream()); 74 75 } catch (Exception e) { 76 77 e.printStackTrace(); 78 79 } 80 81 }
5. SpringMVC 控制器 Controller的生命周期
Spring 容器創建的對象默認 都是單例 對象
SpringMVC對象 Controller的對象的創建有三種情況
Request : 在用戶的一次請求中生效(用戶每次請求都會創建Controller對象)多例
Session : Controller對象在一次會話中創建一個對象
如果控制器中有成員變量 設置或者賦值操作,必須使用 request 返回