SpringMVC

    xiaoxiao2021-04-11  42

    本文涉及的内容是关于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); } } }

    在upload.properties文件内写入文件存放的位置:

    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; } }

    在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="*" /> <!-- 配置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>

    转载请注明原文地址: https://ju.6miu.com/read-666822.html

    最新回复(0)