SpringMVC 上传文件and过滤器
SpringMVC提供了一个MultipartResolver
接口用来实现文件上传,并使用Commons FileUpload技术实现了一个该接口的实现类CommonsMultipartResolver
。如果要在SpringMVC中实现文件上传功能,就可以在springmvc.xml中配置MultipartResolver
接口的实现类。
以下是使用SpringMVC实现文件上传的具体步骤:
①导入JAR
包:
使用SpringMVC实现文件上传,需要额外导入以下2个JAR
包:
commons-fileupload-1.2.1.jar | commons-io-2.0.jar |
②在SpringMVC配置文件中,配置MultipartResolver
接口的实现类
springmvc.xml
…
<bean id="multipartResolver"
class="org.springframework.web.multipart.
commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<property name="maxUploadSize" value="1024000"></property>
</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
@Controller
@RequestMapping(value = "/SecondSpringDemo")
public class SecondSpringDemo
{
@RequestMapping("/testFileUpload")
public String testFileUpload(@RequestParam("desc") String desc, @RequestParam("file") MultipartFile file)
throws IOException
{
String fileName = file.getOriginalFilename();
System.out.println("desc: " + desc);
System.out.println("OriginalFilename: " + fileName);
System.out.println("InputStream: "
+ file.getInputStream());
InputStream input = file.getInputStream();
System.out.println("D:"+File.separator+fileName);
OutputStream out
= new FileOutputStream("D:"+File.separator+fileName);
byte[] b = new byte[1024];
while ((input.read(b)) != -1)
{
out.write(b);
}
input.close();
out.close();
return "success";
}
}
通过参数@RequestParam("file") MultipartFile file
获取到前端传来的File
对象,并通过file.getInputStream()
得到File
对象的输入流,之后再通过输出流将文件写入到D盘,即实现文件上传功能。
④测试
index.jsp
<form action="SecondSpringDemo/testFileUpload"
method="POST" enctype="multipart/form-data">
文件: <input type="file" name="file"/>
描述: <input type="text" name="desc"/>
<input type="submit" value="Submit"/>
</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
//import…
public class FirstInterceptor implements HandlerInterceptor
{
// 拦截客户端发出的请求
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
System.out.println("第一个拦截器的preHandle()方法...");
return true;// 将请求放行
}
// 用于拦截服务器发出的响应
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception
{
System.out.println("第一个拦截器的postHandle()方法...");
}
// 视图渲染完毕之后被调用
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception
{
System.out.println("第一个拦截器的afterCompletion()方法...");
}
}
②配置拦截器
将写好的拦截器配置到SpringMVC配置文件之中:
springmvc.xml
…
<mvc:interceptors>
<!-- 配置自定义的拦截器 -->
<bean class="org.lanqiao.interceptor.FirstInterceptor">
</bean>
</mvc:interceptors>
③测试
默认的拦截器会拦截所有向服务器发送的请求,如下:
请求处理类:SecondSpringDemo.java
…
@Controller
@RequestMapping(value = "/SecondSpringDemo")
public class SecondSpringDemo
{
…
@RequestMapping("/testInterceptor")
public String testInterceptor()
{
System.out.println("请求处理方法...");
return "success";
}
}
index.jsp
<a href="SecondSpringDemo/testInterceptor">testInterceptor</a>
执行index.jsp中的超链接,控制台的运行结果:
图32-02
32.2.3 拦截器的拦截配置
以上方法实现的拦截器会拦截所有请求,此外我们还可以通过配置,使得拦截器只拦截或不拦截某些特定请求。为此,只需要将SpringMVC中对拦截器的配置修改如下:
springmvc.xml
…
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截的请求路径 -->
<mvc:mapping path="/**"/>
<!-- 不拦截的请求路径 -->
<mvc:exclude-mapping
path="/SecondSpringDemo/testFileUpload"/>
<bean lass=" org.lanqiao.interceptor.FirstInterceptor ">
</bean>
</mvc:interceptor>
</mvc:interceptors>
<mvc:interceptor>
子元素的简介如下:
元素 | 简介 |
<mvc:mapping path=""/> | 配置会被拦截器拦截的请求路径。 |
<mvc:exclude-mapping path=""/> | 配置不会被拦截器拦截的请求路径。 |
最终拦截的请求路径是mapping
与exclude-mapping
的交集。例如,上述springmvc.xml中配置的FirstInterceptor
拦截器:会拦截除了请求路径是/SecondSpringDemo
/testFileUpload
以外的所有请求。
本例中只涉及到了一个拦截器,如果配置了多个拦截器,则多个拦截器拦截请求/响应的顺序与使用多个过滤器拦截请求/响应的顺序是完全相同的,读者可以参见“过滤器与监听器”一节。
SpringMVC 上传文件and过滤器的更多相关文章
- springmvc上传文件,抄别人的
SpringMVC中的文件上传 分类: SpringMVC 2012-05-17 12:55 26426人阅读 评论(13) 收藏 举报 stringuserinputclassencoding 这是 ...
- 2. SpringMVC 上传文件操作
1.创建java web项目:SpringMVCUploadDownFile 2.在项目的WebRoot下的WEB-INF的lib包下添加如下jar文件 com.springsource.com.mc ...
- 使用springMVC上传文件
control层实现功能: @RequestMapping(value="upload2") public String upLoad2(HttpServletRequest re ...
- SpringMVC上传文件(图片)并保存到本地
SpringMVC上传文件(图片)并保存到本地 小记一波~ 基本的MVC配置就不展示了,这里给出核心代码 在spring-mvc的配置文件中写入如下配置 <bean id="multi ...
- SpringMVC上传文件总结
如果是maven项目 需要在pom.xml文件里面引入下面两个jar包 <dependency> <groupId>commons-fileupload</groupId ...
- SpringMVC 上传文件 MultipartFile 转为 File
在使用 SpringMVC 上传文件时,接收到的文件格式为 MultipartFile,但是在很多场景下使用都需要File格式的文件,记录下以便日后使用. 以下mFile为MultipartFile文 ...
- springmvc 上传文件时的错误
使用springmvc上传文件一直失败,文件参数一直为null, 原来是配置文件没写成功. <bean id="multipartResolver" class=" ...
- SpringMVC上传文件的三种方式(转)
直接上代码吧,大伙一看便知 这时:commonsmultipartresolver 的源码,可以研究一下 http://www.verysource.com/code/2337329_1/common ...
- SpringMVC上传文件的三种方式
直接上代码吧,大伙一看便知 这时:commonsmultipartresolver 的源码,可以研究一下 http://www.verysource.com/code/2337329_1/common ...
随机推荐
- Django之XSS攻击
一.什么是XSS攻击 xss攻击:----->web注入 xss跨站脚本攻击(Cross site script,简称xss)是一种“HTML注入”,由于攻击的脚本多数时候是跨域的,所以称 ...
- c++ 中的符号与关键字
符号按照符号的ASC码数值从小到达排列,关键字按照英文字母排序. & [38] 位运算:取地址:左值引用[指针.引用都是可以做类型转换的] #include <iostream> ...
- UI设计是青春饭?今天告诉你真相!
最近有学员来问,“我想转行学习UI设计,但是听很多人说,UI设计是吃青春饭的,互联网公司是不是只选择年轻的血液而淘汰年纪大的?”今天,我来统一回答一下. UI设计是不是青春饭? 我们先来思考一个问题: ...
- 如何处理好前后端分离的 API 问题(转载自知乎)
9 个月前 API 都搞不好,还怎么当程序员?如果 API 设计只是后台的活,为什么还需要前端工程师. 作为一个程序员,我讨厌那些没有文档的库.我们就好像在操纵一个黑盒一样,预期不了它的正常行为是什么 ...
- Reactor 模型(一)基本并发编程模型
Reactor 模型(一)基本并发编程模型 Netty 系列目录 (https://www.cnblogs.com/binarylei/p/10117436.html) 在讲解 Reactor 线程模 ...
- 内建类型,与用户自定义类型,返回值为const
1对内建类型来说,按值返回的是否为const,是无关紧要的,因为编译器已经不让它成为一个坐直,因为它总是一个值,而不是一个变量(thing in c++ page192) 2当处理用户自定义的类型时, ...
- 2018.10.02 NOIP模拟 序列维护(线段树+广义欧拉定理)
传送门 一道比较好的线段树. 考试时线性筛打错了于是弃疗. 60分暴力中有20分的快速幂乘爆了于是最后40分滚粗. 正解并不难想. 每次区间加打懒标记就行了. 区间查询要用到广义欧拉定理. 我们会发现 ...
- Mysql字符串字段判断是否包含某个字符串的3种方法[转载]
方法一: SELECT * FROM users WHERE emails like "%b@email.com%"; 方法二: 利用mysql字符串函数 find_in_set( ...
- Java IO之字符流
public static void main(String[] args) { FileWriter fw = null; try { fw = new FileWriter("/User ...
- UVa 1638 Pole Arrangement (递推或DP)
题意:有高为1,2,3...n的杆子各一根排成一行,从左边能看到L根,从右边能看到R根,求杆子的排列有多少种可能. 析:设d(i, j, k)表示高度为1-i的杆子排成一行,从左边看到j根,从右边看到 ...