SpringMVC(文件上传和下载 ,SpringMVC拦截器,转发和重定向)

1.重定向和转发操作

     1.转发:

        方式一:使用传统的方法转发:

@Controller
@RequestMapping("/mvc")
public class MVCController {

    @RequestMapping("/springmvcA")
    public void springmvcA(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("springmvcA");
        request.getRequestDispatcher("/mvc/springmvcB")
                .forward(request,response);
    }

    @RequestMapping("/springmvcB")
    public String springmvcB(){
        System.out.println("springmvcB");
        return "springmvc";
    }
}

        方式二:SpringMVC的转发: 

关键字:forward

    //@RequestMapping("/springmvcA")
    public String springmvcA_1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("springmvcA--转发开始");
        //关键字转发: forward:/
        return "forward:/mvc/springmvcB";
    }





    //@RequestMapping("/springmvcB")
    public String springmvcB_1(){
        System.out.println("springmvcB");
        return "springmvc";
    }

      2.重定向:

           传统方式:

@RequestMapping("/springmvcA")
public void springmvcA_2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("springmvcA--重定向开始");
    // 必须添加上下文路径
    response.sendRedirect(request.getContextPath()+"/mvc/springmvcB");
}

@RequestMapping("/springmvcB")
public String springmvcB_2(){
    System.out.println("springmvcB");
    return "springmvc";
}

           关键字方式:

@RequestMapping("/springmvcA")
public String springmvcA_3(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("springmvcA--重定向开始");
    //redirect:/关键字 自动添加了上下文路径
    return "redirect:/mvc/springmvcB";
}

@RequestMapping("/springmvcB")
public String springmvcB_3(){
    System.out.println("springmvcB");
    return "springmvc";
}

小结:

1. springMVC遇到关键字redirect 或者 forward时,则默认开启重定向和转发操作,

    要求返回值类型是String

   视图解析器:

  • 说明: 如果跳转首页 通过IndexController配置 比较繁琐. 所以SpringMVC通过视图控制器 跳转首页.

  • 框架分析:

    • Spring: 内部包含了SpringMVC框架 所以可以无缝集成.

    • 父子关系: Spring父级-SpringMVC子级.

  • 调用规则:

    • 使用对象: 原来从Spring容器中获取的对象.

    • 使用mvc标签: 默认规则启用子级容器SpringMVC,只要mvc容器启动 则以后的Controller只能从springMVC容器中获取.

    • 问题: 通过包扫描 将Controller的对象都交给Spring管理, 如果想要代码正确,应该将Controller对象交给SpringMVC容器管理.

  • 解决方案: 开启SpringMVC注解




RestFul

查询业务: GET类型

删除业务:DELETE类型

新增业务:POST类型

修改业务:PUT类型

SpringMVC文件上传和下载

文件下载放在公共路径还是服务器

下载:

改变页面跳转默认位置

  要想使用默认跳转,注意其他@RequestMapper注解的路径不要有根路径 比如:   /    

在IndexController里就体现到了

    //@RequestMapping("/")
    public String index(){
        return "index";
    }


    

开启SpringMVC容器 现在由SpringMVC容器管理
    

1.准备file页面




    
    Title
    



我是文件下载

下载文件

2.文件实现类

    @GetMapping("/getFile")
    public ResponseEntity getFile() throws IOException {
        //获取文件下载路径
        String filePath = "E:/atguigu/课堂资料/张梦迪/张梦迪/苹果1.mp4";
        //读取文件
        InputStream inputStream = new FileInputStream(filePath);
        //3.准备响应对象
        //  inputString.avaiable() 获取文件可用的字节长度,适用于小型文件,
        //  大文件使用buffer缓冲流做
        byte[] bytes = new byte[inputStream.available()];
        //4.将数据保存到数组中
        inputStream.read(bytes);
        //5.准备响应头信息
        HttpHeaders httpHeaders = new HttpHeaders();
        //6.将字符串转化为ISO-8859-1
        // attachment:附件形式   filename文件名称

        String filename = new String("苹果1.mp4".getBytes("UTF-8"),"ISO-8859-1");

        httpHeaders.add("Content-Disposition","attachment;filename="+filename);
        //参数1:读取的字节数组   参数2: 添加响应头,告知下载文件  参数3:响应状态:200
        return new ResponseEntity<>(bytes,httpHeaders, HttpStatus.OK);
    }
上传:

1.添加jar包

    
      commons-fileupload
      commons-fileupload
      1.3.1
    

2.配置文件上传视图解析器

设置最大上传量  ,单位是byte


    


    

3.file页面设置


文件名:

优化上传文件

1.file.html

    
        文件名:
        

2.实现

    @PostMapping("/uploadFile2")
    public String uploadFile2(MultipartFile file) throws IOException {
        //1.定义文件的根目录信息
        String baseDir = "E:/atguigu/课堂资料/张梦迪/";
        //2.要求  按照时间yyyy/mm/dd的目录保存数据
        String datePath = new SimpleDateFormat("/yyyy/mm/dd/").format(new Date());
        //3.提前准备目录
        String fileDirPath = baseDir +datePath;
        File fileDir = new File(fileDirPath);
        if (!fileDir.exists()){
            //创建多级目录
            fileDir.mkdirs();
        }
        //4.为了防止文件重名 ,我们使用UUID
        String uuid = UUID.randomUUID().toString().replace("-","");
        //5.获取文件类型    file.getOriginalFilename().lastIndexOf(".")  找到 . 的位置, 从后往前找  根据 .  来截取
        String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        String newFileName = uuid +fileType;
        //6.拼接文件的全路径
        File newFile = new File(fileDirPath + newFileName);
        //7.文件上传
        file.transferTo(newFile);

        return "file_success";
}

3.删除
@GetMapping("/removeFile")
public String removeFile(String fileName){
        //1.制定根目录
    String baseDir = "E:/atguigu/课堂资料/张梦迪/";
    //2.拼接完整路径
    String fullPath = baseDir + fileName;
    //3.封装为对象
    File file = new File(fullPath);
    
    if (file.exists()){
        if (file.delete()){
            System.out.println("删除成功");
        }
        else {
            System.out.println("删除文件失败");
        }
         {
            System.out.println("文件不存在");
        }
        
    }
    return "file_success";
}

SpringMVC拦截器

回顾过滤器
  • 过滤器是JavaWeb 核心组件之一

    • Servlet

    • Filter

    • Listener

  • 过滤器作用:

    • 当用户访问Servlet时 首先会经过过滤器,如果不放行,则不能访问资源.

  • 什么场景使用过滤器:

    • 校验用户登录的token

    • 处理字符串乱码问题.

    • 过滤器一般拦截的是请求 不能直接干预业务的执行


拦截器:

1.创建拦截器的页面

我是拦截器的测试

获取服务器数据信息

2.创建拦截器实现类

package com.liu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
        @RequestMapping("/interceptor")
public class interceptorController {
@RequestMapping("/getMsg")
    public String getMsg(){
    System.out.println("业务调用成功");
    return "interceptor";
    }
}

3.自定义拦截器 ,包装

HandlerInterceptor 

package com.liu.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//SpringMVC调用流程  处理器真正的执行业务方法 Controller -Service -Dao

public class MyInterceptor1 implements HandlerInterceptor {

    //true: 表示放行  业务方法可以正常执行
    //false: 表示拦截  +配合重定向使用
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("1.处理器执行业务前调用");
       
   //        return true;
        response.sendRedirect("http://www.baidu.com");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("2.处理器执行业务之后");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("3.处理器执行完成业务,返回给用户前,最后一关");
    }
}

SpringMVC(文件上传和下载 ,SpringMVC拦截器,转发和重定向)_第1张图片

4.在xml中配置拦截器

    
    

    
    
        

            
            
        
    
拦截器的执行顺序
  • 规则1: 先执行的 最后返回

  • 规则2: 如果有一个拦截器 不放行 则不能执行业务方法.

SpringMVC(文件上传和下载 ,SpringMVC拦截器,转发和重定向)_第2张图片

拦截器和过滤器的区别

1.执行的位置不同

Filter在Servlet前执行

拦截器在业务执行前执行

2.功能不同

 Filter一般处理公共的业务,字符集问题 token校验问题

拦截器: 具体的业务问题

SpringMVC(文件上传和下载 ,SpringMVC拦截器,转发和重定向)_第3张图片

你可能感兴趣的:(java,开发语言)