【SpringMVC】SpringMVC简单应用例子:文件的上传下载、拦截器

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>
posted @ 2020-09-08 20:50  JWnMing  阅读(150)  评论(0编辑  收藏  举报