5).SpringMVC应用:验证码、文件上传(音频等)/下载
(1)验证码
1) 作用: 防止机器人程序访问服务器(数据库大量连接消耗,导致数据库中大量无效数据),尽可能确保,访问数据的请求,是人为通过客户端发起
2) 生成验证码图片
① 利用hutool.jar:获得验证码对象[验证码图片,验证码码值]
LineCaptcha cap = CaptchaUtil.createLineCaptcha(长, 宽, 字符数, 干扰线个数);
① 将验证码图片写出到响应流流,响应到页面的img标签的src上
cap.write(OutputStream 指向输出位置);
② 获得验证码的值
String code = cap.getCode();
3) 展示一个验证码
<img src=”controller的路径.方法.do”/>
java代码:
@Controller
public class CaptchaController {
@RequestMapping("/captcha")
public void myCaptcha(HttpServletRequest request, HttpServletResponse response){
LineCaptcha captcha = CaptchaUtil.createLineCaptcha(200, 100, 1, 10);
try {
captcha.write(response.getOutputStream());//将图片文件写到响应流上
} catch (IOException e) { e.printStackTrace();}
request.getSession().setAttribute("verificationCode",captcha.getCode());
}
}
(2)文件上传
1) 核心思路:
① SpringMVC提供了MultipartFile对象接收文件
② SpringMVC使用CommonsMultipartResolver文件解析器,完成文件解析,转化MultipartFile对象
2) 准备工作(搭建环境)
① 导入文件上传相关的jar
commons-fileupload-1.3.jar
commons-io-2.2.jar
② 注册管理文件解析器对象 (mvc.xml)
<bean id="multipartResolver" class="xx.xx.xx.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000000"></property> ---文件上传的大小
</bean>
注意: 文件上传解析器在springmvc工厂内部的ID必须叫"multipartResolver"
③ SpringMVC内部使用文件解析器对象时,通过id获得对象
id="multipartResolver"(固定的id)
CommonsMultipartResolver resolver = ctx.getBean("multipartResolver");
3) SpringMVC的文件对象的方法
multipartFile.getOrignalFilename(); //获得文件名
multipartFile.transferTo(输出流); //将文件输出到流对应的位置
4) 接收上传的文件:实例代码
控制器层需要判断接受:用MultpartFile 接收(切记表单的name不能是对象的属性名)
try {
String realPath = session.getServletContext().getRealPath("/upload/img");
File file = new File(realPath);
if(!file.exists()){ //判断上传的文件夹是否存在
file.mkdirs(); //自动补全路径
}
String originalFilename = fileName.getOriginalFilename();
String name = new Date().getTime()+"_"+originalFilename;
fileName.transferTo(new File(realPath,name));
map.put("mess", "上传成功");
} catch (Exception e) {
e.printStackTrace();
map.put("mess", "上传失败");
}
音频上传:
(1)导入jar:jaudiotagger-2.0.3.jar
(2)代码处理:
File audioFile = new File(filePath); //通过音频路径读取
audioFile.getSize();//获取大小,单位字节(B),除以1024为KB
AudioFile read = AudioFileIO.read(audioFile);
AudioHeader audioHeader = read.getAudioHeader();
audioHeader.getTrackLength(); //获取时长,单位为秒(s)
(3)文件下载
页面:页面请求下载时可用window.location
java后台代码:文件拷贝的工具类:
Commons-IO包
FileUtils.copyFile(源文件File对象, 拷贝后的文件所对应的输出流);
编码:
6).SpringMVC应用:拦截器、全局异常
(1)拦截器
1)作用: 将控制器中存在重复代码,抽取拦截器去完成
权利:
① 在控制器访问之前执行一段代码
② 有权中断或者放行,请求到达Controller
③ 在控制器执行完毕之后,执行一段代码
2)SpringMVC拦截器的工作机制
3)开发步骤:
① 自定义拦截器:
public class Lanjieqi implements HandlerInterceptor{
方法1: 控制器之前执行
方法2: 控制器之后,跳转前
方法3: 跳转之后执行
}
② 将控制器管理拦截器 <bean>
③ 映射要拦截的路径 (mvc.cml)
<mapping path="被拦截的控制器的namespace/方法上RequestMapping"></mapping>
配置标签书写书序解读:
4)细节补充:
① postHandle方法中ModelAndView参数
作用: 操作作用域中的值:mav.addObejct();
设置修改跳转路径:mav.setViewName("xxx");
② 一次性拦截多个路径 (mvc.xml)
方式1:在一个拦截器标签内些多个mapping标签
<mvc:interceptors> <!-- 配置拦截器 -->
<mvc:interceptor> <!-- 配置多个拦截器 -->
<mvc:mapping path="/inter/test1.do"/> <!-- 拦截路径,放在该配置标签前面 -->
<mvc:mapping path="/inter/test2.do"/>
<bean class="com.baizhi.demo4.MyInterceptor1"></bean> <!-- 拦截器对象,放在最后面 -->
</mvc:interceptor>
</mvc:interceptors>
方式2:配置拦截路径的通配符
<mvc:mapping path="/inter/*"/>
③ 排除拦截路
<mvc:exclude-mapping path="不拦截的控制访问路径url-pattern">
(2)全局异常
概念:一个异常处理工具,对项目所有控制器发生异常,做统一处理
开发步骤:
① 书写一个异常处理的类:HandlerExceptionResolver
② 将全局异常处理类,交给springmvc工厂管理 (mvc.xml)
<bean class="全局异常处理全类名"> </bean>