ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringMVC 文件上传 异常处理 拦截器

2022-07-10 19:06:39  阅读:144  来源: 互联网

标签:xml 拦截器 return SpringMVC new import 上传 public


Author:Exchanges

Version:9.0.2

目录

1.SpringMVC方式文件上传

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

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

<!-- spring-webmvc依赖中传递了spring的核心依赖 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.20</version>
</dependency>

<!-- tomcat中自带servlet和jsp的jar包,这里根据需求导入 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.3</version>
</dependency>

<!-- 文件上传 -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

</dependencies>

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">

        <!-- 配置spingmvc组件 -->
        <mvc:annotation-driven/>

        <!-- 扫描包下注解 -->
        <context:component-scan base-package="com.qf"></context:component-scan>

        <!-- 视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <!-- 设置前缀 -->
<!--                <property name="prefix" value="/WEB-INF/jsp"></property>-->
                <!-- 设置后缀 -->
<!--                <property name="suffix" value=".jsp"></property>-->
        </bean>

        <!-- 设置所有静态资源不被拦截 -->
        <mvc:default-servlet-handler/>

        <!-- 配置文件解析器对象,名称必须为 multipartResolver -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>

</beans>

1.3创建 upload.html 页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="user/upload" method="post" enctype="multipart/form-data">

    文件:<input type="file" name="picture"> <br>

    <input type="submit" value="上传">
</form>

</body>
</html>

1.4创建 UserController

package com.qf.controller;

import com.qf.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * @RestController = @Controller + @ResponseBody
 */
//@Controller
@RestController
@RequestMapping("user")
public class UserController {

    /**
     * 查询所有
     *
     * @return
     * @ResponseBody 返回 json 类型的数据
     */
    @RequestMapping("findAll")
    //@ResponseBody
    public List<User> findAll() {

        //模拟数据库查询出来的数据
        List<User> userList = new ArrayList<>();
        userList.add(new User(1001, "张三", "123", new Date()));
        userList.add(new User(1002, "李四", "456", new Date()));
        userList.add(new User(1003, "王五", "789", new Date()));

        return userList;
    }


    @RequestMapping("findById")
    //@ResponseBody
    public User findById(Integer id) {

        //模拟数据库查询出来的数据
        User db_user = new User(id, "杰克", "123", new Date());

        return db_user;
    }

    /**
     * 测试 @RequestBody
     *
     * @param user
     * @return
     */
    @RequestMapping("testRequestBody")
    //@ResponseBody
    public String testRequestBody(@RequestBody User user) {

        System.out.println("前端传过来的Json数据:" + user);

        return "success";
    }

    /**
     * MultipartFile 变量名要和表单中<input type="file" name="picture"> name属性的属性值一致
     *
     * @param picture
     * @return
     */
    @RequestMapping("upload")
    //@ResponseBody
    public String upload(MultipartFile picture) {
        //需要设置上传路径
        String uploadPath = "D:\\apache-tomcat-8.5.31\\webapps\\upload\\";

        //获取上传的文件名
        String filename = picture.getOriginalFilename();

        //如果图片名称是中文,需要进行字符集转换
        try {
            filename = new String(filename.getBytes("iso-8859-1"), "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        //保证上传文件名的唯一性
        String uploadFileName = UUID.randomUUID().toString()
                .replace("-","") + filename;

        //创建文件对象
        File file = new File(uploadPath, uploadFileName);

        try {
            //上传
            picture.transferTo(file);

        } catch (IOException e) {
            e.printStackTrace();
        }

        return "success";
    }
}

1.5配置 web.xml ,然后进行测试

访问:http://localhost:8080/upload.html

2.SpringMVC的异常处理

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

2.1创建自定义异常类

package com.qf.exception;

public class MyException extends RuntimeException {

    public MyException(String message) {
        super(message);
    }
}

2.2创建异常处理器类

package com.qf.exception;

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

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

//全局异常处理
public class MyExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(
            HttpServletRequest request,
            HttpServletResponse response,
            Object handler,
            Exception ex) {

        ModelAndView modelAndView = new ModelAndView();

        //判断异常
        if(ex instanceof NullPointerException){
            modelAndView.addObject("msg","空指针异常");
        }else if(ex instanceof MyException){
            modelAndView.addObject("msg",ex.getMessage());
        }else {
            modelAndView.addObject("msg",ex.getMessage());
        }

        //跳转页面
        modelAndView.setViewName("/WEB-INF/jsp/error.jsp");

        return modelAndView;
    }
}

2.3在springmvc.xml中配置

<!-- 配置全局的异常处理类 -->
<bean id="myExceptionResolver" class="com.qf.exception.MyExceptionResolver"></bean>

2.4error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
当前异常信息:${msg}
</body>
</html>

2.5测试

//测试异常方法
@RequestMapping("testException")
public void testException(){

    //String str = null;
    //str.length();

    int i = 1/0;

    //throw new MyException("测试自定义异常");
}

3.SpringMVC框架中的拦截器

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

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

过滤器 是基于函数回调的,拦截器 则是基于Java的反射机制(动态代理)实现的。

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

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

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

3.1创建自定义拦截器

public class MyInterceptor 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执行之前
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    //success.jsp页面执行后,该方法会执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

3.2在springmvc.xml中配置拦截器

<!-- 配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <!-- 指定拦截的路径 -->
        <mvc:mapping path="/**"/>
        <!-- <mvc:mapping path="/user/testInterceptor"/>-->

        <!-- 指定不拦截的路径 -->
        <!-- <mvc:mapping path="/user/*"/>-->
        <!-- <mvc:exclude-mapping path="/user/testInterceptor"/>-->

        <!-- 指定拦截器 -->
        <bean class="com.qf.interceptor.MyInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

3.3测试

//测试拦截器
@RequestMapping("testInterceptor")
public void testInterceptor(){
    System.out.println("testInterceptor");
}

@RequestMapping("testInterceptor2")
public void testInterceptor2(){
    System.out.println("testInterceptor2");
}

标签:xml,拦截器,return,SpringMVC,new,import,上传,public
来源: https://www.cnblogs.com/qtyanan/p/16463710.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有