SpringMVC 上传文件and过滤器

SpringMVC提供了一个MultipartResolver接口用来实现文件上传,并使用Commons FileUpload技术实现了一个该接口的实现类CommonsMultipartResolver。如果要在SpringMVC中实现文件上传功能,就可以在springmvc.xml中配置MultipartResolver接口的实现类。

以下是使用SpringMVC实现文件上传的具体步骤:

①导入JAR包:

使用SpringMVC实现文件上传,需要额外导入以下2个JAR包:

commons-fileupload-1.2.1.jarcommons-io-2.0.jar

②在SpringMVC配置文件中,配置MultipartResolver接口的实现类

springmvc.xml

复制
  1. <bean id="multipartResolver"
  2. class="org.springframework.web.multipart.
  3. commons.CommonsMultipartResolver">
  4. <property name="defaultEncoding" value="UTF-8"></property>
  5. <property name="maxUploadSize" value="1024000"></property>
  6. </bean>

需要注意,这个bean的id值必须是multipartResolver。DispatcherServlet在Web服务启动时,会自动查找id=”multipartResolver”的Bean,并对其进行解析。如果id值不是multipartResolver, DispatcherServlet就会忽略对此Bean的解析,也就无法加入SpringMVC对文件上传的支持。

CommonsMultipartResolver中属性的介绍如下:

属性简介
defaultEncoding指定解析request请求的编码格式。
uploadTempDir指定上传文件时的临时目录,默认是Servlet容器的临时目录。文件上传完毕时,临时目录中的临时文件会被自动清除。
maxUploadSize设置上传文件的最大值,单位是字节。默认是-1,表示无限制。
maxInMemorySize设置在文件上传时,允许写到内存中的最大值,单位是字节,默认是10240字节。

③编写请求处理方法,实现文件上传

请求处理类:SecondSpringDemo.java

复制
  1. @Controller
  2. @RequestMapping(value = "/SecondSpringDemo")
  3. public class SecondSpringDemo
  4. {
  5. @RequestMapping("/testFileUpload")
  6. public String testFileUpload(@RequestParam("desc") String desc, @RequestParam("file") MultipartFile file)
  7. throws IOException
  8. {
  9. String fileName = file.getOriginalFilename();
  10. System.out.println("desc: " + desc);
  11. System.out.println("OriginalFilename: " + fileName);
  12. System.out.println("InputStream: "
  13. + file.getInputStream());
  14. InputStream input = file.getInputStream();
  15. System.out.println("D:"+File.separator+fileName);
  16. OutputStream out
  17. = new FileOutputStream("D:"+File.separator+fileName);
  18. byte[] b = new byte[1024];
  19. while ((input.read(b)) != -1)
  20. {
  21. out.write(b);
  22. }
  23. input.close();
  24. out.close();
  25. return "success";
  26. }
  27. }

通过参数@RequestParam("file") MultipartFile file获取到前端传来的File对象,并通过file.getInputStream()得到File对象的输入流,之后再通过输出流将文件写入到D盘,即实现文件上传功能。

④测试

index.jsp

复制
  1. <form action="SecondSpringDemo/testFileUpload"
  2. method="POST" enctype="multipart/form-data">
  3. 文件: <input type="file" name="file"/>
  4. 描述: <input type="text" name="desc"/>
  5. <input type="submit" value="Submit"/>
  6. </form>

在JSP页面中使用文件上传时,除了文件的字段要使用type="file"外,还需要注意设置表单的提交方式以及编码类型,即method="POST" enctype="multipart/form-data"

32.2 拦截器

32.2.1 拦截器简介

拦截器的实现原理和过滤器相似,都可以对用户发出的请求或者对服务器做出的响应进行拦截。SpringMVC也提供了一个用于支持拦截器的HandlerInterceptor接口,此接口的实现类就是一个拦截器。

HandlerInterceptor接口包含了以下方法:

方法简介
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception用于拦截客户端发出的请求。此方法会在request请求到达服务器之前被调用,如果拦截处理后,需要将请求放行,则返回true;如果拦截处理后,需要结束请求(即让请求不再向服务器传递),则返回false。
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception用于拦截服务器发出的响应。此方法会在请求处理方法执行处理完request请求之后、服务器发出的response响应到达DispatcherServlet的渲染方法之前被调用,参见下图。
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception此方法会在DispatcherServlet将response响应的视图渲染完毕之后被调用,参见下图。

拦截器的执行流程如下:

图32-01

32.2.2 拦截器使用步骤

以下是在SpringMVC中创建并使用拦截器的具体步骤:

①创建自定义拦截器

创建一个类,并实现HandlerInterceptor接口,如下:

FirstInterceptor.java

复制
  1. //import…
  2. public class FirstInterceptor implements HandlerInterceptor
  3. {
  4. // 拦截客户端发出的请求
  5. @Override
  6. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
  7. {
  8. System.out.println("第一个拦截器的preHandle()方法...");
  9. return true;// 将请求放行
  10. }
  11. // 用于拦截服务器发出的响应
  12. @Override
  13. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
  14. ModelAndView modelAndView) throws Exception
  15. {
  16. System.out.println("第一个拦截器的postHandle()方法...");
  17. }
  18. // 视图渲染完毕之后被调用
  19. @Override
  20. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  21. throws Exception
  22. {
  23. System.out.println("第一个拦截器的afterCompletion()方法...");
  24. }
  25. }

②配置拦截器

将写好的拦截器配置到SpringMVC配置文件之中:

springmvc.xml

复制
  1. <mvc:interceptors>
  2. <!-- 配置自定义的拦截器 -->
  3. <bean class="org.lanqiao.interceptor.FirstInterceptor">
  4. </bean>
  5. </mvc:interceptors>

③测试

默认的拦截器会拦截所有向服务器发送的请求,如下:

请求处理类:SecondSpringDemo.java

复制
  1. @Controller
  2. @RequestMapping(value = "/SecondSpringDemo")
  3. public class SecondSpringDemo
  4. {
  5. @RequestMapping("/testInterceptor")
  6. public String testInterceptor()
  7. {
  8. System.out.println("请求处理方法...");
  9. return "success";
  10. }
  11. }

index.jsp

<a href="SecondSpringDemo/testInterceptor">testInterceptor</a>

执行index.jsp中的超链接,控制台的运行结果:

图32-02

32.2.3 拦截器的拦截配置

以上方法实现的拦截器会拦截所有请求,此外我们还可以通过配置,使得拦截器只拦截或不拦截某些特定请求。为此,只需要将SpringMVC中对拦截器的配置修改如下:

springmvc.xml

复制
  1. <mvc:interceptors>
  2. <mvc:interceptor>
  3. <!-- 拦截的请求路径 -->
  4. <mvc:mapping path="/**"/>
  5. <!-- 不拦截的请求路径 -->
  6. <mvc:exclude-mapping
  7. path="/SecondSpringDemo/testFileUpload"/>
  8. <bean lass=" org.lanqiao.interceptor.FirstInterceptor ">
  9. </bean>
  10. </mvc:interceptor>
  11. </mvc:interceptors>

<mvc:interceptor>子元素的简介如下:

元素简介
<mvc:mapping path=""/>配置会被拦截器拦截的请求路径。
<mvc:exclude-mapping path=""/>配置不会被拦截器拦截的请求路径。

最终拦截的请求路径是mappingexclude-mapping的交集。例如,上述springmvc.xml中配置的FirstInterceptor拦截器:会拦截除了请求路径是/SecondSpringDemo/testFileUpload以外的所有请求。

本例中只涉及到了一个拦截器,如果配置了多个拦截器,则多个拦截器拦截请求/响应的顺序与使用多个过滤器拦截请求/响应的顺序是完全相同的,读者可以参见“过滤器与监听器”一节。

转载于:https://www.cnblogs.com/gu-bin/p/10546837.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

guava 集合转换_Guava的Collections2:过滤和转换Java集合

guava 集合转换Groovy的便利之一是能够通过Groovy的闭包支持轻松地对集合执行过滤和转换操作。 Guava将对集合的过滤和转换引入标准Java&#xff0c;这是本文的主题。 Guava的Collections2类具有两个公共方法&#xff0c;这两个方法都是静态的。 方法filter&#xff08;Collec…

CRC校验算法的解析,暨对网上的CRC详解的补充

一、CRC的形象理解 本文面向对CRC校验有一定基础的读者&#xff0c;如果你不懂&#xff0c;请戳这里。维基百科还有图解版的。 在CRC的具体实现中&#xff0c;如果要计算CRC的数据很长&#xff0c;一般都会用到寄存器&#xff0c;用来保存当前的计算到的CRC&#xff0c;循环计算…

7.5 GRASP原则五:高内聚 High Cohesion

GRASP原则五&#xff1a;高内聚 High Cohesion   How to keep objects focused, understandable and manageable, and as a side effect support Low Coupling? 如何使对象功能专注、可理解、可管理&#xff0c;同时又支持 低耦合&#xff1f;5.1 GRASP rule 5&#xff1…

资源泄漏:救援的命令模式

多年来&#xff0c; 使用Plumbr进行性能监视时&#xff0c;我遇到了数百个资源泄漏引起的性能问题。 在这篇文章中&#xff0c;我想描述一种最简单的方法来清理资源并避免该问题。 首先&#xff0c;我以电影播放器​​应用程序为例来描述问题。 这种应用程序的主要功能自然是在…

Word文字的三种隐藏方法

在Word的使用过程中&#xff0c;有时候可能需要这么一种情况&#xff1a;一些文字或者段落我们暂时不需要&#xff0c;但又不知后期是否用到&#xff0c;其碍眼却又不能删除。这个时候&#xff0c;最好的方法就是暂时隐藏文字或者段落。今天寻老师教大家三种隐藏Word文本的方法…

Video 对象方法 canPlayType()

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <p>我的浏览器可以播放 MP4 视频吗?<span> <button οnclick"supportType(e…

Linux下区分物理CPU、逻辑CPU和CPU核数

㈠ 概念 ① 物理CPU 实际Server中插槽上的CPU个数 物理cpu数量&#xff0c;可以数不重复的 physical id 有几个 ② 逻辑CPU Linux用户对 /proc/cpu…

java原子更新类_Java内部具有原子更新的动态热交换环境

java原子更新类有人可能会争辩说上述标题可以简称为OSGi &#xff0c;我想在一开始就放弃这种思考过程。 对于OSGi而言&#xff0c;这没有什么冒犯的&#xff0c;它是一个很棒的规范&#xff0c;在实现层或可用性层上都搞砸了&#xff0c;这就是我对OSGi的信念。 当然&#xf…

5个构建Spring Boot API的实用技巧

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 每个API开发人员都在寻找一种更安全…

C++项目目录组织结构

项目目录结构的问题基本上是个仁者见仁&#xff0c;智者见智的问题&#xff0c;只要自己用着顺手&#xff0c;使用什么样的目录组织结构是没有什么大碍的。当然如果项目很大&#xff0c;参与的人员很多&#xff0c;那么合理的组织一下目录结构还是会有很大的益处的。不同类型的…

火绒杀毒软件更安静

https://www.huorong.cn/转载于:https://www.cnblogs.com/Tom-yi/p/10554564.html

完全编译安装boost

文章目录 1. 安装依赖2. 编译安装 boost3. 环境变量配置 boost是C世界中相当优秀的第三方库&#xff0c;被选入STL的也有不少&#xff0c;其中用到的C奇技淫巧更是数不胜数。 安装依赖 boost 在类 Unix 系统上的安装&#xff0c;可以参考官方文档的 Get Started&#xff0c;除此…

c#Md5 32位加密结果少了两个0的原因

我们的&#xff1a; e1adc3949ba59abbe56e57f20f883e 第三方的&#xff1a;e10adc3949ba59abbe56e057f20f883e 原因: 这个是很常见的错误&#xff0c;你字节转换成字符串的时候要保证是2位宽度啊&#xff0c;某个字节为0转换成字符串的时候必须是00的&#xff0c;否则就会丢失…

lambdas for_Wordcounter,使用Lambdas和Fork / Join计算Java中的单词数

lambdas for这些天来&#xff0c;我发布了Wordcounter &#xff0c;这是一个Java库和命令行实用程序&#xff0c;用于对文本文件中的单词进行计数并对单词计数进行分析&#xff0c;从而大量使用了功能编程结构和并行计算方法。 这是我在“令人讨厌的快速问答”大赛第四个条目SA…

Bitmap Font生成

工具&#xff1a;AngelCode 的 Bitmap Font Generator。把需要用到的文字写到一个txt&#xff0c;注意编码为Unicode。接着&#xff0c;在工具里 Edit->select chars from file选择刚才新建的txt文件。然后。。。之后的没啥细节&#xff0c;随意搞吧。转载于:https://www.cn…

分隔和截断字符串, boost string algorithm library中的split和trim

http://www.boost.org/doc/libs/1_46_1/doc/html/string_algo.html 这个库是个 headers only library  这个库提供了STL没有提供的 string-related算法, 但是实现做到了可以用在任何 character 的 container上 split 在写在线状态的改造时候要把一个字符串中描述的几种类型拆…

使用Spring Integration重试RabbitMQ

我最近阅读了有关使用RabbitMQ重试的方法 在这里&#xff0c;并想尝试类似的方法 Spring Integration &#xff0c;提供了一组很棒的集成抽象。 TL; DR解决的问题是重试一次消息&#xff08;在处理失败的情况下&#xff09;&#xff0c;两次重试之间有较大的延迟&#xff08…

Vue_(Router路由)-vue-router路由的基本用法

vue-router官网&#xff1a;传送门 vue-router起步&#xff1a;传送门 vue-router路由&#xff1a;Vue.js官网推出的路由管理器&#xff0c;方便的构建单页应用 单页应用&#xff1a;Single Page Application简称SPA&#xff0c;只有一个web页面的应用&#xff0c;用户与应用交…

利用boost做string到wstring转换,以及字符集转换

#include <boost/locale.hpp> int _tmain(int argc, _TCHAR* argv[]) {//std::locale::global(std::locale("utf-8"));std::locale::global(std::locale("")); // 设置全局的C运行库locale 可以针对cout fstream等单独设置 空表示默认使用当前系统…

P4198 楼房重建

[Luogu4198] 原题解 19.3.21 用线段树维护有关单调栈的问题 不要pushdown , 但是pushup的时候需要特别注意. 19.3.31 这里的\(pushup2\)其实就是几个特判 : 没有 , 直接返回当前区间答案 , 区间长度为\(1\) , 以及剩下两大类 , 这里有一个模板 : if(mx[ls]<tmp) return push…