文件上传与拦截器

本文介绍了SpringMVC中文件上传和拦截器的使用。文件上传需导入JAR包、配置MultipartResolver接口实现类、编写请求处理方法并测试。拦截器实现原理与过滤器相似,使用时要创建自定义拦截器、进行配置和测试,还可配置拦截特定请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.文件上传

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

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

①导入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("/FileUploadDemo")
public class FileUploadDemo {
	@RequestMapping("/testFileUpload")
	public String testFileUpload(@RequestParam("desc") String desc,@RequestParam("file") MultipartFile file) throws IOException {
		String fileName = file.getOriginalFilename();
		System.out.println(fileName);
		System.out.println(desc);
		
		InputStream input = file.getInputStream();
		FileOutputStream output = new FileOutputStream("/Users/lee/"+fileName);
		byte[] b = new byte[1024];
		while((input.read(b))!=-1) {
			output.write(b);
		}
		output.close();
		input.close();
		return "success";
	}	
}

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

④测试

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"

2.拦截器

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响应的视图渲染完毕之后被调用

2.2 拦截器使用步骤

①创建自定义拦截器

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

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.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中的超链接,控制台的运行结果:
在这里插入图片描述

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以外的所有请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值