springmvc的文件上传和下载,框架集成
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 返回