相关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>