SpringMVC (2)

SpringMVC次日筆記java

今日內容web

1, 文件的上傳下載spring

2, SSM的集成數據庫

3, SpringMVC的攔截器apache

4, 使用POI文件的導入導出數組

1. 文件上傳

web開發中通常會有文件上傳的操做瀏覽器

通常JavaWeb開發中文件上傳使用的 Apache組織的Commons FileUpload組件spring-mvc

SpringMVC中使用  MultipartFile file對象接受上傳文件,必須保證 後臺參數的名稱和表單提交的文件的名稱一致mvc

 

文件上傳必須條件app

  1. 表單必須post
  2. 表單必須有 file 文件域
  3. 表單的 enctype="multipart/form-data"

 

1.1. 拷貝jar

 

1.2. 準備jsp頁面

<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>

1.3. 後臺代碼

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";

}

 

 

1.4. 配置文件上傳解析器

配置文件上傳解析器:bean的名字是固定的

使用spring表達式 #{1024*1024}

 

<!-- 配置文件上傳解析器:bean的名字是固定的,底層使用的名稱注入 -->

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<!-- 設置上傳文件的最大尺寸爲1MB -->

<property name="maxUploadSize" value="#{1024 * 1024}"></property>

</bean>

1.5. 多文件上傳

<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";

}

2. 文件下載

文件下載,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);

 

}

 

}

 

 

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. 自定義攔截器

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 {

}

}

 

3.1.1. 攔截器的配置的配置

<?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>

 

4. 使用poi組件導出excel文件

使用POI組件實現Excel數據的處理.

下載路徑:http://poi.apache.org/

 

4.1. 入門案例

4.1.1. 導入jar

 

4.1.2. 案例代碼

//使用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

}

}

 

4.2. 使用POI導出數據庫的全部用戶信息

// 導出用戶信息

@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();

}

}

 

5. SpringMVC 控制器 Controller的生命週期

Spring 容器建立的對象默認 都是單例 對象

 

SpringMVC對象 Controller的對象的建立有三種狀況

 

Request : 在用戶的一次請求中生效(用戶每次請求都會建立Controller對象)多例

Session : Controller對象在一次會話中建立一個對象

 

若是控制器中有成員變量 設置或者賦值操做,必須使用 request 返回

 

相關文章
相關標籤/搜索