JSON + AJAX + ThreadLocal

news2024/11/18 7:28:53

JSON数据交换

规则

JSON对象和字符串转换

  <script type="text/javascript">
    var jsonPerson = {
      "name": "jack",
      "age": 20
    }
    console.log(jsonPerson);
    var strPerson = JSON.stringify(jsonPerson);//对jsonPerson没有影响
    console.log(strPerson);

    //格式必须满足JSON格式
    var strDog = "{\"name\":\"John\",\"age\":30}";
    var jsonDog = JSON.parse(strDog);
    console.log(jsonDog)
  </script>

 注意与细节

在定义JSON对象时,key可以不加引号,在浏览器查看的时候都会加上双引号,所以可以直接相互转换 

在java中使用

 应用场景

json字符串与javabean转换

public class JavaJson {
    public static void main(String[] args) {
        Gson gson = new Gson();
        Book book = new Book(100, "学java");
        //javabean->json字符串
        String strBook = gson.toJson(book);
        System.out.println(strBook);
        //json字符串->javabean
        //strBook就是json字符串,Book.class底层是反射
        Book book1 = gson.fromJson(strBook, Book.class);
        System.out.println(book1);
    }
}

json字符串与list对象转换

public class JavaJson {
    public static void main(String[] args) {
        Gson gson = new Gson();
        ArrayList<Book> list = new ArrayList<>();
        list.add(new Book(100, "学java1"));
        list.add(new Book(200, "学java2"));
        //javabean->json字符串
        String strBookList = gson.toJson(list);
        System.out.println(strBookList);
        //json字符串->集合,需要gson提供的一个类:TypeToken
        //返回类型的完整路径,然后进行底层反射
        //TypeToken<List<Book>>()会调用无参构造器(protected不同包不能使用)
        //加了{}就是匿名内部类,是Type的子类,执行子类的无参构造器时,默认super,不受protected限制
        Type type = new TypeToken<List<Book>>() {}.getType();
        List<Book> bookList = gson.fromJson(strBookList, type);
        System.out.println(bookList);
    }
}

json字符串与map对象转换

public class JavaJson {
    public static void main(String[] args) {
        Gson gson = new Gson();
        Map<String,Book> map = new HashMap<>();
        map.put("k1",new Book(100, "学java1"));
        map.put("k2",new Book(200, "学java2"));
        //javabean->json字符串
        String strBookList = gson.toJson(map);
        System.out.println(strBookList);
        
        //json字符串->集合,需要gson提供的一个类:TypeToken
        Map<String,Book> bookMap = gson.fromJson(strBookList, new TypeToken<Map<String,Book>>(){}.getType());
        System.out.println(bookMap);
    }
}

AJAX异步请求

 传统web数据通信方式

 AJAX数据通信方式

可以进行局部刷新 

应用

验证用户名是否存在

public class CheckUserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("u");
        System.out.println(username);
        response.setContentType("text/html;charset=utf-8");
        
        if("king".equals(username)) {
            User king = new User(100, "king", "666", "king@sohu.com");
            String strKing = new Gson().toJson(king);
            response.getWriter().write(strKing);
        } else {
            response.getWriter().write("");
        }
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
    <script>
        window.onload = function () {
            var checkButton = document.getElementById("checkButton");
            checkButton.onclick = function () {
                var xhr = new XMLHttpRequest();
                var uname = document.getElementById("uname").value;
                xhr.open("GET","/ajax/check?u=" + uname, true);
                //在send函数调用前,给XMLHttpRequest绑定一个事件,当数据变化,会触发该事件
                xhr.onreadystatechange = function () {
                    // console.log(xhr);
                    if(xhr.readyState == 4 && xhr.status == 200) {
                        document.getElementById("div1").innerText = xhr.responseText;
                        var responseText = xhr.responseText;
                        if(responseText != "") {
                            document.getElementById("myres").value = "用户名不可用";
                        } else {
                            document.getElementById("myres").value = "用户名可用";
                        }
                    }
                }
                xhr.send();
            }

        }
    </script>
</head>
<body>
<h1>用户注册~</h1>
<form action="/ajax/check" method="POST">
    用户名字:<input type="text" name="username" id="uname">
    <input type="button" id="checkButton" value="验证用户名">
    <input style="border-width: 0;color: red" type="text" id="myres"><br/><br/>
    用户密码:<input type="password" name="password"><br/><br/>
    电子邮件:<input type="text" name="email"><br/><br/>
    <input type="submit" value="用户注册">
</form>
<h1>返回的json数据</h1>
<div id="div1"></div>
</body>
</html>

JQuery操作AJAX

$.ajax方法

$.get请求和$.post请求 

 $.getJSON

 应用

public class CheckUserServlet extends HttpServlet {
    private UserService userService = new UserService();
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //取决于JQuery中data定义的名字
        String username = request.getParameter("username");
        System.out.println(username);
        response.setContentType("text/json;charset=utf-8");
        if("king".equals(username)) {
            User user = new User(100, "king", "abc", "king@sohu.com");
            response.getWriter().write(new Gson().toJson(user));
        } else {
            User user = new User(1, "", "", "");
            response.getWriter().write(new Gson().toJson(user));
        }
    }
}

3种情况 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
    <script src="script/jquery-3.7.1.js"></script>
    <script>
        $(function () {
            $("#checkButton").click(function () {
                    $.ajax({
                        url: "/ajax/check",
                        type: "POST",
                        data: {
                            username: $("#uname").val(),
                            //传日期,为了浏览器缓存,浏览器一直变化,会发送POST请求
                            date: new Date()
                        },
                        error: function () {//失败后的回调函数
                            console.log("失败")
                        },
                        success: function (data, status, xhr) {
                            console.log(data);
                            console.log(status);
                            console.log(xhr);
                            $("#div1").html(JSON.stringify(data));
                            if("" == data.username) {
                                $("#myres").val("该用户名可用");
                            } else {
                                $("#myres").val("该用户名不可用");
                            }
                        },
                        dataType: "json"
                    })
                
                
                //讲解.get()使用,必须按顺序url,data,success回调函数,返回的数据格式
                $.get(
                    "/ajax/check",
                    {
                        username: $("#uname").val(),
                        date: new Date()
                    },
                    function (data, status, xhr) {
                        //可以根据状态码处理失败的情况
                        console.log(data);
                        console.log(status);
                        console.log(xhr);
                        $("#div1").html(JSON.stringify(data));
                        if ("" == data.username) {
                            $("#myres").val("该用户名可用");
                        } else {
                            $("#myres").val("该用户名不可用");
                        }
                    },
                    "json"
                )
                
                
                //如果通过jquery发出的ajax请求是get,并且返回的数据格式是json,可以直接使用getJson()函数
                $.getJSON(
                    "/ajax/check",
                    {
                        username: $("#uname").val(),
                        date: new Date()
                    },
                    function (data, status, xhr) {
                        //可以根据状态码处理失败的情况
                        console.log(data);
                        console.log(status);
                        console.log(xhr);
                        $("#div1").html(JSON.stringify(data));
                        if ("" == data.username) {
                            $("#myres").val("该用户名可用");
                        } else {
                            $("#myres").val("该用户名不可用");
                        }
                    }
                )
            })
        })
    </script>
</head>
<body>
<h1>用户注册~</h1>
<form action="/ajax/check" method="POST">
    用户名字:<input type="text" name="username" id="uname">
    <input type="button" id="checkButton" value="验证用户名">
    <input style="border-width: 0;color: red" type="text" id="myres"><br/><br/>
    用户密码:<input type="password" name="password"><br/><br/>
    电子邮件:<input type="text" name="email"><br/><br/>
    <input type="submit" value="用户注册">
</form>
<h1>返回的json数据</h1>
<div id="div1"></div>
</body>
</html>

ThreadLocal线程数据共享和安全

 set分析 

 

演示:在一个线程中,共享数据(线程安全)

public class T1 {

    //创建ThreadLocal对象
    public static ThreadLocal<Object> threadLocal1 = new ThreadLocal<>();
    public static ThreadLocal<Object> threadLocal2 = new ThreadLocal<>();

    public static class Task implements Runnable {
        @Override
        public void run() {
            Dog dog = new Dog();
            Pig pig = new Pig();
            /*
            public void set(T value) {
                1、获取当前线程,关联到当前线程
                Thread t = Thread.currentThread();
                2、通过线程对象,获取ThreadLocalMap
                   是ThreadLocal的静态内部类
                ThreadLocalMap map = getMap(t);
                3、如果map不为空,就将数据(Dog...)放入map
                   key:threadLocal,value:存放的数据
                   一个threadLocal只能关联一个数据,set会替换掉
                4、如果map为null,就创建一个和当前关联的ThreadLocal,并且将该数据放入
                if (map != null) {
                    map.set(this, value);
                } else {
                    createMap(t, value);
                }
            }
            * */
            threadLocal1.set(dog);
//            threadLocal1.set(pig);替换
            threadLocal2.set(pig);//跟threadLocal2关联,并且都被当前Thread管理
            System.out.println("在run方法中的线程= " + Thread.currentThread().getName());
            System.out.println("在run方法中的dog= " + dog);
            new T1service().update();
        }
    }

    public static void main(String[] args) {
        new Thread(new Task()).start();
    }
}
public class T1service {
    public void update() {
        /*
        public T get() {
            1、先得到当前的线程对象
            Thread t = Thread.currentThread();
            2、获取到对应的ThreadLocalMap
            ThreadLocalMap map = getMap(t);
            if (map != null) {
            3、如果map不为空,根据当前的ThreadLocal对象,得到对应的Entry
                ThreadLocalMap.Entry e = map.getEntry(this);
                if (e != null) {
                4、如果Entry不为空,返回当前ThreadLocal关联的数据value
                    @SuppressWarnings("unchecked")
                    T result = (T)e.value;
                    return result;
                }
            }
            return setInitialValue();
        }
        * */
        Object o = T1.threadLocal1.get();
        String name = Thread.currentThread().getName();
        System.out.println("在T1service的update()线程是= " + name);
        System.out.println("在T1service的dog是= " + o);
        new T2DAO().update();
    }
}
public class T2DAO {
    public void update() {
        Object o = T1.threadLocal1.get();
        String name = Thread.currentThread().getName();
        System.out.println("在T2DAO的update()线程是= " + name);
        System.out.println("在T2DAO的dog是= " + o);
    }
}

web应用-文件上传下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1991514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件系统 --- 软硬链接

序言 经过上一篇的学习 在磁盘中的文件&#xff0c;我们大致了解了磁盘的物理结构&#xff0c;逻辑抽象结构以及文件在磁盘上的存储方式。在这篇文章中&#xff0c;我们会基于上一篇文章的部分知识点来介绍软链接&#xff0c;硬链接。 1. 软链接 1.1 软链接的概念 软链接是一个…

vue3+vite+ts 颜色选择器组件支持颜色吸取,透明度

ciw-color-picker-vue&#xff1a; vue3 vite ts 颜色选择器,支持颜色吸取,透明度&#xff0c;与浏览器原生颜色选择器相似,与饿了么颜色选择器相似 使用了ciw-color-picker-vue npm i ciw-color-picker-vue 安装 npm i ciw-color-picker-vue 全局引入方式 main.ts 或 m…

光伏检测室外气象站的重要性

在光伏产业的快速发展中&#xff0c;光伏检测室外气象站的重要性日益凸显。它不仅是光伏电站运维管理的“眼睛”&#xff0c;更是确保电站高效、稳定运行的关键因素。 首先&#xff0c;光伏检测室外气象站能够实时、准确地监测多种关键气象要素&#xff0c;如太阳辐射、风速、风…

【中间件】Redis从入门到精通-黑马点评综合实战

文章目录 一&#xff1a;Redis基础1.Redis是什么2.初识Redis3.Redis的数据结构A.通用命令B.String类型C.Key的层级格式D.Hash类型E.List类型F.Set类型G.SortedSet类型 二&#xff1a;Redis的Java客户端1.JedisA.引入依赖B.建立连接C.测试JedisD.释放资源 2.Jedis连接池3.Spring…

MM 13 -采购- 退货

思维导图 说明 情形1 直接冲销物料凭证 102 情形2 返货部分交货 情形3 退货PR贷项凭证 情形1 适用于已收货未开票&#xff0c;或者发票还可冲销的当月&#xff0c;冲销物料凭证所有数量 情形2 适用于跟情形1 一样&#xff0c;只是可以修改退货数量 情形3 如果已经跨越…

html+css+js网页设计字节跳动11个页面带js 效果很多

htmlcssjs网页设计字节跳动11个页面带js 效果很多 ui还原度100% 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff0…

笔试练习day3

目录 BC149 简写单词题目解析代码 dd爱框框题目解析解析代码方法一暴力解法方法二同向双指针(滑动窗口) 除2!题目解析解法模拟贪心堆 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1…

【网络安全】玲珑安全第四期

鉴于玲珑安全漏洞挖掘前三期课程取得的优异成绩和获得的强烈反响,我们决定启动玲珑安全第四期漏洞挖掘培训计划。 文章目录 往期学员收获基础学员报喜(部分)课程反馈第四期课程课程内容免费课程往期学员收获 第一期课程总结及学员收获:->点我查看第一期学员收获<- …

leetcode 图论专题——(dfs+bfs+并查集 回顾)

DFS、BFS 回顾&#xff08;C语言代码&#xff09; map[i][j]里记录的是i点和j点的连接关系 基本DFS&#xff1a; int vis[101],n,map[101][101]; void dfs(int t) {int i;vis[t]1;for(i0;i<n;i)//找对t点所有有关联的点——“找路”{if(vis[i]!0&&map[t][i]1)//有…

怎么将jar注册为windows系统服务详细操作

将spring boot项目编译成jar,注册为windows系统服务 在网上了解到,winsw这个开源项目,去github看了下,作者常年维护更新,文档齐全,拥有不少,自己写了个小demo体验了下还不错,然后又运行了一个晚上,没啥问题,遂决定采用它 开源地址 源库地址 https://github.com/winsw/winsw R…

string类简单的底层实现,了解string底层以及string的补充知识

string类的简单实现 头文件 #define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include<iostream> #include<assert.h> using namespace std; namespace exprience {class string {public:typedef char* iterator;iterator begin(){return _str;}iterator end()…

IPython使用技巧详解:提高Python编程效率的利器

目录 一、IPython基础设置与启动 1.1 安装IPython 1.2 IPython的配置 二、IPython交互式编程体验 2.1 魔术命令(Magic Commands) 2.2 变量自动补全与文档查看 2.3 历史命令与快速访问 三、IPython高级功能 3.1 列表推导式与生成器表达式 3.2 枚举与压缩函数 3.3 L…

Java NIO(Non-blocking I/O)简单理解

Java NIO是Java平台中用于高效输入/输出&#xff08;I/O&#xff09;操作的一套新的API&#xff0c;与标准的Java I/O&#xff08;基于流的阻塞I/O&#xff09;不同&#xff0c;Java NIO提供了非阻塞式的I/O操作。 Java NIO 的核心组件 Java NIO主要由以下几个核心部分组成&a…

服务器网络不通排查方案

服务器网络不通排查方案 最近遇到了服务器上服务已经启动&#xff0c;但是在浏览器上无法访问的问题&#xff0c;记录一下排查流程 文章目录 服务器网络不通排查方案netstart排查网络连接信息netstat 命令netstat -aptn 命令 iptables总结 netstart排查网络连接信息 netstat …

【Linux进程篇】进程终章:POSIX信号量线程池线程安全的单例模式自旋锁读者写者问题

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 前言&#xff1a;在之前的进程间通信时我们就讲到过信号量&#xff0c;他的本质就是一个计数器&#xff0c;用来描述临界资源的一个计数器。我们当时使用电影院的例子来说明信号量。电影院的座位被我们称为临界资源&a…

LVS集群实现四层负载均衡详解(以nat,dr模式为例)

目录 一、LVS集群的介绍 1、LVS 相关术语&#xff1a; 2、lvs工作原理 3、相关名词概念 4、lvs集群的类型 二、lvs的nat模式 1、介绍&#xff1a; 2、数据逻辑&#xff1a; 3、nat实验部署 环境搭建&#xff1a; 1、lvs中要去打开内核路由功能&#xff0c;实现网络互联…

关于区块链的公共医疗应用开发

区块链的养老保险平台应用开发 任务一:环境准备 1.编译区块链网络 目录:/root/xuperchain/ 在区块链网络目录下执行make命令,编译网络,编译成功后输出compile done! 启动区块链网络 2.创建钱包账户 创建普通钱包账户userTest,命令如下 bin/xchain-cli account newke…

6.2 Python 标准库简介:编程世界的百宝箱

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

QT界面设计开发(Visual Studio 2019)—学习记录一

一、控件升级 简要介绍&#xff1a; 简单来说&#xff0c;控件提升就是将一个基础控件&#xff08;Base Widget&#xff09;转换为一个更特定、更复杂的自定义控件&#xff08;Custom Widget&#xff09;。这样做的目的是为了在设计界面时能够使用更多高级功能&#xff0c;而不…

QT下载与安装

我们要下载开源的QT&#xff0c;方式下载方式&#xff1a; 官网 登录地址&#xff1a;http://www.qt.io.com 点击右上角的Download. Try.按钮&#xff1b;进入一下画面&#xff1a; 如果进入的是以下画面&#xff1a; 直接修改网址&#xff1a;www.qt.io/download-dev; 改为w…