spring文件上传拦截器及异常处理

2023-05-16

1文件上传

当enctype="multipart/form-data"时request.getParameter()方法失效

单文件上传
导入坐标

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

<form action="${pageContext.request.contextPath}/user/quick22" method="post" enctype="multipart/form-data">
    名称<input type="text" name="username"><br>
    文件<input type="file" name="uploadFile1"><br>
    文件<input type="file" name="uploadFile2"><br>
    文件<input type="submit" value="提交"><br>
</form>

配置文件上传解析器
在spring-mvc.xml中加入

   <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
       <!--上传文件编码类型-->
        <property name="defaultEncoding" value="UTF-8"></property>
       <!--单文件总大小-->
        <property name="maxUploadSize" value="500000"></property>
        <!--文件总大小-->
        <property name="maxUploadSizePerFile" value="1044000"></property>
    </bean>

这里上传到webapp下

@RequestMapping(value = "/quick22")
    @ResponseBody //不进行页面跳转不进行数据回写响应体为空
    public void save22(String username, MultipartFile uploadFile1, MultipartFile uploadFile2) throws IOException {
        System.out.println(username);
        //
        String originalFilename1 = uploadFile1.getOriginalFilename();
        String originalFilename2 = uploadFile2.getOriginalFilename();
        //获取servletContext对象
        WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
        ServletContext servletContext = 
//获取真实路径
webApplicationContext.getServletContext();
        String realPath = servletContext.getRealPath("/");
        //上传到哪儿
        uploadFile1.transferTo(new File(realPath+originalFilename1));
        uploadFile2.transferTo(new File(realPath+originalFilename2));
    }

多文件上传
前台

<form action="${pageContext.request.contextPath}/user/quick23" method="post" enctype="multipart/form-data">
    名称<input type="text" name="username"><br>
    文件<input type="file" name="uploadFile"><br>
    文件<input type="file" name="uploadFile"><br>
    文件<input type="submit" value="提交"><br>
</form>

客户端用数组接循环存储就行

    @RequestMapping(value = "/quick23")
    @ResponseBody //不进行页面跳转不进行数据回写响应体为空
    public void save23(String username, MultipartFile[] uploadFile) throws IOException {
    
        System.out.println(username);
        WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
        ServletContext servletContext = webApplicationContext.getServletContext();
        String realPath = servletContext.getRealPath("/");
        
        for (MultipartFile multipartFile : uploadFile) {
            String originalFilename = multipartFile.getOriginalFilename();
            multipartFile.transferTo(new File(realPath+originalFilename
            ));
        }
    }

2,springMVC拦截器
类似Servlet开发中的过滤器Filter 用于处理器的预处理和后处理
不会拦截js,css html jsp
1)创建MyInterceptorl一个类实现implements HandlerInterceptor
有三个方法

//在目标方法值前
  @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 return flase;//放不放行
 }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
      //再返回视图时执行
     }

//在返回视图后执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}   
    <!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--对所有的目标方法都拦截-->
            <mvc:mapping path="/**"/>
            <bean class="com.flatly.interceptor.MyInterceptorl"/>
        </mvc:interceptor>
    </mvc:interceptors>
@Controller
public class TargetController {
    @RequestMapping("/target")
public ModelAndView show(){
    System.out.println("目标资源执行。。");
    ModelAndView modelAndView =new ModelAndView();
    modelAndView.addObject("name","flatly");
    modelAndView.setViewName("index");
    return modelAndView;
}
}

preHandle方法返回true才会执行目标方法
postHandle可以修改视图modelAndView

测试
携带参数param是yes放行index不然重定向error

public class MyInterceptorl implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle..");
        String param = request.getParameter("param");
        if("yes".equals(param)){
            return true;
        }else {
            request.getRequestDispatcher("/error.jsp").forward(request,response);
            return false;
        }
    }
    }

在目标方法中存储name

    modelAndView.addObject("name","flatly");

返回试图前执行postHandle

        @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
      //再返回视图时执行
       modelAndView.addObject("name","flatlypostuppd");
        System.out.println("postHandle");
    }

在页面上取${name}为flatlypostuppd
配置多个拦截器
顺序(先过去再执行)
1preHandle 2preHandle 目标 postHandle2 postHandle1 afterCompletion2 afterCompletion1

3 异常处理机制
1spring提供简单异常处理机制SimpleMappingExceptionResolver
在spring-mvc.xml

   <!--配置异常处理器-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
      <--这是默认的跳转页面视图-->
        <property name="defaultErrorView" value="error"/>
        <--异常类型与之匹配-->
        property name="exceptionMappings">
            <map>
                <entry key="java.lang.ClassCastException" value="error1"/>
                <entry key="com.itheima.exception.MyException" value="error2"/>
            </map>
        </property>
    </bean>

2自定义异常处理步骤
实现HandlerExceptionResolver

public class MyExceptionResolver implements HandlerExceptionResolver {
    /*
        参数Exception:异常对象
        返回值ModelAndView:跳转到错误视图信息
     */
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView modelAndView = new ModelAndView();

        if(e instanceof MyException){
            modelAndView.addObject("info","自定义异常");
        }else if(e instanceof ClassCastException){
            modelAndView.addObject("info","类转换异常");
        }
        
        modelAndView.setViewName("error");

        return modelAndView;
    }
}

在前端取数据${info}

   <!--自定义异常处理器-->
    <bean class="com.itheima.resolver.MyExceptionResolver"/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring文件上传拦截器及异常处理 的相关文章

随机推荐

  • 制版经验分享—使用AD18

    文章目录 前言一 封装二 走线三 注意细节四 制版流程五 制版细节总结 前言 在做一些培训题目时 xff0c 由于时间有限制 xff0c 在外面开板会花费好几天的制作和快递时间 xff0c 所以有时候就需要自己制版 xff0c 在这里我记录
  • Java打印九九乘法表

    1 使用双重for循环打印九九乘法表 Java源代码如下 xff1a for int i 61 0 i lt 61 9 i 43 43 for int j 61 1 j lt 61 i j 43 43 System out print i
  • 解决selenium打开Chrome浏览器自动退出的问题

    好不容易安装好selenium和对应的浏览器驱动器后终于可以运行程序了 xff0c 结果发现一运行程序后浏览器打开就自动退出了 xff0c 但是我在Python代码中并没有写driver quit 方法 xff0c 上网查了查发现原来是我的
  • 在Java应用中嵌入sshd服务

    这个应用需要依赖apache mina的子项目sshd xff0c 项目主页http mina apache org sshd project index html xff0c 当前版本号为0 8 0 这里的sshd和Linux下的sshd
  • openssl开发库安装时的踩坑指南

    序 前几天用linux编译一个提权脚本的时候报错 openssl opensslv h 没有那个文件或目录 的问题 无论如何也解决不了 xff0c 这下我记录一个踩坑指南防止下一个人掉进坑里 操作 总体介绍 首先介绍一下 xff0c 这个报
  • 性能测试脚本用例【模板】

    产品名称Product name 密级Confidentiality level 秘密 产品版本Product version Total 12pages 共12页 性能测试脚本用例 仅供内部使用 拟制 日期 xff1a 审核 日期 xff
  • Java常见的集合类

    我们常见的Java集合类有List Set Map List 1 接口可以被继承 2 接口可以被多次实现 3 List和ArrayList package List import java util ArrayList import jav
  • WIN7我的电脑右键管理打不开

    问题现象 xff1a 我的电脑右键点击管理无法正常打开 xff0c 会弹出下面的报错信息 首先打开注册表 xff0c 打开运行 xff0c 输入regedit 选择路径 xff1a HKEY LOCAL MACHINE SOFTWARE C
  • LIKE的用法

    我们来谈谈关于like运算符的理解 xff1a 下面是like的语法 xff0c 以后使用到like运算符的都必须根据这个语法使用 LIKE 运算符是用来匹配通配符指定模式的文本值 如果搜索表达式与模式表达式匹配 xff0c LIKE 运算
  • 从0开始详细安装archlinux(UEFI启动)

    隔了一周没更新 xff0c 前阵子把电脑windows卸了装了个archlinux xff0c 不得不说arch是真的香 xff0c 但是坑也是真的多 xff0c 刚踩完所有的坑 xff0c 滚回来写blog了 注 xff1a 本贴为UEF
  • archlinux开机无法联网问题,以及安装archlinuxcn和yay管理器

    前一篇已经安装完了archlinux系统 xff0c 不过真正难的其实并不是安装 xff0c 你的路现在才开始 xff0c 哈哈 添加用户 建议 xff0c 不然使用登录管理器的时候不支持root用户 span class token fu
  • archlinux安装kde桌面和sddm登录管理器

    前几篇已经配置好了archlinuxcn软件仓库 xff0c 网络和nvidia驱动 xff0c 现在来给你的archlinux安装一个kde桌面 xff08 kde玩法有很多 xff0c 可以自己去搜一搜美化教程 xff09 xff0c
  • Spring框架学习

    目录 目录 学习内容 xff1a IoC java中创建对象有哪些方式 xff1a ioc的体现 xff1a DI 是ioc的技术实现 spring的第一个核心功能 ioc Spring 八大模块 Spring的特点 xff1a Sprin
  • CenOs6.7不能使用yum命令

    因为官方不维护了所以 先用更换源 wget O etc yum repos d CentOS Base repo https mirrors aliyun com repo Centos vault 6 10 repo https deve
  • PowerMock注解PowerMockIgnore的使用方法

    故事要从一个异常开始 xff0c 某天我在开发一个加密 解密特性 xff0c 算法使用的是3DES xff0c 样例代码如下 package org jackie study powermock import java io Unsuppo
  • 如何写一棵AVL树

    二叉查找树 二叉查找树有一个缺陷就是查询效率跟树的高度有关 在极端情况下 xff0c 查询效率为n 如何解决二叉查找树效率低问题 xff1f 要增加查询效率 xff0c 高效的方案是在插入的时候对树进行一下平衡操作 xff0c 降低树的高度
  • 点击超链接下载.pdf文件

    上代码 span class token keyword package span span class token class name Servlet span span class token punctuation span res
  • SpringTemplate增删改查及其事务控制基本使用

    一 JdbcCRUD操作 1 导入坐标包 span class token generics span class token punctuation lt span dependency span class token punctuat
  • C语言从键盘读入一个正整数num,计算0 ~ num(包括num)范围内所有奇数之和

    include span class token generics span class token punctuation lt span stdio span class token punctuation span h span cl
  • spring文件上传拦截器及异常处理

    1文件上传 当enctype 61 34 multipart form data 34 时request getParameter 方法失效 单文件上传 导入坐标 span class token generics span class t