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