SpringMVC笔记三

it2026-08-29  5

文章目录

一、文件上传1.传统文件上传2.SpringMVC文件上传 二、异常处理三、自定义拦截器

一、文件上传

文件上传页面要求:

请求方式必须是post必须配置enctype,且内容必须为multipart/form-datainput选择框type必须是file

页面案例:

<form action="upload2" method="post" enctype="multipart/form-data"> <input type="text" name="name"> <input type="file" name="upload"> <input type="submit" value="submit"> </form>

需要依赖:

<!-- common-io 这个不导入也可以,只是为了简便代码--> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.8.0</version> </dependency> <!--common file upload--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency>

1.传统文件上传

概述:

所谓的传统文件上传,就是是同commons下的fileupload来实现文件上传,但是这样的上传方式需要配置的东西比较多,而且代码比较繁琐,所以不建议使用;

使用案例:

@RequestMapping("/upload") public String upload(HttpServletRequest request) throws Exception { System.out.println("1111111"); //1.创建DiskFileItemFactory对象 DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); //2.使用DiskFileItemFactory对象创建ServletFileUpload ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory); //3.使用servlet file upload 对象解析请求 List<FileItem> fileItems = servletFileUpload.parseRequest(request); //4.遍历file item for (FileItem fileItem : fileItems) { //判断是否是想要上传的内容 if (!fileItem.isFormField()) { //是文件域,需要上传的文件 String fieldName = fileItem.getName(); //获得文件大小 long size = fileItem.getSize(); //产生一个随机字符串 String uuid = UUID.randomUUID().toString(); //截取文件类型后缀 String extension = FilenameUtils.getExtension(fieldName); String newFile = uuid + "." + extension; System.out.println(newFile); //创建要保存文件的地址 File file = new File("G:\\upload\\" + newFile); //把上传的内容保存到本地中 fileItem.write(file); //删除缓存 fileItem.delete(); } else { //不是文件域 //键,即表单的name String fieldName = fileItem.getFieldName(); //值 String context = fileItem.getString("utf-8"); System.out.println(fieldName + "===>" + context); } } //上传完成的页面 return "404"; }

2.SpringMVC文件上传

概述:

SpringMVC文件上传其实就是使用SpringMVC集成commons下fileupload包的组件实现文件上传功能,所以该导入的jar包不能少,但是可以使得实现代码更少,更简洁;

前提配置:即让SpringMVC帮我们封装传入的文件信息

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--配置上传文件最大大小,单位字节byte--> <property name="maxUploadSize" value="10240000"></property> </bean>

使用案例:

@RequestMapping("/upload2") public String upload2(HttpSession session, MultipartFile upload) throws Exception { //获得上下文域对象 ServletContext servletContext = session.getServletContext(); //获得部署后上传文件的路径 String path = servletContext.getRealPath("upload"); File uploadFile = new File(path); //如果路径不存在就创建该路径 if (!uploadFile.exists()) { uploadFile.mkdirs(); } //创建UUID String uuid = UUID.randomUUID().toString(); //获得文件拓展名 String extension = FilenameUtils.getExtension(upload.getOriginalFilename()); //拼接获得新文件名 String newFile = uuid + "." + extension; //拼接到要保存的地址 File file = new File(uploadFile, newFile); //写入到本地 upload.transferTo(file); return "index"; }

二、异常处理

概述:

​ 一般的异常处理,都是由我们手动去try-catch,而这样的方式在SpringMVC中有个很大的弊端就是需要编写很多try-catch,而且每个都需要我们自己去返回数据;

​ SpringMVC有一个异常处理器,在每次发生异常的时候会优先遍历这个处理器集合,如果这其中没有处理器可以处理,才会把结果返回给页面,而我们只需要编写自己的异常处理器,并把它添加到IOC容器中就好了;

自定义异常处理器:

//只需要把这个注解加上就可以了 @Component public class MyResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { //在这里编写处理异常的代码 ModelAndView modelAndView = new ModelAndView(); //一般我们会创建自己的异常,页面可以处理的异常由我们自己的异常封装 //所以这里检测是不是页面可以处理的异常 if (e instanceof MyException) { modelAndView.addObject("msg", e.getMessage()); modelAndView.setViewName("html/index"); } else { modelAndView.setViewName("404"); } //这里的返回值是modelandview对象,其实也就是你处理之后应该显示页面 return modelAndView; } }

三、自定义拦截器

概述:

SpringMVC中的拦截器其实和原生的过滤器差不多,而SpringMVC中的拦截器只能作用与处理器,也就是我们的后端控制器,或者说是处理请求的方法,而过滤器可以拦截所有;

自定义拦截器:

//只针对处理器有效,或控制器有效,对于静态资源没有效果 public class MyIntercepter implements HandlerInterceptor { //处理器方法执行之前执行,和Spring中的前置通知差不多 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("前置通知"); return true; } //处理器方法执行之后执行,但是如果出现异常则不会执行 //如果前置方法返回是false,那么也不会执行 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("后置通知"); } //控制器方法执行之后执行,即上面第一个方法执行之后 //如果控制器方法都没有执行的话,这个是不会执行的, @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("最终通知"); } }

配置拦截器到SpringMVC中:

<!--配置拦截器--> <mvc:interceptors> <!--配置某个拦截器--> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.ps.intercepter.MyIntercepter"></bean> </mvc:interceptor> </mvc:interceptors>

注意:

1.如果正常执行,拦截器的顺序是:preHandle=》目标方法=》postHandle=》afterCompletion

2.如果配置了多个拦截器,那么拦截器执行的顺序是根据SpringMVC配置文件中的配置顺序执行的

3.如果目标方法发生了异常那么 postHandle 方法不会执行

4.如果 preHandle 方法返回时false,那么后面的都不会执行

最新回复(0)