总结47 SprignMVC中的 文件上传/拦截器/异常处理机制

文件上传

既然Spring是用来替代Servlet的WEB功能,那么就必不可少的也能处理前端上传过来的文件.

准备:导入fileupload的Jar包

在没有fileupload之前,我们要过滤前端上传过来的文件数据是非常麻烦的,繁琐的.
后来fileupload出现了,它一定程度上地简化了前端上传文件的过滤机制,但总体上来说还是较为麻烦.
后来SpringMvc将fileupload应用其中,并对fileupload的数据过滤机制进一步简化,这才使得开发者能够简单方便的过滤前端发来的文件数据内容.
Maven下的固定格式:


        <!-- 导入FiliUpload 用于快捷地获取前端所提交的文件数据 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>

准备:配置文件解析器

在springmvc.xml中配置文件解析器
注意:文件解析器的Id,必须为"multipartResolver"
格式:

    <!-- 配置文件解析器 用于配合FileUpload来读取前端提交的数据内容(多数为图片文件) -->
        <!-- id必须为'multipartResolver' 否则将无法同FileUpload耦合 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

          <!-- 上传文件的编码类型 默认为UTF-8 -->
            <property name="defaultEncoding" value="utf-8"/>
        <!-- 当上传多个文件时,总文件大小的上限(默认为10MB) -->
            <property name="maxUploadSize" value="10485600"/>
        <!-- 单个文件的大小(默认为5MB) -->
            <property name="maxUploadSizePerFile" value="5242800"/>

    </bean>

应用一:上传单个文件

在这里插入图片描述
步骤一.创建html页面的文件上传表单
格式:

<form action="自定义要提交的虚拟路径" method="post" enctype="multipart/form-data">
                                               <!--此处需要为'multipart/form-data' 将其表单定义为文件上传的表单,且提交类型必须为post -->
    文件:<input type="file" name="自定义请求参数名,参数名必须后端MultipartFile对象的形参名一致"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
    <input type="submit" value="提交"><br>
</form>

列如:

<form action="${pageContext.request.contextPath}/uploadfile" method="post" enctype="multipart/form-data">
                                                <!--此处需要为'multipart/form-data' 将其表单定义为文件上传的表单,且提交类型必须为post -->
    姓名:<input type="text" name="username"><br>
    年龄:<input type="text" name="age"><br>
    文件:<input type="file" name="fileparam"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
    <input type="submit" value="提交"><br>
</form>

步骤二:定义web类的业务方法
格式:

    @RequestMapping("/自定义虚拟路径名")
    @ResponseBody //当使用Multipart来读取表单提交的文件数据时,必须要用上ResponseBody注解
    public void fileupload(MultipartFile 自定义MultipartFile对象名) throws IOException {

			//自定义业务代码......
			
        //     MultipartFile对象的tranferTo方法是一个io流,我们可以通过它来直接把文件写到本地.
        自定义MultipartFile对象名.transferTo(new File("自定义路径\\自定义文件名.文件格式"));
    }

列如:

    @RequestMapping("/uploadfile")
    @ResponseBody //当使用Multipart来读取表单提交的文件数据时,必须要用上ResponseBody注解
    public void fileupload(String username, String age, MultipartFile fileparam) throws IOException {
        System.out.println("run...");

        System.out.println("username:" + username);
        System.out.println("age:" + age);
        //  MultipartFile对象的getOriginalFilename可以获得前端上传的文件名
        String param = fileparam.getOriginalFilename();
        System.out.println(param);

        //此时通过Io,参数为其文件名.便可以把前端上传的文件保存到本地了
        //     MultipartFile对象的tranferTo方法是一个io流,我们可以通过它来直接把文件写到本地.
        fileparam.transferTo(new File("C:\\Users\\1\\Desktop\\test.txt"));
    }

应用二:上传多个文件

在这里插入图片描述
步骤一.创建html页面的文件上传表单
格式:

<form action="自定义要提交的虚拟路径" method="post" enctype="multipart/form-data">
    <!--此处需要为'multipart/form-data' 将其表单定义为文件上传的表单,且提交类型必须为post -->

    文件1:<input type="file" name="自定义请求参数名,参数名必须后端MultipartFile对象的形参名一致"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
    文件2:<input type="file" name="自定义请求参数名,参数名必须后端MultipartFile对象的形参名一致"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
    文件3:<input type="file" name="自定义请求参数名,参数名必须后端MultipartFile对象的形参名一致"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
    ....等多个文件上传input标签
    <input type="submit" value="提交"><br>
</form>

列如:

<form action="${pageContext.request.contextPath}/uploadfilearr" method="post" enctype="multipart/form-data">
    <!--此处需要为'multipart/form-data' 将其表单定义为文件上传的表单 -->

    姓名:<input type="text" name="username"><br>
    年龄:<input type="text" name="age"><br>
    文件1:<input type="file" name="fileparam"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
    文件2:<input type="file" name="fileparam"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
    文件3:<input type="file" name="fileparam"><br> <!-- 此处的type要为'file' 这样能够选择一个文件并开启io流 -->
    <input type="submit" value="提交"><br>
</form>

步骤二:定义web类的业务方法
格式:

@RequestMapping("uploadfilearr")
    @ResponseBody
    public void fileUploadArr(MultipartFile[] 自定义MultipartFile对象名) throws IOException {//既然是多个文件上传,那么此处的MultipartFile文件就是数组
    
		//自定义业务代码.......

		//通过增强for来遍历数组的对象元素
        for (MultipartFile 自定义遍历元素名: 自定义MultipartFile对象名) {

            自定义遍历元素名.transferTo(new File("自定义路径\\自定义文件名.文件格式"));
        }


    }

列如:

@RequestMapping("uploadfilearr")
    @ResponseBody
    public void fileUploadArr(String username, String age, MultipartFile[] fileparam) throws IOException {//既然是多个文件上传,那么此处的MultipartFile文件就是数组
        System.out.println("username:" + username);
        System.out.println("age:" + age);

        for (MultipartFile multipartFile : fileparam) {
            String fileName = multipartFile.getOriginalFilename();
            System.out.println("saveFile:" + fileName);
            multipartFile.transferTo(new File("C:\\Users\\1\\Desktop\\fileSave\\" + fileName));
        }


    }

SpringMVC的拦截器

概念

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
拦截器’不如’过滤器’好用,应用范围也不如’过滤器’广阔.
但是基于这属于SpringMVC的知识点,所以就来连同SpringMVC的’拦截器’也学一学

面试题:
当SpringMVC拦截器的参数为’/**’时,会拦截html和jsp.
要注意的点是,Servlet过滤器的执行级别要比SrpingMVC的拦截器执行级别要优先.
因此当一个资源访问时,是会先用Servlet的过滤器来过滤,如果通过了Servlet过滤器的验证,才再由SpringMVC的拦截器来验证.

步骤一:创建拦截器的实现类

在这里插入图片描述
定义一个类,实现HandlerInterceptor接口,重写preHandle方法
意义:
通过拦截器的实现类,来定义拦截器拦截了某个访问后要做什么事,以及要不要对该请求放行
列如:

public class InterceptorClass implements HandlerInterceptor {
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){

        System.out.println("拦截.... preHandle方法起效");
        response.setContentType("text/html;charset=utf-8");
        try {
            response.getWriter().write("您的权限不够,访问该网页被拦截!");
            System.out.println(".............................preHandle");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;//返回值为true,则代表拦截器对该访问放行.为false则代表不对该访问放行.我们可以用于验证是否处于登录状态
    }
 }    

步骤二:在springmvc中配置拦截器

在springmvc.xml配置文件中.配置拦截器
格式:

    <!-- 配置SpringMVC的拦截器 -->
    <!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--通过规则,来拦截所有请求 通常为一个杠两个星号'/**'-->
            <mvc:mapping path="/**"/>
            <!--指定被拦截器排除的页面 比如用于访问登录页面的:"/login"-->
            <mvc:exclude-mapping path="/要被拦截器忽略拦截的虚拟路径-可省略该标签"/>
            <!--配置拦截器实现类的路径-->
            <bean class="拦截器实现类的路径"/>
        </mvc:interceptor>
    </mvc:interceptors>

SpringMvc异常体系

在这里插入图片描述
在这里插入图片描述
SpringMvc分为两种处理机制
一种是’简单处理机制’,一种是’自定义异常处理机制’.
’自定义异常处理机制’在日常的开发中更为常用

简单异常处理机制

在这里插入图片描述

应用:配置文件

简单异常处理机制很简单,只需要在springmvc.xml中配置文件即可.
其中
格式:

    <!-- 简单异常处理 -->
    <!--配置简单映射异常处理器-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <!--默认错误视图 假若是计算异常和类型转换异常以外的其它异常,将由默认视图来处理 出现异常后跳转的页面为:"erroNum.jsp"-->
        <property name="defaultErrorView" value="forward:/erroNum.jsp"/>
        <property name="exceptionMappings">
            <map>
                <!--  处理计算异常 'ArithmeticException' 代表计算异常  出现异常后跳转的页面为:"erroNum.jsp"  -->
                <entry key="ArithmeticException" value="forward:/erroNum.jsp"/>
                <!-- 处理类型转换异常 'ClassCastException' 代表类型转换异常 出现异常后跳转的页面为:"erroNum.jsp"   -->
                <entry key="ClassCastException" value="forward:/erroNum.jsp"/>
            </map>
        </property>
    </bean>

自定义异常处理机制(常用)

在这里插入图片描述
自定义异常处理器在实际开发中较简单异常处理机制更为常用

步骤一:实现异常处理类

定义一个类,实现HandlerExceptionResolver接口,然后按Alt+Enter来重写resolveException方法

格式模板:

public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {

        //创建ModelAndVied(数据共享与跳转),目的在于根据异常类型的不同,将ModelAndVied作为返回值返回给前端,ModelAndVied自带跳转页面功能(还会携带共享数据)
        ModelAndView 自定义modelAndView对象名 = new ModelAndView();
        //判断出现的异常是什么异常
        if (e instanceof ArithmeticException) {  //如果是计算异常,则执行下面的代码,
            自定义modelAndView对象名.setViewName("跳转链接");  
        } else if (e instanceof ClassCastException) {//如果是类型转换异常,则执行下面的代码
            自定义modelAndView对象名.setViewName("跳转链接");
        } else {//如果是其它异常,则则执行下列代码
            自定义modelAndView对象名w.setViewName("跳转链接");
        }

        return 自定义modelAndView对象名;//返回给前端
    }

步骤二:配置springmvc.xml

格式

    <!-- 配置SpringMvc的自定义异常处理器 其路径为自定义异常处理器的实现类 -->
    <bean class="自定义"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值