RedirectAttributes,@RequestBody,@RequestBody,基于Servlet3.0标准规范的Multipart文件上传和下载的开发步骤

1.RedirectAttributes的用途:

重定向参数,作为处理器方法参数使用(SpringMVC会自动将该接口实现类注入),使用addFlashAttribute(Key,Value)方法将数据存储至flash(闪存)中
在进行重定向操作时,DispatcherServlet将flash(闪存)的数据保存在request中(一份完整数据和该数据K/V键值对的子集,Key值以方法中Key命名),
该数据仅限于一次请求,二次失效

2.@RequestBody

方法级别
跳过View层响应,将返回结果以Json格式显示在浏览器页面,当数据类型不是String类型时,需要使用Convert转换器来进行转换(建议使用JACKSON)

3.@ResponseBody:

方法参数级别
将传入Json数据转换为对应的对象,只能指定一个参数作为存储,当方法返回含有中文时,需要让@RequestMapping(produces=“text/html;charset=utf-8”)提前设置响应字符编码集

4.基于Servlet3.0标准规范的Multipart文件上传和下载的开发步骤

前提条件(请求方式method=“post”,enctype=“multipart/form-data”,表单文件选项需要有name属性)

配置:
1.容器启动时,设置文件上传参数(重写customizeRegistration()方法),注册MultipartConfigElement对象,有参构造参数(“F:/test/temp”, 102410242, 102410244, 2)
参数:1.目录(必须存在,可以用监听器加载)
2.文件大小
3.获取表单请求的最大大小
4.文件写入磁盘的大小)

	//容器启动时,设置文件上传参数
	@Override
	protected void customizeRegistration(Dynamic registration) {
		//目录必须存在,可以使用监听器进行加载
		MultipartConfigElement config = new MultipartConfigElement("F:/test/temp", 1024*1024*2, 1024*1024*4, 2);
		
		registration.setMultipartConfig(config);

	}

2.创建Multipart解析器Bean(Bean的名称固定,必须为multipartResolver),Bean为MultipartResolver的实现类(CommonsMultipartResolver,StandardServletMultipartResolver(推荐))

	//创建Multipart解析器Bean
	//Bean的名称固定 必须为:multipartResolver
	@Bean
	public MultipartResolver multipartResolver() {
		return new StandardServletMultipartResolver();
	}

文件上传:
使用MultipartFile对象获取文件对象(上传文件被Multpart解析器处理为Multipart文件对象),使用transferTo()方法将文件保存在目录下。

public void UploadFile(String title,String desc,@RequestPart MultipartFile myfile) {
		//普通表单类型直接注入即可
		System.out.println("title = " + title);
		System.out.println("desc = " + desc);
		
		//上传文件被Multipart解析器处理成MultipartFile文件对象,并注入
		
		System.out.println("表单元素名称: "+ myfile.getName());
		System.out.println("上传文件内容类型: " + myfile.getContentType());
		System.out.println("文件原始名称: " + myfile.getOriginalFilename());
		System.out.println("文件原始大小: " + myfile.getSize());
		
		
		try {
			myfile.transferTo(new File("F:/test/upload/"+myfile.getOriginalFilename()));
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

文件下载:
使用ResponseEntity类响应下载的文件(其中需要文件的流,响应头(HttpHeaders对象),HttpStatus(状态码))
方法参数作为文件名时,当传入参数不存在时,默认下载的文件是该路径,可以使用@RequestParam注解起别名使该参数必填

	public ResponseEntity<byte[]> downloadFile(@RequestParam(name = "name") String filename){
		String path = "F:/test/upload/"+filename;
		
		File file = new File(path);
		
		byte[] buff = null;
		try (InputStream in = new FileInputStream(file)) {
			buff = new byte[in.available()];
			in.read(buff);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		HttpHeaders hander = new HttpHeaders();
		hander.setContentDispositionFormData("attachment", filename);
		hander.setContentType(MediaType.APPLICATION_OCTET_STREAM);
		
		return new ResponseEntity<byte[]>(buff, hander, HttpStatus.OK);
	}

5.MyBatis的一级缓存和二级缓存有什么区别

首先,更新,插入,删除都会清除缓存
一级缓存:
存在于同一个SqlSession中,不同Session之间的缓存是隔离的
Mybatis会将执行的方法和参数通过算法生成缓存的键,将该键和对应的值存储在Map中,当下次查询时,若该键存在,则会取出该键对应的值并返回,不会访问数据库(提升查询速度)

二级缓存:
存在于一个namespace中(也可以说是存在于同一个SqlSessionFactory中),二级缓存清除策略(LRU:最近最少使用,FIFO:先进先出)

6.MyBatis的优势有哪些?
Mybatis是一个半自动化持久层框架,相比较传统的JDBC而言,它简化了JDBC的操作,可以减少代码冗余(不必配置大量的Sql代码),可以自动映射结果集,含有缓存机制(一级缓存和二级缓存),提高查询速度。

6.HandlerInterceptor的用法和用途

用法:
1.实现HandlerInterceptor接口,作为拦截器,拦截每一个Handler,重写preHandle(),postHandle(),afterCompletion()方法,对每一次请求的状态进行拦截
preHandle():在每一个Handler之前拦截,返回true(放行),false(拦截)
postHandle():在Handler执行后,响应视图前拦截
afterCompletion():响应视图后拦截

2…重写addInterceptors()方法并设置匹配规则

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new DeHandler())
				.addPathPatterns("")//设置匹配规则 (包含)
				.excludePathPatterns(""); // (不包含)
//		registry.addInterceptor(new DeHandlerT());
	}

以上就是今日分享的全部内容,如有疑问,欢迎讨论!

你可能感兴趣的:(学习心得,java,mybatis,缓存)