本文涉及的内容是关于springmvc 上传文件以及intercepter拦截器的使用.
multipartResolver
springmvc使用multipartResolver来文件上传.在springmvc配置文件上加上以下内容:
<!--文件上传使用, 配置multipartResolver,id名为约定好的 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 配置文件(每次上传的所有文件总大小)大小,单位为b, 1024000表示1000kb -->
<property name="maxUploadSize" value="1024000" />
</bean>
<!--PropertiesFactoryBean对properties文件可用 ,可以用来注入properties配置文件的信息 -->
<bean id="uploadProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="classpath:upload.properties"></property>
</bean>
案例:
上传文件需要导入commons-fileupload-1.2.2.jar, commons-io-2.0.1.jar
创建一个表单Model:
package yzr.model;
import java.io.Serializable;
import java.util.Arrays;
import org.springframework.web.multipart.MultipartFile;
public class Customer implements Serializable {
/**
* generated serialVersionUID
*/
private static final long serialVersionUID = -4695849092692785616L;
private String name;
private MultipartFile[] files;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public MultipartFile[] getFiles() {
return files;
}
public void setFiles(MultipartFile[] files) {
this.files = files;
}
@Override
public String toString() {
return "Customer [name=" + name + ", files=" + Arrays.toString(files)
+ "]";
}
public Customer(){}
}
创建控制器Controller:
package yzr.controller;
import java.io.File;
import java.io.IOException;
import javax.annotation.Resource;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import yzr.model.Customer;
import yzr.util.FileUploadUtil;
@Controller
@RequestMapping("/customer")
public class CustomerController extends MultiActionController {
@Resource
ServletContext servletContext;
@Resource
private FileUploadUtil fileUploadUtils;
public CustomerController(){
System.out.println("CustomerController构造器被创建!");
}
@RequestMapping(value="/upload")
public String Index(Customer customer,HttpServletRequest request){
MultipartFile[] files=customer.getFiles();
for(MultipartFile file:files){
if(file.isEmpty()){
System.out.println("文件为空");
}else{
System.out.println("文件不为空!");
System.out.println("格式:" + file.getContentType());
System.out.println("原名:" + file.getOriginalFilename());
System.out.println("大小:" + file.getSize());
System.out.println("表单控件的名称" + file.getName());
try {
FileUtils.copyInputStreamToFile(file.getInputStream(), new File(servletContext.getRealPath("/")+"upload/"+file.getOriginalFilename()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("---调用业务逻辑进行业务处理---");
return "forward:/modules/Customer.jsp";
}
}
创建上传页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'upload.jsp' starting page</title>
</head>
<body>
<form action="customer/upload.action" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="name"><br/>
请选择文件:<br/><input type="file" name="files"><br/>
<input type="file" name="files"><br/>
<input type="submit" value="文件上传测试">
</form>
</body>
</html>
跳转页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'Customer.jsp' starting page</title>
</head>
<body>
${requestScope.customer}
</body>
</html>
完整的springmvc配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
">
<!-- 注解 -->
<mvc:annotation-driven></mvc:annotation-driven>
<context:component-scan base-package="*" />
<!--文件上传使用, 配置multipartResolver,id名为约定好的 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 配置文件(每次上传的所有文件总大小)大小,单位为b, 1024000表示1000kb -->
<property name="maxUploadSize" value="1024000" />
</bean>
<!--PropertiesFactoryBean对properties文件可用 ,可以用来注入properties配置文件的信息 -->
<bean id="uploadProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="classpath:upload.properties"></property>
</bean>
</beans>
为了解决中文乱码问题,在web.xml中添加springmvc过滤器:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<!-- 中文乱码问题 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
测试:
对上传上来的文件(重命名等)进行处理:
package yzr.util;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
@Component(value = "fileUploadUtils")
// 普通的bean注入
public class FileUploadUtil {
/*
* 注入字符串,#{}为spel语言,其中uploadProperties,是xml配置文件中注入properties文件的bean id,
* path为properties文件的其中一个key ,也可以通过下边的set方法注入
*/
@Value("#{uploadProperties.path}")
private String path;
// private String path="e:/testupload";
// path也可以通过set方法注入
// @Value("#{uploadProperties.path}")
// public void setPath(String path) {
// this.path = path;
// }
private String getExtName(MultipartFile file) {
return FilenameUtils.getExtension(file.getOriginalFilename());
}
private String createNewName(MultipartFile file) {
return UUID.randomUUID().toString() + "." + getExtName(file);
}
public String uploadFile(MultipartFile file) {
try {
String newName = createNewName(file);
FileUtils.copyInputStreamToFile(file.getInputStream(), new File(
path, newName));
return newName;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
path=c\:\\testdir\\upload\\
调用的时候使用:fileUploadUtils.uploadFile(file);即可.
springmvc拦截器:HandlerInterceptor
实现此接口:
package yzr.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyIntercepter implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("---访问请求资源后不管理有没有异常都一定执行此方法---");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
System.out.println("---访问请求资源后,如果没有异常,将执行此方法---");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
System.out.println("---访问请求资源前执行,如果此方法返回false,将不能访问请求资源---");
return true;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
">
<!-- 注解 -->
<mvc:annotation-driven></mvc:annotation-driven>
<context:component-scan base-package="*" />
<!-- 配置spring mvc拦截器 -->
<mvc:interceptors>
<!-- 默认拦截DispatcherServlet指定的后缀(这里是.action) -->
<bean class="yzr.interceptor.MyIntercepter">
</bean>
</mvc:interceptors>
<!--文件上传使用, 配置multipartResolver,id名为约定好的 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 配置文件(每次上传的所有文件总大小)大小,单位为b, 1024000表示1000kb -->
<property name="maxUploadSize" value="1024000" />
</bean>
<!--PropertiesFactoryBean对properties文件可用 ,可以用来注入properties配置文件的信息 -->
<bean id="uploadProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="classpath:upload.properties"></property>
</bean>
</beans>