相关jar包:
导入文件上传下载组件的jar包
commons-fileupload-1.3.jar
commons-io-2.4.jar
Spring MVC中使用JstlView时需要添加的包
jstl-1.1.2.jar
standard-1.1.2.jar
1.整体架构
2.web.xml文件配置DispatcherServlet拦截所有的请求
<servlet>
<servlet-name>chapter2</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/conf/chapter2-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>chapter2</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
DispatcherServlet默认会加载WEB-INF/[DispatcherServlet的servlet-name]-servlet.xml配置文件。
这里的[servlet-name]为chapter2,就一定要添加一个chapter2-servlet.xml文件
这里该文件不是在默认位置WEB-INF下,而是在WEB-INF/conf/下,就需要通过<init-param>指定其配置路径
contextConfigLocation
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/conf/chapter2-servlet.xml</param-value>
</init-param>
<load-on-startup>指定服务器启动时DispatcherServlet初始化的优先级,数字越小越优先初始化。
3.xxx-servlet.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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--
启动SpringMVC的注解功能,它会自动注册HandlerMapping、
HandlerAdapter、ExceptionResolver的相关实例
-->
<mvc:annotation-driven />
<mvc:default-servlet-handler />
<!-- DispatcherServlet会过滤所有的请求,这样请求静态资源时会出问题,加上该配置后,请求resources下面的静态资源时,url不会被过滤 -->
<mvc:resources mapping="/resources/**" location="/resources/" />
<!-- 扫描添加了@Controller等注解的类 -->
<context:component-scan base-package="cn.javass.chapter2.web.controller" />
<!--
ViewResolver 视图解析器,对处理器返回的ModelAndView进行解析,
返回到相应的视图页面, 以UploadController为例,上传成功后经过解析会
返回/WEB-INF/jsp/success.jsp视图页面
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 文件解析器 -->
<bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="10485760000"></property>
<property name="maxInMemorySize" value="40960"></property>
</bean>
</beans>
4.Controller控制器
package cn.javass.chapter2.web.controller;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
@Controller
@RequestMapping("/file")
public class UploadController {
@RequestMapping("/upload")
public String upload(@RequestParam CommonsMultipartFile file,
HttpServletRequest request) throws IllegalStateException,
IOException {
// isEmpty()返回上传的文件是否为空,有2种情况: 1、文件表单中是否选择了文件 2、选择的文件是否有内容
if (!file.isEmpty()) {
String fileName = file.getOriginalFilename();
fileName = new Date().getTime() + fileName;
System.out.println("文件名----------->" + fileName);
String extension = fileName
.substring(fileName.lastIndexOf(".") + 1);
if (extension != null
&& (extension.equalsIgnoreCase("xls") || extension
.equalsIgnoreCase("xlsx"))) {
final String TEMP_FILE_PATH = request.getServletContext()
.getRealPath("/WEB-INF/upload");
final String FILE_SEPARATOR = System.getProperties()
.getProperty("file.separator");
String filePath = TEMP_FILE_PATH + FILE_SEPARATOR + fileName;
File f = new File(filePath);
// 2种文件拷贝的方法
file.transferTo(f);
// FileUtils.copyInputStreamToFile(file.getInputStream(), f);
// 删除保存时间超过2天的临时文件
deleteTempFile(2, TEMP_FILE_PATH);
return "success";
} else {
System.out.println("文件格式不对,请上传xls或xlsx格式");
return "fail";
}
} else {
return "fail";
}
}
@RequestMapping("/toupload")
public String toUpload() {
return "upload";
}
/**
* 删除指定目录path下,文件存在时间超过指定day天数的文件
*
* @param day
* 所要清理的目标文件已经存在的天数
* @param path
* 所要清理文件的文件夹路径
*/
private void deleteTempFile(int day, String path) {
Date date;
Date dateNow;
Calendar cal = Calendar.getInstance();
Calendar calNow = Calendar.getInstance();
File filepath = new File(path);
File[] files;
if (filepath.exists()) {
if (filepath.isDirectory()) {
files = filepath.listFiles();
for (int i = 0; i < files.length; i++) {
date = new Date(files[i].lastModified());
dateNow = new Date();
cal.setTime(date);
calNow.setTime(dateNow);
int dec = calNow.get(Calendar.DAY_OF_YEAR)
- cal.get(Calendar.DAY_OF_YEAR);
// 删除指定日期的文件
if (dec >= day) {
files[i].delete();
}
}
}
}
}
}
@Controller 指定该类为控制器,可以拦截url请求,也可以直接使用HttpServletRequest/Response
@RequestMapping 的value指定请求映射的url
@RequestParam 可以取出请求时传输的参数
参数传递:
1.Controller获取请求url的参数:
①在方法中使用使用@RequestParam("paramName")
②在方法中使用与请求url中参数同名的形参
2.视图获取Controller传递的参数
①方法中使用一个Map<String, Object>的形参,参数名任意,比如名为map的形参,可以通过map.setAttribute(String key, Object value)设置参数,在视图层通过EL表达式${key}即可获取
②方法中使用一个Model(org.springframework.ui.Model)的形参,参数名任意,比如为model的形参,可以通过model.setAttribute(String key, Objcet value)设置参数,在视图层通过EL表达式${key}即可获取
③方法中使用一个Model的形参,参数名任意,比如为model的形参,可以通过model.setAttribute(Objcet value)设置参数,该方法是以value的数据类型作为key设置属性,比如value为String时,可通过${string}来获取;value为User时,可通过${user}来获取
④在方法中使用@ModelAttribute("user")User user,则的jsp视图层可通过添加
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
之后,使用form标签
<form:form modeAttribute="user" method="pose">
<!--这里是表单元素,提交后各个属性值会自动封装到user属性中,处理此表单的Controllerr的方法,就可以直接使用User user作为形参来获得提交的对象-->
</form:form>