• SpringMVC 上传文件and过滤器


    SpringMVC提供了一个MultipartResolver接口用来实现文件上传,并使用Commons FileUpload技术实现了一个该接口的实现类CommonsMultipartResolver。如果要在SpringMVC中实现文件上传功能,就可以在springmvc.xml中配置MultipartResolver接口的实现类。

    以下是使用SpringMVC实现文件上传的具体步骤:

    ①导入JAR包:

    使用SpringMVC实现文件上传,需要额外导入以下2个JAR包:

    commons-fileupload-1.2.1.jar commons-io-2.0.jar

    ②在SpringMVC配置文件中,配置MultipartResolver接口的实现类

    springmvc.xml

    复制
    1. <bean id="multipartResolver"
    2. class="org.springframework.web.multipart.
    3. commons.CommonsMultipartResolver">
    4. <property name="defaultEncoding" value="UTF-8"></property>
    5. <property name="maxUploadSize" value="1024000"></property>
    6. </bean>

    需要注意,这个bean的id值必须是multipartResolver。DispatcherServlet在Web服务启动时,会自动查找id=”multipartResolver”的Bean,并对其进行解析。如果id值不是multipartResolver, DispatcherServlet就会忽略对此Bean的解析,也就无法加入SpringMVC对文件上传的支持。

    CommonsMultipartResolver中属性的介绍如下:

    属性 简介
    defaultEncoding 指定解析request请求的编码格式。
    uploadTempDir 指定上传文件时的临时目录,默认是Servlet容器的临时目录。文件上传完毕时,临时目录中的临时文件会被自动清除。
    maxUploadSize 设置上传文件的最大值,单位是字节。默认是-1,表示无限制。
    maxInMemorySize 设置在文件上传时,允许写到内存中的最大值,单位是字节,默认是10240字节。

    ③编写请求处理方法,实现文件上传

    请求处理类:SecondSpringDemo.java

    复制
    1. @Controller
    2. @RequestMapping(value = "/SecondSpringDemo")
    3. public class SecondSpringDemo
    4. {
    5. @RequestMapping("/testFileUpload")
    6. public String testFileUpload(@RequestParam("desc") String desc, @RequestParam("file") MultipartFile file)
    7. throws IOException
    8. {
    9. String fileName = file.getOriginalFilename();
    10. System.out.println("desc: " + desc);
    11. System.out.println("OriginalFilename: " + fileName);
    12. System.out.println("InputStream: "
    13. + file.getInputStream());
    14. InputStream input = file.getInputStream();
    15. System.out.println("D:"+File.separator+fileName);
    16. OutputStream out
    17. = new FileOutputStream("D:"+File.separator+fileName);
    18. byte[] b = new byte[1024];
    19. while ((input.read(b)) != -1)
    20. {
    21. out.write(b);
    22. }
    23. input.close();
    24. out.close();
    25. return "success";
    26. }
    27. }

    通过参数@RequestParam("file") MultipartFile file获取到前端传来的File对象,并通过file.getInputStream()得到File对象的输入流,之后再通过输出流将文件写入到D盘,即实现文件上传功能。

    ④测试

    index.jsp

    复制
    1. <form action="SecondSpringDemo/testFileUpload"
    2. method="POST" enctype="multipart/form-data">
    3. 文件: <input type="file" name="file"/>
    4. 描述: <input type="text" name="desc"/>
    5. <input type="submit" value="Submit"/>
    6. </form>

    在JSP页面中使用文件上传时,除了文件的字段要使用type="file"外,还需要注意设置表单的提交方式以及编码类型,即method="POST" enctype="multipart/form-data"

    32.2 拦截器

    32.2.1 拦截器简介

    拦截器的实现原理和过滤器相似,都可以对用户发出的请求或者对服务器做出的响应进行拦截。SpringMVC也提供了一个用于支持拦截器的HandlerInterceptor接口,此接口的实现类就是一个拦截器。

    HandlerInterceptor接口包含了以下方法:

    方法 简介
    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception 用于拦截客户端发出的请求。此方法会在request请求到达服务器之前被调用,如果拦截处理后,需要将请求放行,则返回true;如果拦截处理后,需要结束请求(即让请求不再向服务器传递),则返回false。
    void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception 用于拦截服务器发出的响应。此方法会在请求处理方法执行处理完request请求之后、服务器发出的response响应到达DispatcherServlet的渲染方法之前被调用,参见下图。
    void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception 此方法会在DispatcherServlet将response响应的视图渲染完毕之后被调用,参见下图。

    拦截器的执行流程如下:

    图32-01

    32.2.2 拦截器使用步骤

    以下是在SpringMVC中创建并使用拦截器的具体步骤:

    ①创建自定义拦截器

    创建一个类,并实现HandlerInterceptor接口,如下:

    FirstInterceptor.java

    复制
    1. //import…
    2. public class FirstInterceptor implements HandlerInterceptor
    3. {
    4. // 拦截客户端发出的请求
    5. @Override
    6. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
    7. {
    8. System.out.println("第一个拦截器的preHandle()方法...");
    9. return true;// 将请求放行
    10. }
    11. // 用于拦截服务器发出的响应
    12. @Override
    13. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
    14. ModelAndView modelAndView) throws Exception
    15. {
    16. System.out.println("第一个拦截器的postHandle()方法...");
    17. }
    18. // 视图渲染完毕之后被调用
    19. @Override
    20. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    21. throws Exception
    22. {
    23. System.out.println("第一个拦截器的afterCompletion()方法...");
    24. }
    25. }

    ②配置拦截器

    将写好的拦截器配置到SpringMVC配置文件之中:

    springmvc.xml

    复制
    1. <mvc:interceptors>
    2. <!-- 配置自定义的拦截器 -->
    3. <bean class="org.lanqiao.interceptor.FirstInterceptor">
    4. </bean>
    5. </mvc:interceptors>

    ③测试

    默认的拦截器会拦截所有向服务器发送的请求,如下:

    请求处理类:SecondSpringDemo.java

    复制
    1. @Controller
    2. @RequestMapping(value = "/SecondSpringDemo")
    3. public class SecondSpringDemo
    4. {
    5. @RequestMapping("/testInterceptor")
    6. public String testInterceptor()
    7. {
    8. System.out.println("请求处理方法...");
    9. return "success";
    10. }
    11. }

    index.jsp

    <a href="SecondSpringDemo/testInterceptor">testInterceptor</a>

    执行index.jsp中的超链接,控制台的运行结果:

    图32-02

    32.2.3 拦截器的拦截配置

    以上方法实现的拦截器会拦截所有请求,此外我们还可以通过配置,使得拦截器只拦截或不拦截某些特定请求。为此,只需要将SpringMVC中对拦截器的配置修改如下:

    springmvc.xml

    复制
    1. <mvc:interceptors>
    2. <mvc:interceptor>
    3. <!-- 拦截的请求路径 -->
    4. <mvc:mapping path="/**"/>
    5. <!-- 不拦截的请求路径 -->
    6. <mvc:exclude-mapping
    7. path="/SecondSpringDemo/testFileUpload"/>
    8. <bean lass=" org.lanqiao.interceptor.FirstInterceptor ">
    9. </bean>
    10. </mvc:interceptor>
    11. </mvc:interceptors>

    <mvc:interceptor>子元素的简介如下:

    元素 简介
    <mvc:mapping path=""/> 配置会被拦截器拦截的请求路径。
    <mvc:exclude-mapping path=""/> 配置不会被拦截器拦截的请求路径。

    最终拦截的请求路径是mappingexclude-mapping的交集。例如,上述springmvc.xml中配置的FirstInterceptor拦截器:会拦截除了请求路径是/SecondSpringDemo/testFileUpload以外的所有请求。

    本例中只涉及到了一个拦截器,如果配置了多个拦截器,则多个拦截器拦截请求/响应的顺序与使用多个过滤器拦截请求/响应的顺序是完全相同的,读者可以参见“过滤器与监听器”一节。

  • 相关阅读:
    python socket实现文件传输(防粘包)
    python爬虫之路——模拟登陆简单使用post方法和cookie和selenium
    python爬虫之路——使用逆行工程抓取异步加载网页数据
    python爬虫之路——多进程爬虫和单进程爬虫的简单对比
    python爬虫之路——初识数据库存储
    python爬虫之路——初识lxml库和xpath语法
    爬取一本小说全文
    python爬虫之路——Python的re模块及其方法
    python爬虫之路——正则表达式初识
    案例-爬去南京地区短租房信息
  • 原文地址:https://www.cnblogs.com/gu-bin/p/10546837.html
Copyright © 2020-2023  润新知