SpringMVC(三)(文件上传、自定义异常、拦截器)

本文介绍了如何在SpringMVC中实现文件上传,配置了文件解析器并创建了HTML表单。同时展示了异常处理机制,包括自定义异常类和异常处理器,以及在发生异常时跳转到错误页面。最后,讨论了SpringMVC的拦截器,创建了自定义拦截器并配置到拦截器链中,展示了预处理、后处理和完成处理的方法。

1.SpringMVC方式文件上传

SpringMVC框架提供了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的 name属性名称相同。

1.1在pom.xml文件中导入依赖

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

1.2在springmvc.xml中配置文件解析器,id 名称必须为:multipartResolver

        <bean id="multipartResolver"                         
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
                <property name="maxUploadSize" value="10240000"></property>
        </bean>

1.3创建html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="student/upload">
    <input type="file" name="file"><br>
    <input type="submit" value="上传">
</form>
</body>
</html>

1.4测试(controller类)

package com.coffee.control;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

@Controller
@RequestMapping("student")
public class Control {
    @RequestMapping("upload")
    public String upload(MultipartFile file, Model model){

        String originalFilename = file.getOriginalFilename();
        System.out.println("老名字为:"+originalFilename);
        originalFilename = UUID.randomUUID().toString().replace("-","")+originalFilename;
        System.out.println("新名字为:"+originalFilename);
//        上传路径 我上传到另一个tomcat服务器上了 所以上传后运行两个服务器打开网页可以进行访问
        String path = "D:\\apache-tomcat-8.5.31\\webapps\\imgs\\";

        try {
//            上传
            file.transferTo(new File(path,originalFilename));
        } catch (IOException e) {
            e.printStackTrace();
        }
        model.addAttribute("originalFilename",originalFilename);
        return "/main.jsp";
    }

}
<%--
  Created by IntelliJ IDEA.
  User: 86156
  Date: 2021/10/20
  Time: 10:17
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--我自己另一个tomcat的端口号为9999--%>
<img src="http://localhost:9999/imgs/${originalFilename}">
</body>
</html>

点击上传后就跳转到图片所在的路径啦(前提是打开你上传的另一个tomcat服务器) 

2.SpringMVC的异常处理

Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理。

2.1创建自定义异常类

package com.coffee.exception;

public class Myexception extends  Exception{
    public Myexception(String message){
        super(message);
    }
}

2.2创建异常处理器类

package com.coffee.exception;

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

public class MyExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException
            (javax.servlet.http.HttpServletRequest request,
             javax.servlet.http.HttpServletResponse response,
             Object handler,
             Exception ex) {
//        new 一个modelAndView 用来传递信息和跳转页面
        ModelAndView modelAndView = new ModelAndView();
//        if - else 语句来判断异常属于社么
        if (ex instanceof NullPointerException){
            modelAndView.addObject("message","空指针异常");
        }else if (ex instanceof Myexception){
            modelAndView.addObject("message","自定义异常");
        }else {
            modelAndView.addObject("message","其他异常");
        }
//        跳转到另一个页面
        modelAndView.setViewName("/error");

        return modelAndView;
    }
}

2.3在springmvc.xml中配置并写创建一个显示错误的页面 error.jsp

<!--配置异常处理器-->
<bean id="myExceptionResolver" class="com.qf.exception.MyExceptionResolver"/>
<%--
  Created by IntelliJ IDEA.
  User: 86156
  Date: 2021/10/20
  Time: 11:33
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
错误页面
<br>
${message}
</body>
</html>

2.4测试

package com.coffee.control;

import com.coffee.exception.Myexception;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

@Controller
@RequestMapping("student")
public class MyTest {
    @RequestMapping("upload")
    public String upload(MultipartFile file, Model model) throws Myexception {

        System.out.println("方法执行了。。。。");

//        自己写一个空指针异常
//        String s = null;
//        int length = s.length();

//        自己写一个自定义异常
//            throw new Myexception("我的异常");

        //其他异常
        int i=1/0;


        return null;
    }
}

3.SpringMVC框架中的拦截器

拦截器的概述 SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。

拦截器和过滤器的功能比较类似,有以下区别:

过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。 拦截器是SpringMVC框架独有的。

过滤器配置了/*,可以拦截任何资源。 拦截器只会对控制器中的方法进行拦截。

拦截器也是AOP思想的一种实现方式 想要自定义拦截器,需要实现HandlerInterceptor接口。

3.1创建自定义拦截器

package com.coffee.intercepter;

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

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

public class MyIntercepter implements HandlerInterceptor {
    /**
     * 预处理,controller方法执行前
     * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
     * return false 不放行
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("我是预处理方法preHandle");
        return true;
    }
    //后处理方法,controller方法执行后,success.jsp执行之前
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("我是后处理方法postHandle");
    }
    //jsp页面执行后,该方法会执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("我是在jsp页面执行后执行的方法afterCompletion");
    }
}

3.2在springmvc.xml中配置拦截器

  <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/student/upload"/>
<!--                配置拦截器的-->
                <bean id="myIntercepter" class="com.coffee.intercepter.MyIntercepter"></bean>
            </mvc:interceptor>
        </mvc:interceptors>

3.3测试

package com.coffee.control;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

@Controller
@RequestMapping("student")
public class Control {
    @RequestMapping("upload")
    public String upload(MultipartFile file, Model model){

        String originalFilename = file.getOriginalFilename();
//        System.out.println("老名字为:"+originalFilename);
        originalFilename = UUID.randomUUID().toString().replace("-","")+originalFilename;
//        System.out.println("新名字为:"+originalFilename);
//        上传路径
        String path = "D:\\apache-tomcat-8.5.31\\webapps\\imgs\\";

        try {
//            上传
            file.transferTo(new File(path,originalFilename));
        } catch (IOException e) {
            e.printStackTrace();
        }
        model.addAttribute("originalFilename",originalFilename);
        return "/main.jsp";
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇智波波奶茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值