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