开发环境:
eclipse Mars.1
JDK 1.7.0_71
Apache Tomcat v7.0.69
需要脚本:
jquery.min.js
jquery.form.min.js
需要jar包:
commons-fileupload-1.2.2.jar
commons-io-2.4.jar
commons-logging-1.0.4.jar
jackson-annotations-2.2.3.jar
jackson-core-2.2.3.jar
jackson-databind-2.2.3.jar
spring-beans-3.2.9.RELEASE.jar
spring-context-3.2.9.RELEASE.jar
spring-core-3.2.9.RELEASE.jar
spring-expression-3.2.9.RELEASE.jar
spring-web-3.2.9.RELEASE.jar
spring-webmvc-3.2.9.RELEASE.jar
图片:
注释:
我这里使用的是spring3.2.9版本的jar包,所有这里不需要导入spring-aop-3.2.9.jar的包.
而如果使用spring4.*版本的jar包,就要导入spring-aop-4.*jar
否则会报错:
Loading XML bean definitions from class path resource [applicationContext.xml]Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [applicationContext.xml]; nested exception is java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource
说明:
在使用spring 组件扫描:</context:component-scan>时,需要使用AOP功能。
在spring3.2.9的jar包中的spring-context-3.2.9.RELEASE.jar,使用到了AOP的类
而在spring 4.0之后,把注解扫描使用的AOP类单独放在spring-aop-*.jar中了
所以,如果宝宝们使用的是4.0之后的spring包,需要另外导入spring-aop-*.jar包昂!
下面开始粘代码了:
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
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_2_5.xsd">
<!-- spring -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
<!-- 这里我把spring、springMVC的配置文件写在一个xml中了 -->
</context-param>
<!-- springmvc -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
<!-- 配置的springMVC的拦截路径,只要符合这样的路径,就会交给springMVC处理。。 -->
</servlet-mapping>
<!-- encoding 过滤编码集-->
<filter>
<filter-name>encoding</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>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
applicationContext.xml:
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- 注解的组件扫描,可以扫描的注解。前面也说了,spring的组件扫描需要AOP功能啊 -->
<context:component-scan base-package="com.upload.controller" />
<!-- <mvc:annotation-driven />
会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter
两个bean,是spring MVC为@Controllers分发请求所必须的。 -->
<mvc:annotation-driven />
<!-- 配置上传的解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
<property name="defaultEncoding" value="utf-8" />
<property name="maxUploadSize" value="104857600" />
<property name="maxInMemorySize" value="4096" />
</bean>
</beans>
文件上传的前台jsp页面:
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>upload</title>
<script type="text/javascript" src="static/jquery.min.js"></script>
<script type="text/javascript" src="static/jquery.form.min.js"></script>
<script type="text/javascript">
$(function(){ //使用文档加载函数
$("#submit").bind("click",function(){ //给提交按钮绑定点击事件
$("#upload-form").ajaxSubmit({ //重点:使用ajaxSubmit()提交表单。
url:"${pageContext.request.contextPath}/myupload.action",
type:"post", //提交的类型必需是post,
dateType:"json",
success:function(data){
alert(data); //如果提交成果就会打印true
},
error:function(data){
alert("error:"+data);
}
});
})
})
</script>
</head>
<body style="text-align: center;">
<form id="upload-form" method="post" enctype="multipart/form-data">
<!-- enctype必需是"multipart/form-data"-->
文件名:<input type="text" name="filename" /><br><br>
选择文件:<input type="file" name="multipartFile"/><br><br>
<!-- 文件域的name必需和controller中的MultipartFile multipartFile对象名一样-->
<input type="button" value="提交" id="submit">
</form>
</body>
</html>
Controller:
控制器中的upload()方法形参MultipartFile multipartFile的对象名必需和jsp页面的文件域的name值。
这里我把文件上传的路径放在WebContext/uploadDir文件夹下。别忘记在根目录下创建uploadDir文件夹哦。。
package com.upload.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
@Controller
public class UploadController {
@RequestMapping("myupload.action") //jsp提交到这个路径。
@ResponseBody
public Boolean upload(MultipartFile multipartFile, String filename, HttpServletRequest request) {
boolean flag = false;
FileOutputStream outputStream = null;
try {
if (multipartFile != null && !multipartFile.isEmpty()) {
String parentPath = request.getServletContext().getRealPath("uploadDir");
String originalFilename = multipartFile.getOriginalFilename(); //文件全名
File targetFile = new File(parentPath, UUID.randomUUID() + "_" + originalFilename); //UUID只是为了唯一文件名
if (!targetFile.exists()) { //如果targetFile的父文件夹不存在,就创建
targetFile.mkdirs();
}
multipartFile.transferTo(targetFile); // spring提供的文件上传方法。
}
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
}
这里再记录一下可能遇到的问题:
报错信息:
java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?
解决方法:
spring mvc中上传附件,需要做两步操作
1、引入包commons-fileupload-1.3.jar、commons-io-2.0.1.jar 版本号可以根据项目情况调整;
2、在spring mvc配置文件中增加配置,文件大小限制可根据项目情况调整:
<!-- 上传文件拦截,设置最大上传文件大小 10M=10*1024*1024(B)=10485760 bytes -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760" />
</bean>
报错信息:java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory
解决方法:
springmvc上传时,在applicationContext.xml中虽然引入了org.springframework.web.multipart.commons.CommonsMultipartResolver,
但这个类是依赖于 import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
所以要引入包commons-fileupload-1.3.jar、commons-io-2.0.1.jar 版本号可以根据项目情况调整;
报错信息:java.lang.ClassNotFoundException: org.apache.commons.io.output.DeferredFileOutputStream(导入commons-fileupload-1.3.jar后报错了。缺少commons-io-2.0.1.jar)
问题:
以上问题都解决后,上传文件,在controller中,方法正常执行,但是却走了前台ajaxSubmit()的error方法。
解决:没有导入Jackson相应jar包
总结:
springmvc+jquery.form.min.js+spring文件上传
需要脚本: jquery.min.js
jquery.form.min.js
需要jar包: commons-fileupload-1.2.2.jar
commons-io-2.4.jar
commons-logging-1.0.4.jar
jackson-annotations-2.2.3.jar
jackson-core-2.2.3.jar
jackson-databind-2.2.3.jar
spring-beans-3.2.9.RELEASE.jar
spring-context-3.2.9.RELEASE.jar
spring-core-3.2.9.RELEASE.jar
spring-expression-3.2.9.RELEASE.jar
spring-web-3.2.9.RELEASE.jar
spring-webmvc-3.2.9.RELEASE.jar
(spring 4.0之前版本不需要aop的包)
但是在百度知道上:Loading XML bean definitions from class path resource [applicationContext.xml]Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [applicationContext.xml]; nested exception is java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource
<context:component-scan base-package="com.cl.test">
</context:component-scan>
使用springmvc不一定要配置org.springframework.web.servlet.view.InternalResourceViewResolver
这个是对模型视图名称的解析,即在模型视图名称添加前后缀
spring的注解扫描功能是需要aop支持的。
说明:
在使用spring 组件扫描:</context:component-scan>时,需要使用AOP功能。
在spring3.2.9的jar包中的spring-context-3.2.9.RELEASE.jar,使用到了AOP的类
而在spring 4.0之后,把注解扫描使用的AOP类单独放在spring-aop-*.jar中了
所以,如果宝宝们使用的是4.0之后的spring包,需要另外导入spring-aop-*.jar包昂!
<context:component-scan base-package="com.upload"/> //需要spring-aop-*.jar
我在csdn上上传了我的demo源码。想了解的宝宝可以点击下载:
http://download.csdn.net/detail/qq_30136589/9513425