程序员的春天-SpringMVC04

程序员的春天-SpringMVC04

2020/4/15
springmvc完结篇,mybatis,spring,springmvc,三大件基本完结,ssm整合即将到来!

人智统合真国,也就是fgo2.3章的地图bgm

满满的中国风,感受到了大秦的辽阔边疆。越来越想入大秦籍了。
大秦有仙丹,不会生病。


文件上传和下载

上传文件

流程

  1. 引入jar包依赖
  2. 编写前段页面
  3. 编写后端接收页面
  4. 注册文件上传解析器
  5. 启动服务器测试

单个文件

引入jar包依赖

<dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
</dependency>
<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
</dependency>

编写前段页面

<form action="springMvc/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="imgs"><br/>
    <input type="submit" value="上传">
</form>

form标签上必须添加enctype="multipart/form-data"属性的值,表明要上传文件

编写控制器接收

    @RequestMapping("/upload")
    public String upload (MultipartFile img) {
        String path = "D:/";
        String fileName = img.getOriginalFilename();
        File file = new File(path, fileName);
        try {
            img.transferTo(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "success";
    }

接收的参数为MultipartFile类型
需要创建一个file对象并设置路径和文件名称
通过MultipartFile的getOriginalFilename方法可一获取到传入的文件名
MultipartFile的transferTo方法传入file对象即可

springmvc注册文件上传扫描器

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8"/>
    </bean>

这里的id名和class名是固定的,不可以改变
property注入defaultEncoding可以设置编码格式

多个文件

与单个文件差异不打,jar包和xml文件配置都是一样的

前段页面

<form action="springMvc/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="imgs"><br/>
    <input type="file" name="imgs"><br/>
    <input type="file" name="imgs"><br/>
    <input type="submit" value="上传">
</form>

控制器代码

    @RequestMapping("/upload")
    public String upload (
            @RequestParam MultipartFile[] imgs,
            HttpSession session

    ) {
        String path = session.getServletContext().getRealPath("/");
        for (MultipartFile img : imgs) {
            String fileName = img.getOriginalFilename();
            File file = new File(path, fileName);
            try {
                img.transferTo(file);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "success";
    }

这里代码是用了session对象拿到了sercletContext用sercletContext获取了项目的根目录,然后把上传的文件放在了根目录上
传入的参数是MultipartFile类型的数组,传入数组需要使用@RequestParam注解矫正
然后用for循环遍历之后使用transferTo方法即可

下载文件

控制器代码

    @RequestMapping("/download")
    public ResponseEntity<byte[]> downLoad () throws Exception {
        // 指定下载文件
        File file = new File("d:/锐雯.jpg");
        InputStream is = new FileInputStream(file);
        // 创建字节数组,并且设置数组大小位预估的文件字节数
        byte[] body = new byte[is.available()];
        // 将输入流字符存储到缓存数组中
        is.read(body);
        // 获取下载显示的文件名,中文乱码问题
        String name = file.getName();
        String s = new String(name.getBytes("utf-8"), "ISO-8859-1");
        // 设置http响应头信息,通知浏览器以附件形式下载
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("Content-Disposition", "attachment;filename=" + s);
        // 设置http响应状态信息
        HttpStatus ok = HttpStatus.OK;
        ResponseEntity<byte[]> entity = new ResponseEntity<>(body, httpHeaders, ok);
        return entity;
    }

自定义拦截器

流程

  1. 创建拦截器类实现HandlerInterceptor接口
  2. 重写preHandle,postHandle,afterCompletion方法
  3. springmvc.xml配置拦截器

拦截器代码

public class FirstInterceptors implements HandlerInterceptor {
    // 处理器方法执行之前
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("preHandle:我给你拦截了!");
        return true;
    }
    // 处理器方法执行之后
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("之后");
    }
    // 所有工作处理完成之后
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("所有工作结束");
    }
}

preHandle

在处理器方法执行前执行
返回一个boolean用于决定处理器方法是否执行

postHandle

处理器方法执行之后执行

afterCompletion

所有工作处理完成之后执行

配置拦截器

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/springMvc/a"/>
	    <mvc:exclude-mapping path="springMvc/a"/>
            <bean id="firstInterceptors" class="top.byfree.interceptors.FirstInterceptors"/>
        </mvc:interceptor>
    </mvc:interceptors>

mvc:interceptors下可以配置多个mvc:interceptor拦截器,执行顺序为先配置的先执行
mvc:mapping path="/springMvc/a",决定拦截的路径,全部拦截位/**
mvc:exclude-mapping path="springMvc/a"用于配置不拦截的路径,可以取消掉mvc:mapping拦截的路径

封面画师:纯白可怜

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.byfree.top/archives/springmvc04