JavaWeb =Json解析, Ajax与文件上传

一.Json

json最早是JavaScript对象表示形式,现在主要用于互联网传输数据载体

* java
        User user =new User();
            user.setUsername("ack");
            user.setAge(18);
            
* javaScript
        let user = {"username":"ack","age":18};
        
        let array = [{},{},{}]
        
        name:都是字符串
        value:支持各种类型

json比xml更小,更快,更易解析

JavaWeb =Json解析, Ajax与文件上传_第1张图片

JSON数据与java对象转换

常见的解析器:

工具名称 介绍
Jsonlib Java 类库,需要导入的jar包较多
Gson google提供的一个简单的json转换工具
Fastjson alibaba技术团队提供的一个高性能的json转换工具
Jackson 开源免费的json转换工具,springmvc转换默认使用jackson

1.使用jackson,需要导入jar包:如下:

JavaWeb =Json解析, Ajax与文件上传_第2张图片

提供了一个核心转换器对象

ObjectMapper  om = new ObjectMapper();

2.java对象转为json字符串

String writeValueAsString(Object object);

 // 将user对象转为json字符串
    @Test
    public void UserToJson() throws Exception {
        User user = new User("1", "lucy", "女", 15, "德斯", "123", "[email protected]");

        // 创建jackson转换器对象
        ObjectMapper om = new ObjectMapper();

        // 将任意对象转为json字符串
        String json = om.writeValueAsString(user);
        System.out.println(json); // 在java中name必须使用双引号包裹起来
    }

    // 将map集合转为json字符串
    @Test
    public void MapToJson() throws Exception {
        Map map = new HashMap<>();
        map.put("name", "张三");
        map.put("age", 18);

        // 创建jackson转换器对象
        ObjectMapper om = new ObjectMapper();

        // toJson
        String json = om.writeValueAsString(map);
        System.out.println(json); //  {"name":"张三","age":18}
    }

    // 将list集合转为json数组字符串
    @Test
    public void ListToJson() throws Exception {
        List list = new ArrayList<>();
        list.add(new User("1", "lucy", "女", 15, "德斯", "123", "[email protected]"));
        list.add(new User("2", "jack", "男", 15, "德斯", "123", "[email protected]"));

        // 创建jackson转换器对象
        ObjectMapper om = new ObjectMapper();

        // toJson
        String json = om.writeValueAsString(list);
        System.out.println(json); // [{},{}]
    }

3.将json(字符串)转为java对象

T readValue(String json,Class classType);

// 将json字符串转为user对象
    @Test
    public void JsonToUser() throws Exception {
        String json = "{\"id\":\"1\",\"name\":\"lucy\",\"sex\":\"女\",\"age\":15,\"address\":\"德斯\",\"qq\":\"123\",\"email\":\"[email protected]\"}";

        // 创建jackson转换器对象
        ObjectMapper om = new ObjectMapper();

        // toUser
        User user = om.readValue(json, User.class);
        System.out.println(user);
    }

    // 将json字符串转为map集合(如果你获取的json格式没有对应的java实体对象,就可以拿map接收)
    @Test
    public void JsonToMap() throws Exception {
        String json = "{\"name\":\"lucy\",\"age\":18}";

        // 创建jackson转换器对象
        ObjectMapper om = new ObjectMapper();

        // toMap
        Map map = om.readValue(json, Map.class);
        System.out.println(map);
    }

    // 将json数组字符串转为list集合
    @Test
    public void JsonToList() throws Exception {
        String json = "[{\"id\":\"1\",\"name\":\"lucy\",\"sex\":\"女\",\"age\":15,\"address\":\"德斯\",\"qq\":\"123\",\"email\":\"[email protected]\"},{\"id\":\"2\",\"name\":\"jack\",\"sex\":\"男\",\"age\":15,\"address\":\"德斯\",\"qq\":\"123\",\"email\":\"[email protected]\"}]";

        // 创建jackson转换器对象
        ObjectMapper om = new ObjectMapper();

        // toList
        List list = om.readValue(json, List.class);
        System.out.println(list);
    }

 

二.Ajax

检查用户名是否可用:

比如用户注册页面,输入用户名,当用户名输入框失去焦点时,发送异步请求,将输入框的用户名传递给服务器进行是否存在的校验。

使用了ajax技术:通过==异步提交==,实现页面的==局部刷新==,提高用户的体验

JQuery提供ajax函数:

* ajax
        $.ajax({
            type:"请求方式,get|post",
            url:"请求服务器地址",
            data:"请求参数",
            success:function(resp){
                resp就是服务器返回的结果...
            }
        });

* get
        $.get(url(地址?参数),function(resp){
            
        });


* post
        $.post(url,data,function(resp){
            
        })

JavaWeb =Json解析, Ajax与文件上传_第3张图片

coding

JavaWeb =Json解析, Ajax与文件上传_第4张图片

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    ${NAME}
    


用户注册

用户名:
@WebServlet("/CheckServlet")
public class CheckServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        // 1.接收请求参数
        String username = request.getParameter("username");

        // 2.声明map集合
        Map map = new HashMap<>();

        // 3.判断用户是否存在
        if(username.equals("jack")){
            map.put("flag",false);
            map.put("msg", "× 此用户已注册");
        }else{
            map.put("flag",true);
            map.put("msg", "√ 此用户可以注册");
        }

        // 4.将map集合转为json字符串
        ObjectMapper om = new ObjectMapper();
        String json = om.writeValueAsString(map);
        System.out.println(json);

        // 5.设置json的MIME类型
        response.setContentType("application/json;charset=utf-8");

        // 6.response响应json到客户端
        response.getWriter().write(json);
    }

}

 

三、文件上传

客户端将本地的文件传递到服务器的过程,就称之为文件上传。
实现文件上传三要素:
1. 必须使用 post 请求
action = "..." method = "post" >
2. file 标签必须有 name 属性
type = "file" name = "..." />
3. form enctype 必须登录 multipart/form-data
action = "..." method = "post" enctype = "multipart/form-data" >
默认值 普通的表单提交
enctype="application/x-www-form-urlencoded"
 
完整
action = "..." method = "post" enctype = "multipart/form-data" >
type = "file" name = ".." />
 
 
 

比如:

在用户注册页面,我们可以输入用户名,还可以选择要上传的文件;点击提交按钮,就可以将用户输入的内容和选择的文件保存到服务器上

JavaWeb =Json解析, Ajax与文件上传_第5张图片

客户端如何将文件转化为文本

1. 表单提交方式必须为post
        action="post"
        
2. 表单的enctype属性值必须为multipart/form-data 多组件表单数据
        enctype="multipart/form-data"
        
3. 在表单中提供文件上传项
    

JavaWeb =Json解析, Ajax与文件上传_第6张图片

 

服务器将文本转为字节流

  1. 使用apache提供工具类 commons-fileupload

  2. 使用servlet3.0版本,通过注解实现

  3. 使用springMVC框架(最简单,底层使用commons-fileupload)

1.导入相关上传jar包

JavaWeb =Json解析, Ajax与文件上传_第7张图片

指定 服务器保存文件路径

JavaWeb =Json解析, Ajax与文件上传_第8张图片

编写Servlet接收文件并保存

1. 创建磁盘文件项工厂

2. 创建核心解析对象(依赖工厂对象)

3. 解析request对象,返回上传项list集合

4. 遍历list,获取每一个上传项

5. 判断
      普通上传项
          name和value
      文件上传项
          文件名
          字节输入流
          保存服务器端

@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            // 1.创建磁盘文件项工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // 2.创建上传解析器对象(依赖工厂对象)
            ServletFileUpload fileUpload = new ServletFileUpload(factory);
            // 3.解析request请求,返回上传项list集合
            List fileItems = fileUpload.parseRequest(request);
            // 4.遍历list
            for (FileItem fileItem : fileItems) {
                // 5.判断是文件项还是普通项
                if (fileItem.isFormField()) {// 普通上传项
                    // 获取name属性名
                    String name = fileItem.getFieldName();
                    // 获取value属性值
                    String value = fileItem.getString();
                    System.out.println("普通上传项:" + name + "=" + value);
                } else {// 文件上传项
                    // a.获取文件名   demo.txt
                    String fileName = fileItem.getName();
                    // b.获取文件字节输入流
                    InputStream in = fileItem.getInputStream();
                    // c.获取文件扩展名
                    String extName = FileUtil.extName(fileName);
                    // d.生成随机文件名
                    fileName = IdUtil.simpleUUID() + "." + extName;

                    // 此文件名会保存数据库一份,给用户查询使用...

                    // 获取upload目录在服务器真实路径
                    String realPath = request.getServletContext().getRealPath("/upload/");

                    // 判断此目录是否存在
                    File dirFile = new File(realPath);
                    if (!dirFile.exists()) {
                        dirFile.mkdirs(); // 如果不存在自己创建
                    }

                    // 设置文件字节输出流
                    FileOutputStream out = new FileOutputStream(realPath + fileName);

                    // 流的拷贝
                    IoUtil.copy(in, out);

                    // 关流
                    out.close();
                    in.close();

                    response.getWriter().write("success");
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }

}

 

IEDA自定义模板:

打开设置

JavaWeb =Json解析, Ajax与文件上传_第9张图片

 

 

你可能感兴趣的:(JavaWeb,json,gson,java)