SSM(4) SpringMVC

青春壹個敷衍的年華 提交于 2020-01-30 11:35:22

文件上传

Spring MVC 为文件上传提供了直接的支持,是通过即插即用的 MultipartResolver 实现的

MultipartResolver是一个接口

Spring MVC 上下文中默认没有装配 MultipartResovler,如果想使用 Spring 的文件上传功能,就必须得要自己下载相关jar包,自己到配置文件当中装配到springMVC当中。

  1. 导入jar包,网盘连接
  2. 在springmvc.xml中配置MultipartResolver
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
       <!--设置字符集编码-->
       <property name="defaultEncoding" value="UTF-8"/>
       <!--设置最大上传容量-->
       <property name="maxUploadSize" value="102400"/>
</bean>
  1. 实现上传代码
    先看form表单:
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">

  <input type="file" name="file">
  <input type="submit" value="提交">

</form>

控制器中的代码:

@RequestMapping("/upload")
 		     //使用@RequestParam("file"),里边填form表单中文件的name
public String upload(@RequestParam("file") CommonsMultipartFile file, HttpSession session) throws IOException {

    System.out.println("表单中name属性"+file.getName());
    System.out.println("文件大小"+file.getSize());
    System.out.println("文件类型"+file.getContentType());
    System.out.println("文件名"+file.getOriginalFilename());

    //获取文件
    ServletContext servletContext = session.getServletContext();
    String realPath = servletContext.getRealPath("/upload");
    //但是程序并不识别String类型的路径
    //变成程序当中的路径
    File upload = new File(realPath);
    //判断路径是否存在,如果路径不存在的话,就创建一个
    if(!upload.exists()){
        upload.mkdirs();
    }
    //获取最终的路径  /文件夹/文件名    工程名称/upload/图片.png
    String fileName = file.getOriginalFilename();
    upload = new File(upload + "/" + fileName);
    //进行文件的上传
    file.transferTo(upload);
    return "success";
}

文件下载

两个注意点:
1.传文件名的时候使用的rest风格,会丢失文件名的后缀,需要使用/download/{filename:.+}来接受完整的文件名
2.文件名中文无法读取,需要对文件名进行编码:
filename = URLEncoder.encode(“filename”,“UTF-8”)

                                            <%--使用rest风格传参--%>
<a href="${pageContext.request.contextPath}/download/a.jpg">图片.jpg下载</a>
@RequestMapping("download/{filename:.+}")
public ResponseEntity download(@PathVariable String filename,HttpSession session) throws Exception {
    System.out.println(filename);

    //获取ServletContext
    ServletContext servletContext = session.getServletContext();
    //获取路径
    String realPath = servletContext.getRealPath("/upload/"+filename);
    //创建一个输入流
    FileInputStream io = new FileInputStream(realPath);
    byte[] body = new byte[io.available()];
    //将文件流读取到数组中
    io.read(body);
    //创建请求头
    HttpHeaders httpHeaders = new HttpHeaders();
    //对文件名进行编码
    filename = URLEncoder.encode(filename, "UTF-8");

    //告诉浏览器以附件的形式下载文件
    httpHeaders.add("Content-Disposition","attachment;filename="+filename);

    //设置响应码
    ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(body, httpHeaders, HttpStatus.OK);

    return responseEntity;
}

拦截器

概述:Java 里的拦截器是动态拦截 action 调用的对象,可以Controller中的方法执行之前与执行之后, 及页面显示完毕后, 执行指定的方法。
自定义的拦截器必须实现HandlerInterceptor接口。

HandlerInterceptor接口的三个实现方法的调用时间:
1.preHandle():在业务处理器处理请求之前被调用
2.postHandle : 在业务处理器处理完请求后
3.afterCompletion: 在 DispatcherServlet 完全处理完请求后被调用

拦截器的使用:

  1. 创建一个类实现HanlderInterceptor接口,但是不会出现提示重写方法:
这是Java8的新特性——default方法/defender方法。HandlerInterceptorf接口的方法全部用default来修饰
public class MyFirstInterceptor implements HandlerInterceptor {
   @Override
//在执行处理器方法(@RequestMapping)之前
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler){
    System.out.println("在执行方法之前");
    return false;
}

@Override
//当处理器方法执行之后会自动调用
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView){
    System.out.println("在执行方法之前");
}

@Override
//请求处理完毕之后,会自动调用
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler,Exception ex){
    System.out.println("在执行方法之前");
}
}
  1. 在springmvc.xml中配置拦截器:

拦截所有的请求:

<mvc:interceptors>
    <!--自定义拦截器,拦截所有的请求-->
    <bean  class="com.itlike.web.interceptor.MyFirstInterceptor"/>
</mvc:interceptors>

拦截指定请求,path写需要拦截的请求,请求名称前要加上:

<mvc:interceptors>
	<mvc:interceptor>
   		 <mvc:mapping path="/local" />
   		 <bean class="com.itlike.web.interceptor.MyFirstInterceptor"/>
	</mvc:interceptor>
</mvc:interceptors>

设置哪些请求不拦截,其他的都拦截:

<mvc:interceptors>
	 <mvc:interceptor>
    		  <mvc:exclude-mapping path="/local" />
  	          <bean class="com.itlike.web.interceptor.MyFirstInterceptor"/>
	 </mvc:interceptor>
</mvc:interceptors>

SpringMVC完整执行流程(来自撩课)

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!