SpringMVC的文件上传下载,异常处理,拦截器的小总结
文件的上传和下载
我们通常在访问网页时会使用到文件的上传与下载的功能,那么他是如何实现的呢?
1 下载:
ResponseEntity :用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文
下载,就是从服务器下载一个服务器上的资源,(通过浏览器请求向服务器请求资源,如果服务器上有这个资源就响应给客户端也就是响应到客户端的浏览器)
下载文件的代码如下:
@Controller
public class FileUpAndDownController {
    @RequestMapping("/testDown")
    public ResponseEntity<byte[]> testDown(HttpSession session) {
        ServletContext servletContext = session.getServletContext();
        String realPath = servletContext.getRealPath("/static/img/girl.jpeg");
        InputStream is = null;
        ResponseEntity responseEntity = null;
        try {
            is = new FileInputStream(realPath);
            byte[] bytes = new byte[is.available()];
            is.read(bytes);
            MultiValueMap<String, String> headers = new HttpHeaders();
            headers.add("Content-Disposition", "attachment;filename=girl.jpeg");
            HttpStatus status = HttpStatus.OK;
            responseEntity = new ResponseEntity(bytes, headers, status);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                is.close();
                try {
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return responseEntity;
    }
}
其实搞懂ResponseEntity的作用,文件下载的问题也就迎刃而解了!
在上面的代码中
MultiValueMap<String, String> headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment;filename=girl.jpeg");
HttpStatus status = HttpStatus.OK;
responseEntity = new ResponseEntity(bytes, headers, status);
看懂上面部分代码!!!
还有获取文件的真实地址(通过ServletContext)也是需要注意的点!
文件的上传
配置文件上传的解析,首先需要明确文件的上传是需要通过post请求,
需要引入依赖 (在pom.xml中引入下面的依赖)
<!--        文件上传依赖-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
在springmvc配置文件中配置文件上传解析器:
<!--    配置文件上传解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
HTML的编写,首先需要明确上传数据是以form 表单,post请求的方式提交,核心的代码如下:
<form th:action="@{/testUp}" method="post" ``enctype``="multipart/form-data">
        文件上传:<input type="file" name="photo"/><br>
        <input type="submit" value="上传">
    </form>
小提示:
enctype:上传数据的编码类型,multipart/form-data 以字节流的方式上传
控制层代码:
import java.io.File;
import java.util.UUID;
class up {
  @RequestMapping(value = "/testUp", method = RequestMethod.POST)
  public String testUp(MultipartFile photo, HttpSession session) throws IOException {
    String originalFilename = photo.getOriginalFilename();//获取原先的文件名
    String suffixName = filename.substring(filename.lastIndexOf("."));
    String fileName = UUID.randomUUID().toString();
    ServletContext servletContext = session.getServletContext();
    String photoPath = servletContext.getRealPath("photoFolder");
    File file = new File(photoPath);
    if(!file.exists()){
        file.mkdir();
    }
    String path = photoPath + File.separator + suffixName;
    photo.transferTo(new File(path));
    return "nice";
  }
}
对上面代码的解读:
photo.getOriginalFilename();//获取原先的文件名
通过对上面的文件名进行字符串的处理,得到文件的后缀,为了防止多次上传时的覆盖问题,名字使用UUID的形式,在服务器的目录下创建一个
目录用于存放数据(没有则新建),然后通过将UUID和文件后缀的添加,在目录下放上传的数据
String path = photoPath + File.separator + suffixName;
photo.transferTo(new File(path));
异常处理
基于配置的异常处理
SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver
HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver
SpringMVC提供了自定义的异常处理器SimpleMappingExceptionResolver
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
        	<!--
        		properties的键表示处理器方法执行过程中出现的异常
        		properties的值表示若出现指定异常时,设置一个新的视图名称,跳转到指定页面
        	-->
            <prop key="java.lang.ArithmeticException">error</prop>
        </props>
    </property>
    <!--
    	exceptionAttribute属性设置一个属性名,将出现的异常信息在请求域中进行共享
    -->
    <property name="exceptionAttribute" value="exception"></property>
</bean>
基于注解的异常处理
//@ControllerAdvice将当前类标识为异常处理的组件
@ControllerAdvice
public class ExceptionController {
    //@ExceptionHandler用于设置所标识方法处理的异常
    @ExceptionHandler(ArithmeticException.class)
    //ex表示当前请求处理中出现的异常对象
    public String handleArithmeticException(Exception ex, Model model){
        model.addAttribute("ex", ex);
        return "error";
    }
}
注解配置SpringMVC
使用配置类和注解代替web.xml 和 SpringMVC配置文件的功能
WebInit 类继承 AbstractAnnotationConfigDispatcherServletInitializer 用于代替web.xml 初始化web工程
/**
 * 用于web工程的初始化,用于代替web.xml
 */
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
    /**
     * 指定Spring的配置类
     * @return
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }
    /**
     * 指定SpringMVC的配置类
     * @return
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }
    /**
     * 配置过滤器:
     * @return
     */
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceRequestEncoding(true);
        HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
        return new Filter[]{characterEncodingFilter,hiddenHttpMethodFilter};
    }
    /**
     * url-parent
     * @return
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}
SpringConfig 用于代替springmvc的配置
springmvc的配置文件所能提供的一些服务,我们只需在该配置类中实现这些功能即可!
1.扫描组件
2.视图解析器
3.视图控制view-controller
4.default-servlet-handler(静态资源处理)
5.mvc注解驱动
6.文件上传解析器
7.异常处理
8.拦截器
//用于代替springMVC 的配置文件
@Configuration//将当前类标识为配置类
@ComponentScan("com.kobedu.mvc.controller")//扫描组件
@EnableWebMvc//注解驱动
public class WebConfig {
    //配置生成模板解析器
    @Bean
    public ITemplateResolver templateResolver() {
        //ioc 容器在springmvc中的实现
        WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
        // ServletContextTemplateResolver需要一个ServletContext作为构造参数,可通过WebApplicationContext 的方法获得
        ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(
                webApplicationContext.getServletContext());
        templateResolver.setPrefix("/WEB-INF/templates/");
        templateResolver.setSuffix(".html");
        templateResolver.setCharacterEncoding("UTF-8");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        return templateResolver;
    }
    //生成模板引擎并为模板引擎注入模板解析器
    @Bean
    public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {//自动装配的方式进行赋值
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);
        return templateEngine;
    }
    //生成视图解析器并未解析器注入模板引擎
    @Bean
    public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setCharacterEncoding("UTF-8");
        viewResolver.setTemplateEngine(templateEngine);
        return viewResolver;
    }
}
上面的只是视图解析模块
接下来就是另外的一些功能
首先我们需要认识一些注解@Configuration 用来将当前的类标识为配置类
,@CommponentScan 用于扫描组件(这是springmvc的配置文件中一定不能少的)
@EnableWebMvc 启动mvc的注解驱动
//用于代替springMVC 的配置文件
//1.扫描组件   2.视图解析器    3.视图控制view-controller 4.default-servlet-handler(静态资源处理)  5.mvc注解驱动   6.文件上传解析器    7.异常处理   8.拦截器
@Configuration//将当前类标识为配置类
@ComponentScan("com.kobedu.mvc.controller")//扫描组件
@EnableWebMvc//注解驱动
public class WebConfig implements WebMvcConfigurer {
    //配置生成模板解析器
    @Bean
    public ITemplateResolver templateResolver() {
        //ioc 容器在springmvc中的实现
        WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
        // ServletContextTemplateResolver需要一个ServletContext作为构造参数,可通过WebApplicationContext 的方法获得
        ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(
                webApplicationContext.getServletContext());
        templateResolver.setPrefix("/WEB-INF/templates/");
        templateResolver.setSuffix(".html");
        templateResolver.setCharacterEncoding("UTF-8");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        return templateResolver;
    }
    //生成模板引擎并为模板引擎注入模板解析器
    @Bean
    public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {//自动装配的方式进行赋值
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);
        return templateEngine;
    }
    //生成视图解析器并未解析器注入模板引擎
    @Bean
    public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setCharacterEncoding("UTF-8");
        viewResolver.setTemplateEngine(templateEngine);
        return viewResolver;
    }
    //默认静态资源
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();//代表默认的servlet可用!
    }
    //拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**");//添加拦截器,且设定拦截规则!
    }
    // mvc 试图控制组件的测试
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/hello").setViewName("hello");
    }
    //文件上传解析器
    @Bean
    public MultipartResolver multipartResolver(){
        CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
        return commonsMultipartResolver;
    }
    //异常处理
    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();
        Properties prop = new Properties();//键值对
//        prop.put("")
        prop.setProperty("java.lang.ArithmeticException","error");
        simpleMappingExceptionResolver.setExceptionMappings(prop);//异常映射
        simpleMappingExceptionResolver.setExceptionAttribute("exception");//设置在请求域中共享异常信息的键
        resolvers.add(simpleMappingExceptionResolver);
    }
}
SpringMVC的文件上传下载,异常处理,拦截器的小总结的更多相关文章
- SpringBoot入门一:基础知识(环境搭建、注解说明、创建对象方法、注入方式、集成jsp/Thymeleaf、logback日志、全局热部署、文件上传/下载、拦截器、自动配置原理等)
		SpringBoot设计目的是用来简化Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,SpringBoot致力于在蓬勃发 ... 
- SpringMVC入门一:基础知识(依赖、注解、文件上传/下载、拦截器、异常处理等)
		为了使Spring可插入MVC架构,SpringFrameWork在Spring基础上开发SpringMVC框架,从而使用Spring进行WEB开发时可以选择使用Spring的SpringMVC框架作 ... 
- SpringMVC(四)SpringMVC实现文件上传、异常拦截去、整合SSM
		个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.文件上传 文件上传在SpringMVC中如何实现: 准备一个文件上传的表单 导入文件上传需要的jar ... 
- springMVC实现文件上传下载
		上传文件和下载文件是个常用的技能,在哪里开发几乎都能遇见,而所有的上传控件各不相同,插件很多,后台也有很多,这里我只尝试过这个方法觉的还够简洁.具体如下实现: 1.spring-mvc.xml配置 ... 
- SSM框架-SpringMVC 实例文件上传下载
		一.新建一个Web工程,导入相关的包 springmvc的包+commons-fileupload.jar+connom-io.jar+commons-logging,jar+jstl.jar+sta ... 
- 14.SpringMVC之文件上传下载
		SpringMVC通过MultipartResolver(多部件解析器)对象实现对文件上传的支持. MultipartResolver是一个接口对象,需要通过它的实现类CommonsMultipart ... 
- SpringMVC异步文件上传下载
		首先了解一下File的构造方法: File(String pathname):根据一个路径得到File对象 File(String parent,String child):根据一个目录和一个子文件/ ... 
- 深入分析JavaWeb Item47 -- Struts2拦截器与文件上传下载
		一.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 过滤器VS拦截器功能是一回事. 过滤器是Servlet规范中的技术,能够对请求和响应进行过滤. 拦截器是Struts2框架中的技术. ... 
- SpringMVC文件上传下载(单文件、多文件)
		前言 大家好,我是bigsai,今天我们学习Springmvc的文件上传下载. 文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一.你可能经常在网页上传下载文件,你可能 ... 
随机推荐
- Spring容器 从XML 文件中读取bean的定义,并实例化bean?
			解释Spring框架中bean的生命周期. Spring根据bean的定义填充所有的属性. 如果bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanN ... 
- 2020/12/28为止好用的PC下载工具
			IDM:http://www.internetdownloadmanager.com/ NDM(免费):http://www.neatdownloadmanager.com/index.php/en/ ... 
- 面试问题之数据结构与算法:B树、B+树、B*树
			一.B树 B树是一种多叉平衡查找树,由于是多叉结构,对于元素数量非常多的情况下,树的深度不会像二叉结构那么大,可以保证查询效率. 二.B+树 B+是是B树的一种变形, 1.特点: (1).所有叶子结点 ... 
- Java中如何声明方法?JavaScript中如何声明函数?
			public void method(){ } //实例方法 Function Declaration 可以定义命名的函数变量,而无需给变量赋值.Function Declaration 是一种独立的 ... 
- prometheus-存储
			采集到的样本以时间序列的方式保存在内存(TSDB 时序数据库)中,并定时保存到硬盘中 prometheus一般会保留15天 prometheus按照block块的方式来存储数据,每2小时为一个时间单位 ... 
- 什么是 Spring 的依赖注入?
			依赖注入,是 IOC 的一个方面,是个通常的概念,它有多种解释.这概念是说你 不用创建对象,而只需要描述它如何被创建.你不在代码里直接组装你的组件和 服务,但是要在配置文件里描述哪些组件需要哪些服务, ... 
- jsp:useBean报错The value for the useBean class attribute X is invalid
			一.解决方法 1.先检查<jsp:useBean id="dog" class="cn.edu.dgut.el.tools.Dog" scope=&quo ... 
- ACM中的位运算技巧
			听说位运算挺好玩的,那这节总结一下ACM中可能用到的位运算技巧. XOR运算极为重要!!(过[LC136](只出现一次的数字 - 力扣(LeetCode)):数组中每个数字都出现两次,只有一个出现一次 ... 
- 带你玩转prefetch, preload, dns-prefetch,defer和async
			现代浏览器性能优化-JS篇 众所周知,JS的加载和执行会阻塞浏览器渲染,所以目前业界普遍推荐把script放到</body>之前,以解决js执行时找不到dom等问题.但随着现代浏览器的普及 ... 
- 来扯点ionic3[3] 页面的生命周期事件,也就是凡间所说的钩子
			首先要做一个诚挚的道歉,作为大四狗,因为升学的事情,断更两个月,所以要感谢各位仁慈的读者没有脱粉(好像也就50个粉丝).这一节,我们延续上一节制作的页面,来讨论声明周期钩子的事情. 以我的经验来看,多 ... 
