Java程序员必会 springmvc框架实现异常处理与文件上传
本次讲解Springmvc框架在ssm框架环境下进行开发时可能会使用到的一些功能。首先是springmvc的异常处理器组件。我们在dispatcherServlet的perproty中可以看得到dispatcherServlet内部的所有可以被我们改动的组件。
这里是dispatchServlet内部的小组件叫做HandlerExceptionResolver异常处理器,下面演示一下它捕获异常的功能。我们先手动创建一个异常
这里是一部分对验证码校验的代码,但是由于验证码我没写,所以此处必然发生异常,如果验证码==null,则创建一个运行时异常的实例,在括号内填写异常信息。然后我们通过springmvc提供的异常处理器对异常进行处理。
在这里我们自定义一个异常捕获器,它能够让我们自己决定该如何处理捕获到的异常。该类必须实现HandlerExceptionResolver接口,然后重写它的方法。方法里面有一个参数Exception ex就是捕获到的异常对象,通过ex.getMessage();方法能够取到刚才我们对自己创建的异常的异常信息,添加给modelAndView,返回给dispatcherServlet。然后我们在jsp页面中将该信息展示在某个位置。
该信息提示的异常都是从后端发过来的,我们在开发过程中对代码块进行异常捕获可以节省时间快速定位出现异常的代码。对了我们自定义的异常处理器一定要通过@conpoent注解或者
的形式注册到容器中。这样一来在springmvc捕获到异常时创建我们自定义的实现类来进行处理。那么我们实际开发中很多地方都要捕获异常,但是并不是对所有的异常的处理都是相同的,这时候怎么办呢?我们需要针对不同类型的异常进行不同的处理,这时候我们就不可以用RuntimeException了,我们自己创建一个异常类型。
假如说我就要对controller层中的异常进行页面展示处理,那我们就创建一个叫做ControllerException的异常,extends继承Exception即可。
图中的两个地方有改动,RuntimeException替换成了我们自己创建的异常,后面的异常信息也不需要this.getClass.getName();了,我们通过异常的名字就能快速定位异常发生区域。
在这里我们对异常的类型进行判断,如果ex是 ControllerException的实例,则进行下一步操作。如果ControllerException有自定义的方法或者属性,需要进行类型转换,从Exception转到ControllerException才可以使用子类独有的属性或方法。下面我们看一看spring提供的一个组件CommonsMultipartResolver,多段式数据类型解析器,它是做什么用的呢,他能够对request中的file类型参数进行解析。我们如果想要使用它的话同样需要在spring容器中对其进行注册。
这个类位于spring-web包里面的org.springframework.web.multipart.commons中,将它的全包名org.springframework.web.multipart.commons.CommonsMultipartResolver贴到
源码里说"maxUploadSize", "maxInMemorySize" and "defaultEncoding"最大上传大小,和最大内存空间和默认字符集可以被设置在bean的property里。maxUploadSize设置为-1时,表示不限大小。默认单位是字节,这个根据项目需求,某些网站在你上传图片时会提示你图片格式或者最大不超过5MB这种提示信息。
最大内存空间就是request在请求体中一次发送的子串总量,最大内存空间就是服务器分配给上传文件在内存中的空间,如果超过这个值,操作系统就会使用虚拟内存通过在硬盘上创建临时文件。从内存中读取速度要比硬盘上读取快很多,所以这个值设置为多少要见仁见智了,默认为10240个字节。默认字符集不说了,我们在过滤器里面已经指定的,没有的话就是IOS-8859-1。下面我们看jsp页面。
jsp的页面中form表单必须设置enctype="multipart/form-data"属性,enctype有几个属性:
application/x-(三个W)form-urlencoded :form表单中的数据被编译成键值对的形式对字符进行转码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值),也是enctype的默认属性。multipart/form-data :form表单数据被编译成一整串纯二进制数据,上传文件时必须使用这个格式。text/plain :空格转换为 "+" 加号,但不对特殊字符编码。
我们使用一个input标签就能完成文件上传了,注意这里的name必须与springmvc 的形参一致。下面我们看controller
这里采用MultipartFile类型接收jsp传过来的file类型参数,然后我们对上传进服务器的图片取名字,不能用他上传的图片名字,万一带有恶意sql数据库就崩了。这里才用uuid命名,也有才用时间戳命名的,或者hash256也可以,反正能保证不会重复就行。mf.getOriginalFilename()是文件全名名如asdadsjkgfa.jpg等。我们使用FilenameUtils.getExtension工具能够只截取文件扩展名,也可以使用String自己实现。处理后asdadsjkgfa.jpg就只剩下jpg了。FilenameUtils这个工具类需要用到两个jar包,commons-fileupload-1.3.1.jar和commons-io-2.2.jar都是Apache提供的。
拿到扩展名之后我们将mf.中的二进制数据编码然后他要求传入一个File对象,生成的文件就存在这个File对象里,File的构造方法要求传入绝对路径和文件名+"."+扩展名。我们将上面的String拼接起来即可,然后将图片信息存入Items 对象中存入数据库。
然后我们对tommcat添加映射路径。用户上传的图片不存在项目根目录了,而是存在我的D盘的safeDownLoad下,首先点击Eclipse下方的Servers,然后Modules,然后点AddExternal Web Model进行添加即可,点击下方的edit可以修改。documentBase就是硬盘中的路径,Path就是映射后的路径。
然后我们前台通过img的src属性访问图片。/safeDownLoad/是Tommcat映射的路径也就是D:safeDownLoad${item.pic}就是我们存入数据库的文件名+"."+拓展名,这样就能看到图片了。
这是我上传后的三张图,样式没有处理功能达到了就行。以上就是实现自定义异常处理器与文件上传的方法了,大家学会了吗,请在下方留言吧,如果有不明白的地方在评论区留下问题我会回复的!