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数据的处理.
下载路径:http://poi.apache.org/
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 返回