json和axion结合

目录

java中使用JSON对象

在pom.xml中导入依赖

使用 public static String toJSONString(Object object)把自定义对象变成JSON对象

 json和axios综合案例

使用的过滤器

前端代码 

响应和请求都是普通字符串 和 请求时普通字符串,响应是json字符串

响应的数据是json数据

结果

json和axios综合案例进阶 

在web层中,可以创建一个Result类,用来封装发给前端的数据

 Servlet类

 前端代码的书写

结果


java中使用JSON对象

在pom.xml中导入依赖

 <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

json对象

{key:value,key:value...}//key必须是字符串类型 

使用 public static String toJSONString(Object object)把自定义对象变成JSON对象

测试  

public class User {
    private String username;
    private String password;

    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
public class JsonTest {
    //将一个对象转换成json对象
    @Test
    public void test() {
        //创建一个User对象
        User user = new User();
        //赋值
        user.setUsername("hhh");
        user.setPassword("123");

        String jsonString = JSON.toJSONString(user);
        System.out.println("json=" + jsonString);
        //json={"password":"123","username":"hhh"}
    }

    //单列集合转换成json对象
    @Test
    public void test1() {
        //创建集合
        List<User> list = new ArrayList<>();
        Collections.addAll(list, new User("hhh", "123"), new User("aaa", "345"));

        String jsonString = JSON.toJSONString(list);
        System.out.println("json=" + jsonString);
        /*
        json=[
            {"password":"123","username":"hhh"},
            {"password":"345","username":"aaa"}
        ]
         */
    }
    //双列集合转换成json对象
    @Test
    public void test2()
    {
        //创建集合
        Map<String,Object>map=new HashMap<>();
        map.put("hhh1","aaa");
        map.put("hhh2",new User("bbb","1"));
        List<User> list = new ArrayList<>();
        Collections.addAll(list, new User("hhh", "123"), new User("aaa", "345"));
        map.put("hhh3",list);
        String jsonString = JSON.toJSONString(map);
        System.out.println("json="+jsonString);
        /*
       json={
        "hhh1":"aaa",
        "hhh2":{"password":"1","username":"bbb"},
        "hhh3":[{"password":"123","username":"hhh"},{"password":"345","username":"aaa"}]
       }
         */
    }

}

 json和axios综合案例

使用的过滤器

@WebFilter("/*")
public class EncodeFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //your code..
        //解决请求乱码
        request.setCharacterEncoding("utf-8");
        //解决响应乱码
        response.setContentType("text/html;charset=utf-8");
        response.addHeader(  "Access-Control-Allow-Origin","*");//允许所有来源访同
        response.addHeader(  "Access-Control-Allow-Method","POST,GET");//允许访问的方式
        //放行
        filterChain.doFilter(request,response);
    }

    @Override
    public void destroy() {

    }
}

前端代码 

<template>
  <div id="app">
      <h1>axois和json综合</h1>

      <!-- 点击此按钮就会执行method1()函数 -->
        <input type="button" value="请求和响应都是普通字符串" @click="method1()"> <br>
        <input type="button" value="响应数据是json字符串" @click="method2()"> <br>
        <input type="button" value="请求数据是json字符串" @click="method3()"> <br>

        <hr>

        <h3>好友列表</h3>
        <table width="500px" cellspacing="0px" cellpadding="5px" border="1px" id="myTable">
          <tr>
            <th>id</th>
            <th>name</th>
            <th>age</th>
          </tr>
        </table>

  </div>
</template>

<script>

import axios  from 'axios';
export default {
  name: 'App',
  methods:{
    //1.响应和请求都是普通字符串
    method1(){
      //定义变量保存后端地址
      let url="http://localhost:8080/ajaxJsonDemo1Servlet";
      //定义参数
      let params="username=何以以&password=123";
      //发送请求
      axios.post(url,params)
        .then(res=>{
        console.log(res.data);
      })
    },
    //请求时普通字符串,响应改成json字符串
    method2(){
      //定义变量保存后端地址
      let url="http://localhost:8080/ajaxJsonDemo2Servlet";
      //定义参数
      let params="username=何以以&password=123";
      //发送请求
      axios.post(url,params)
        .then(res=>{
        console.log(res.data);
      })

    },
    method3(){
      //定义变量保存后端地址
      let url="http://localhost:8080/ajaxJsonDemo3Servlet";
      //json对象的 " " 每个引号之前都要加 \ 转义字符
      let params="{\"username\":\"何以以\",\"password\":\"145\"}";
      //发送请求
      axios.post(url,params)
      .then(res=>{
        console.log(res.data);
      }
      )

    }
  }
  
}

</script>

<style>
/* #app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
} */
</style>

响应和请求都是普通字符串 和 请求时普通字符串,响应是json字符串

@WebServlet("/ajaxJsonDemo1Servlet")
public class ajaxJsonDemo1Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //打印输出
        System.out.println(username+"---"+password);

        //响应数据给前端
        response.addHeader(  "Access-Control-Allow-Origin","*");//允许所有来源访同
        response.addHeader(  "Access-Control-Allow-Method","POST,GET");//允许访问的方式
        response.getWriter().print("后端已经成功接收到数据");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
//请求时普通字符串,响应是json字符串
@WebServlet("/ajaxJsonDemo2Servlet")
public class ajaxJsonDemo2Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //请求时普通字符串,响应数据是json对象
        //接收请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //创建User对象
        User user = new User();
        //将数据封装到User对象中
        user.setUsername(username);
        user.setPassword(password);

        //将对象变成json对象
        String jsonString = JSON.toJSONString(user);

        //响应数据给前端
        response.addHeader(  "Access-Control-Allow-Origin","*");//允许所有来源访同
        response.addHeader(  "Access-Control-Allow-Method","POST,GET");//允许访问的方式
        response.getWriter().print(jsonString);
    }

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

响应的数据是json数据

 request.getParameter("标识符");只能获取请求参数是普通字符串
        如果是json字符使用:
         1)使用request.getInputStream();//读取关联浏览器的字节输入流
         2)使用request.getReader();//读取关联浏览器的字符输入流
         所以我们可以使用获取流的方法结合JSON的方法一起解析前端提交的json数据
         public static final<T> T pasreObject(InputStream is,Class<T>clazz);
          参数:
            is:关联的浏览器字节输入流
            clazz:封装json请求参数的字节码对象
            注意:要求实体类的属性名必须与json的key一致
            let params="{\"username\":\"何以以\",\"password\":\"145\"}";
            User实体类的属性名必须是username和password 

@WebServlet("/ajaxJsonDemo3Servlet")
public class ajaxJsonDemo3Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求参数
        //String username = request.getParameter("username");//获取不了,此方法只能获取普通参数的请求
        /*
        request.getParameter("标识符");只能获取请求参数是普通字符串
        如果是json字符使用:
         1)使用request.getInputStream();//读取关联浏览器的字节输入流
         2)使用request.getReader();//读取关联浏览器的字符输入流
         所以我们可以使用获取流的方法结合JSON的方法一起解析前端提交的json数据
         public static final<T> T pasreObject(InputStream is,Class<T>clazz);
          参数:
            is:关联的浏览器字节输入流
            clazz:封装json请求参数的字节码对象
            注意:要求实体类的属性名必须与json的key一致
            let params="{\"username\":\"何以以\",\"password\":\"145\"}";
            User实体类的属性名必须是username和password
         */
        User user = JSON.parseObject(request.getInputStream(), User.class);
        System.out.println("user="+user);//user=User{username='何以以', password='145'}
       /* response.addHeader(  "Access-Control-Allow-Origin","*");//允许所有来源访同
        response.addHeader(  "Access-Control-Allow-Method","POST,GET");//允许访问的方式*/
        String jsonString = JSON.toJSONString(user);
        response.getWriter().print(jsonString);
    }

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

结果

第二个的结果:

第三个的结果

json和axios综合案例进阶 

在web层中,可以创建一个Result类,用来封装发给前端的数据

public class Result {
    private boolean flag;//执行结果,true为执行成功,false为执行失败
    private String message;//返回结果信息
    private Object valueDate;//返回数据(如果是查询操作就设置,增删不用设置)
    public Result(){}
    public Result(boolean flag, String message) {//失败,或者增删改
        this.flag = flag;
        this.message = message;
    }
    //成功的查询
    public Result(boolean flag, String message, Object valueDate) {
        this.flag = flag;
        this.message = message;
        this.valueDate = valueDate;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getValueDate() {
        return valueDate;
    }

    public void setValueDate(Object valueDate) {
        this.valueDate = valueDate;
    }
}

 Servlet类

@WebServlet("/ajaxJsonDemo3Servlet")
public class ajaxJsonDemo3Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求参数
        //String username = request.getParameter("username");//获取不了,此方法只能获取普通参数的请求
        /*
        request.getParameter("标识符");只能获取请求参数是普通字符串
        如果是json字符使用:
         1)使用request.getInputStream();//读取关联浏览器的字节输入流
         2)使用request.getReader();//读取关联浏览器的字符输入流
         所以我们可以使用获取流的方法结合JSON的方法一起解析前端提交的json数据
         public static final<T> T pasreObject(InputStream is,Class<T>clazz);
          参数:
            is:关联的浏览器字节输入流
            clazz:封装json请求参数的字节码对象
            注意:要求实体类的属性名必须与json的key一致
            let params="{\"username\":\"何以以\",\"password\":\"145\"}";
            User实体类的属性名必须是username和password
         */
        User user = JSON.parseObject(request.getInputStream(), User.class);
        System.out.println("user="+user);
       /* response.addHeader(  "Access-Control-Allow-Origin","*");//允许所有来源访同
        response.addHeader(  "Access-Control-Allow-Method","POST,GET");//允许访问的方式*/

        //模拟从数据库查出user信息的好友列表
        List<User> list=new ArrayList<>();
        Collections.addAll(list,new User("蚂蚁","123"),new User("遗迹","125"));
        //创建一个Result类对象
        Result result = new Result(true, "查询用户成功", list);
        //变成json对象
        String jsonString = JSON.toJSONString(result);
        //响应数据给前端
        response.getWriter().print(jsonString);

    }

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

发给前端的数据

 前端代码的书写

<template>
  <div id="app">
      <h1>axois和json综合</h1>

      <!-- 点击此按钮就会执行method1()函数 -->
        <input type="button" value="请求和响应都是普通字符串" @click="method1()"> <br>
        <input type="button" value="响应数据是json字符串" @click="method2()"> <br>
        <input type="button" value="请求数据是json字符串" @click="method3()"> <br>

        <hr>
        <div id="messID"></div> <br>
        <h3>好友列表</h3>
        <table width="500px" cellspacing="0px" cellpadding="5px" border="1px" id="myTable">
          <tr>
            <th>名字</th>
            <th>密码</th>     
          </tr>
          
        </table>

  </div>
</template>

<script>

import axios  from 'axios';
export default {
  name: 'App',
  methods:{
    //1.响应和请求都是普通字符串
    method1(){
      //定义变量保存后端地址
      let url="http://localhost:8080/ajaxJsonDemo1Servlet";
      //定义参数
      let params="username=何以以&password=123";
      //发送请求
      axios.post(url,params)
        .then(res=>{
        console.log(res.data);
      })
    },
    //请求时普通字符串,响应改成json字符串
    method2(){
      //定义变量保存后端地址
      let url="http://localhost:8080/ajaxJsonDemo2Servlet";
      //定义参数
      let params="username=何以以&password=123";
      //发送请求
      axios.post(url,params)
        .then(res=>{
        console.log(res.data);
        //从后端查到的数据{flag: true, mmessage: '查询用户成功', valueDate: Array(2)}
        
      })

    },
    method3(){
      //定义变量保存后端地址
      let url="http://localhost:8080/ajaxJsonDemo3Servlet";
      //json对象的 " " 每个引号之前都要加 \ 转义字符
      let params="{\"username\":\"何以以\",\"password\":\"145\"}";
      //发送请求
      axios.post(url,params)
      .then(res=>{
        console.log(res.data);
        //从后端查到的数据{flag: true, message: '查询用户成功', valueDate: Array(2)}
        /*
        valueDate{password: '123', username: '蚂蚁'},{password: '125', username: '遗迹'}
        */
        let obj=res.data;
        if(obj.flag){
          //查询成功
          document.getElementById("messID").innerHTML=obj.message;
          //设置空字符串
          let content="";
          let arr=obj.valueDate;
          for(let a of arr){//a是数组中的每个json对象
            content+=`<tr>
            <td>${a.username}</td>
            <td>${a.password}</td>
          </tr>`
          }
          document.getElementById("myTable").innerHTML+=content;
        }
      }
      )

    }
  }
  
}

</script>

<style>
/* #app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
} */
</style>

结果

 点击第三个按钮

由于我们会重复的从前端解析json,和发送json给前端,我们可以把那几个方法封装从工具类

public class BaseController {
    //静态方法解析前端提交的json数据 Class clazz=User.class
    //<T>定义泛型
    //T parseToObject,Class<T> clazz都是使用泛型
    public static <T> T parseToObject(HttpServletRequest request,Class<T> clazz)throws Exception{
        T obj= JSON.parseObject(request.getInputStream(),clazz);
        return obj;
    }
    //静态方法将后端的json数据响应到前端
    public static void responseJsonToBrowser(HttpServletResponse response,Object obj)throws Exception{
        //将result对象变成json
        String jsonString = JSON.toJSONString(obj);
        //响应数据给前端
        response.getWriter().print(jsonString);
    }
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

postman教程-14-生成随机数

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了Postman关联接口的调用方法&#xff0c;本小节我们讲解一下Postman生成随机数的方法。 在接口测试中&#xff0c;经常需要向接口发送不同的输入数据&#xff0c;以确保接口的健壮性和可靠性。…

Vue3实战笔记(51)—Vue 3封装带均线的k线图

文章目录 前言带均线的k线图总结 前言 继续封装一个封装带均线的k线图 带均线的k线图 EChartsCandlestickSh.vue&#xff1a; <template><div ref"chartContainer" style"width: 100%; height: 500px"></div></template><scr…

HackTheBox-Machines--SolidState

SolidState 测试过程 1 信息收集 NMAP ┌──(root㉿serven)-[~] └─# nmap -p 0-65535 -A 10.129.224.177 Starting Nmap 7.92 ( https://nmap.org ) at 2024-06-05 00:52 CST Host is up (0.063s latency). Not shown: 65530 closed tcp ports (reset) PORT STATE SE…

如何解决 Zabbix模板同步超时:解决运维技术领域的BugFailed to sync Zabbix template due to timeout

如何解决 Zabbix模板同步超时&#xff1a;解决运维技术领域的BugFailed to sync Zabbix template due to timeout 原创作者&#xff1a; 猫头虎 作者微信号&#xff1a; Libin9iOak 作者公众号&#xff1a; 猫头虎技术团队 更新日期&#xff1a; 2024年6月6日 博主猫头虎…

python学习笔记-05

函数 基本上所有的高级语言都支持函数&#xff0c;函数就是一种代码抽象的方式。之前所使用的len、print等都是python的内置函数。 1.初识函数 在编写程序过程中&#xff0c;如果一段代码经常出现&#xff0c;为了提高编写效率&#xff0c;将这类实现某个功能的代码作为一个…

Linux: ubi rootfs 加载故障案例

文章目录 1. 前言2. ubi rootfs 加载故障现场3. 故障分析与解决4. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. ubi rootfs 加载故障现场 问题故障内核日志如下&#xff1a; Star…

前后端分离与实现 ajax 异步请求 和动态网页局部生成

前端 <!DOCTYPE html><!-- 来源 --> <!-- https://cloud.tencent.com/developer/article/1705089 --> <!-- https://geek-docs.com/ajax/ajax-questions/19_ajax_javascript_send_json_object_with_ajax.html --> <!-- 配合java后端可以监听 --&…

Jmeter的几种参数化方式

1.为什么要做参数化&#xff1f; 在用jmeter脚本进行压测的时候&#xff0c;为了更真实的模拟起到更好的效果&#xff0c;我们需要让参数动态变化起来&#xff0c;也就是参数化。通过参数化我们也可以更好、更灵活的维护我们的测试脚本。 2.参数化的方式 能够实现参数化的方式有…

Linux 磁盘分区步骤

1.lsblk用于查看磁盘分区情况&#xff0c;lsblk -f用于查看uuid字符串以及挂载点。 以下是虚拟机部分添加磁盘的步骤。 其余没展示的都按照默认设置进入下一步即可。 2.添加完成后使用reboot重新进入后再使用lsblk就会发现磁盘sdb已经有了&#xff0c;但是没有分区。现在添加分…

LitCTF2024部分wp

litctf wp 第一次ak了web和misc&#xff0c;非常激动&#xff0c;感谢lictf给我这个机会 最终成果 全靠队里的密码逆向✌带飞。一个人就砍了近一半的分数 这里是我们队的wp web exx 题目名反过来就是xxe&#xff0c;考察xxe&#xff0c;查看登录的数据包 发现传的就是xml…

华为高斯数据库招聘

西安华为&#xff0c;部门直招数据库开发&#xff0c;测试&#xff0c;维护&#xff0c;hc充足&#xff0c;流程快。 语言不限&#xff0c;专业不限&#xff0c;与业内数据库大佬共事&#xff0c;致力于做数据库行业领军者。 一、岗位职责&#xff1a; 1.负责数据库系统内核模…

Qt信号槽与函数直接调用性能对比

1. 测试方法 定义一个类Recv&#xff0c;其中包含一个成员变量num和一个成员函数add()&#xff0c;add()实现num的递增。 另一个类Send通过信号槽或直接调用的方法调用Recv的add函数。 单独开一个线程Watcher&#xff0c;每秒计算num变量的增长数值&#xff0c;作为add函数被调…

SpaceX 首席火箭着陆工程师 MIT论文详解:非凸软着陆最优控制问题的控制边界和指向约束的无损凸化

上一篇blog翻译了 Lars Blackmore(Lars Blackmore is principal rocket landing engineer at SpaceX)的文章&#xff0c;SpaceX 使用 CVXGEN 生成定制飞行代码,实现超高速机载凸优化。利用地形相对导航实现了数十米量级的导航精度,着陆器在着陆过程中成像行星表面并将特征与机载…

Spring自带定时任务@Scheduled注解

文章目录 1. cron表达式生成器2. 简单定时任务代码示例&#xff1a;每隔两秒打印一次字符3. Scheduled注解的参数3.1 cron3.2 fixedDelay3.3 fixedRate3.4 initialDelay3.5 fixedDelayString、fixedRateString、initialDelayString等是String类型&#xff0c;支持占位符3.6 tim…

用幻灯片讲解C++手动内存管理

用幻灯片讲解C手动内存管理 1.栈内存的基本元素 2.栈内存的聚合对象 3.手动分配内存和释放内存 注意&#xff1a;手动分配内存&#xff0c;指的是在堆内存中。 除非实现自己的数据结构&#xff0c;否则永远不要手动分配内存! 即使这样&#xff0c;您也应该通过std::allocator…

gitlabcicd-k8s部署runner

一.环境信息 存储使用nfs挂载持久化 k8s环境 helm安装 建议helm 3 二.部署gitlab-runner 1.查看gitlab版本 进入容器可通过执行&#xff1a;gitlab-rake gitlab:env:info rootgitlab-647f4bd8b4-qz2j9:/# gitlab-rake gitlab:env:info System information System: Current Us…

重生之 SpringBoot3 入门保姆级学习(14、内容协商基础简介)

重生之 SpringBoot3 入门保姆级学习&#xff08;14、内容协商基础简介&#xff09; 3.3 内容协商3.3.1 基础简介3.3.2 演示效果 3.3 内容协商 3.3.1 基础简介 默认规则 基于请求头的内容协商&#xff08;默认开启&#xff09; 客户端向服务器发送请求&#xff0c;携带 HTTP 标…

php: centos+apache 启动php项目

指导文件 &#xff1a;PHP: Apache 2.x on Unix systems - Manual 下载路径 &#xff1a;Index of /httpd configure: error: APR not found. 解决方案&#xff1a; APR&#xff08;Apache Portable Runtime&#xff09;库。APR是Apache HTTP服务器的可移植运行时环境&…

51建模网3D编辑器:一键为3D模型设置特殊材质

3D设计师要对3D模型设置玻璃或者钻石材质时&#xff0c;操作比较复杂&#xff0c;但是利用51建模网的3D编辑器&#xff0c;不用下载安装软件&#xff0c;在线通过浏览器即可编辑&#xff0c;具有一键设置特殊材质的功能。目前&#xff0c;它支持钻石材质、玻璃材质和水波纹材质…

nvme-cli常见命令分析

一、背景 nvme-cli命令常常用于获取或者设置SSD参数&#xff0c;比如常见的nvme list&#xff0c;nvme id-ctrl等&#xff0c;都是获取SSD的基本信息&#xff0c;也有nvme admin-passthru用于读取或者设置自定义命令。作为使用者&#xff0c;我们并不知道nvme-cli源码怎么实现…