Spring_Json和文件上传,下载,拦截器

这篇博客主要介绍了Spring中Json的使用,文件上传和下载的实现,以及重点讲解了拦截器的应用。在文件操作部分,利用Spring的IOUtils处理输入输出流完成上传和下载。拦截器部分,强调了创建拦截器类和XML配置的步骤,用于实现请求的权限控制。

Spring_Json和文件上传,下载,拦截器

第一部分:Json

Json语言,首先是理解它的用途,Json是一个轻量级的文本语言,提供给各个不同开发语言之间进行数据交换共享的 ;因为不同开发语言之间,不能直接通过数据交换,需要从中编译转化成为Json之后,才能被其他语言识别;

java --》 转换成为 Json ---- 》然后就可以被Python读取识别;反过来也是一样;

1 .使用Json 首先要导入Json依赖的jar包; 不需要配置其他配置文件;
2 .主要要学习的内容是,那些数据可以被Json 传递;
	2.1 : 基本数据类型, int stirng 
	2.2 : 数组 
	2.3 : 集合数据也可以传递
	2.4 : 对象可以传递;
3 . 在spring使用 Json的时候,只需要很简单的写一个注解: @RequestMapping("/form1") 映射管理器就能识别,这个文		本是 Json的数据,然后不经过视图解析器;
@Controller
@RequestMapping("/json")
public class ControllerJson {
	
	
	/**
	 * 
	 * @return	 对象
	 */
	@ResponseBody
	@RequestMapping("/form1")
	public User form1() {
		User user = new User("PP","你好",new Date());
		return user;
	}
	
	/**
	 * 
	 * @return	 字符串
	 */
	@ResponseBody
	@RequestMapping("/form2")
	public String form2() {
		
		return "你好java";
	}
	
	/**
	 * 
	 * @return	集合List
	 */
	@ResponseBody
	@RequestMapping("/form3")
	public List<User> form3() {
		/*List<User> list = Arrays.asList(
	               new User("四兽", "18"),
	               new User("四兽", "19"),
	               new User("四兽", "20")
	              );*/
		
		ArrayList<User> list = new ArrayList<User>();
		list.add(new User("P1","你好1",new Date()));
		list.add(new User("P2","你好2",new Date()));
		list.add(new User("P3","你好3",new Date()));
	
		return list;
	}
	
}

第二部分:文件上传

在spring的框架内,文件的上传和下载,都支持使用spring里面的工具类IOUtils ;工具类只需要输入流,和输出流2个参数;

1、首先准备一个请求的表单,文件上传需要post请求,提交文件的复杂表单,enctype="multipart/form-data">这个可以直接copy
2. 创建一个controller接收页面表单提交的请求,需要用到一个复杂表单对象,来接收请求里面的 file 文件对象 ;MultipartFile file

3. 第三部分就是代码部分:
	3.1 : 接收页面的文件对象file ,创建一个输入流对象;
	//输入流
		InputStream in = file.getInputStream();
		
	3.2: 准备工作,使用file对象,获取文件的原始的文件名字;
	3.3: 新建一个项目文件夹,用来放上传的文件,进行一个文件夹的判断,如果存在,直接保存,如果不存在,就创建,同时保存下来,文件夹路径 path ;
	3.4:创建一个输出流,将文件夹的路径,和文件的名字,作为参数,放进去;
	
4. 最后,直接使用spring提供的对象 ;IOutils.copy(in ,out);
5. 关闭流;

结束!
@RequestMapping("/fileup")
	public void FileUp(HttpServletRequest request,String username ,MultipartFile file) throws IOException{
		System.out.println(username);
		//输入流
		InputStream in = file.getInputStream();//将文件读取到内存里面;
		String name = file.getOriginalFilename();//得到原始的文件名
		System.out.println();
		String RealPath = request.getServletContext().getRealPath("/img");
		
		java.io.File file2 = new java.io.File(RealPath);
		if (!file2.exists()) {
			file2.mkdirs();
		}
		
		name = UUID.randomUUID().toString().replace("-", "")+"_"+name;
		//输出流
		
		FileOutputStream out = new FileOutputStream(new java.io.File(RealPath,name));//需要输出一个文件(文件的路径,名字)
		
		//IO流
		IOUtils.copy(in, out);
		//关闭流
		if (in!=null)in.close();
		if (out!=null)in.close();
		
	}

第三部分:文件下载(兼容浏览器)

文件下载,跟文件上传的过程是一样的,需要创建一个输入流,一个输出流,然后调用IOutls.copy(in,out)方法 ,完成文件的下载 ;执行流程:

1 .首先查询项目中文件夹的path地址;
2 .创建一个文件对象, New File(path ,name) ;按照路径,将文件读取到内存中;
3 .创建一个输入流, New FileInputStreamNew File(path ,name)) ;创建一个输入流,将文件的对象放进去当做参		数,
		/*++++++++++++++++下述代码可以直接copy***********************/
		6 .需要获得相应的页头信息,获取文件的原本的名字,这样,在下载保存文件的时候,可以保存成为原始的文件类			型;
		//设置表头的方式,就是设置下载的访问的请求;告诉浏览器要什么东西
		response.setHeader("Content-Disposition", "attachment; filename=" + name);

		7. 面对不同的浏览器,页头的信息也不一样,所以,需要首先判断浏览器的类型,然后再写出页头的类型;
            if(request.getHeader("User-Agent").toUpperCase().indexOf("TRIDENT")!=-1){//电脑自带						edge【edʒ】浏览器	
				name = URLEncoder.encode(name, "utf-8");//设置字符集是utf-8
			}else if(request.getHeader("User-Agent").toUpperCase().indexOf("EDGE")!=-1){		
				name = URLEncoder.encode(name, "utf-8");
			}else{//其他浏览器
				name = new String(name.getBytes("UTF-8"),"ISO-8859-1");//转码的方式
			}

			/*++++++++++++++++代码可以直接copy***********************/			
4 . 使用响应请求 response.getOutputStream();获得输出流;这样的话,输入流里面已经存储了文件对象,输出流已经有了;直接使用IOUtils.copy()就能完成下载;
5 . 调用工具类 IOUtil。copy ;关闭流 

但是:这样直接下载的只是一个未知类型的文件,没有后缀;

调整,将后续步骤 放在4之前,补充完毕;

第四部分:拦截器 【最重点的内容】

相对来说,拦截器是个应用的重点;拦截器需要些一个拦截器的类,用来做逻辑的处理;比如在请求发送之后,到达核心控制器之前 ;拦截器可以判断,这个请求是否有登录行为;如果没有登录,那么拦截器将拦截,不允许访问程序内部;通过设置返回值 true 或者 false来控制,程序是否进行;

//preHandle()方法在业务处理器处理请求之前被调用 
	@Override
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {

		System.out.println("进入拦截器了....");
		//这里可以判断用户是否登录 
		//没有登录可以使用 request/response跳转回登录页面
		//注:如果不继续执行返回false,否则返回true
		return false;
	}

在学习拦截器之前,我们先要学习拦截器的2个重要的步骤;

1. 创建拦截器的类

/** 如果拦截器xml里面配置的内容,对访问进行了拦截,那么拦截器开始生效,就进入到这个类
	(进入核心控制器)之前这个方法开始处理
*/

public class MyInterceptor implements HandlerInterceptor {
	// afterCompletion()方法在DispatcherServlet【spring】完全处理完请求后被调用 
	@Override
	//重写方法1 --- after 	 	核心控制器处理完之后,拦截 【不理解用途 】
    @Override
	//重写方法2	-- post  		方法在业务处理器处理请求之后被调用  【这个用在哪有点不清晰】
    @Override
	//重写方法3 -- pre 			进入核心控制器之前拦截【理解】

}

2. 创建拦截器的 xml配置

这个配置里面,要注意一下备注的几个点: 固定格式,可以直接copy,但是,里面的参数要注意使用;

<mvc:mapping path="/*" /> :--------/表示的是请求里面,拦截一级请求;/* 表示的是拦截多级请求;

<mvc:exclude-mapping path="/file"/>:-----》这个表示的是对请求 进行放行的请求;

<!-- 配置拦截器组 -->
	<mvc:interceptors>
		<!-- 拦截器 -->
		<mvc:interceptor>
			<!-- 要拦截的配置,该配置必须写在不拦截的上面,/*拦截一级请求,/**拦截多级请求 -->
			<mvc:mapping path="/*"  />
			<!-- 设置不拦截的配置 -->
			<mvc:exclude-mapping path="/file"/>
			<!-- 配置拦截器 -->
			<bean class="cn.wulang.Interceptor.MyInterceptor" />  
		</mvc:interceptor>
	</mvc:interceptors>
注意: 拦截的设置,必须设置在放行的前面;
一般拦截所有的请求,只放行登录的请求;然后再拦截器里面 pre进行判断,如果确认了登录的身份,然后返回true ,
拦截器放行;
如果,不能通过false,那么拦截器不放行;不可以进入到程序;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值