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 FileInputStream(New 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,那么拦截器不放行;不可以进入到程序;
这篇博客主要介绍了Spring中Json的使用,文件上传和下载的实现,以及重点讲解了拦截器的应用。在文件操作部分,利用Spring的IOUtils处理输入输出流完成上传和下载。拦截器部分,强调了创建拦截器类和XML配置的步骤,用于实现请求的权限控制。
6153

被折叠的 条评论
为什么被折叠?



