当前位置: 首页 > news >正文

javaweb之ajax异步交互

一、概念

1、传统网站存在的问题

传统的页面交互是Servlet 调用完业务逻辑层后将数据存储到域对象中,然后跳转到指定的 jsp 页面,在页面上使用 EL表达式 和JSTL 标签库进行数据的展示。该模式存在以下问题:

  • 网速比较慢的情况下,页面加载时间长,用户需等待
  • 表单提交后,如果有一项内容不合格,需要重新填写所有表单内容
  • 页面跳转,重新加载页面,造成资源浪费,增加用户等待时间

2、Ajax介绍

  • AJAX (Asynchronous JavaScript And XML):异步的 JavaScript 和 XML。其中JavaScript 表明该技术和前端相关;XML 是指以此进行数据交换。它是浏览器提供的一套方法,可以实现页面无刷新更新数据,提高浏览网站应用的体验。
  • 通过使用Ajax技术,它可以和服务器进行通信,以达到使用 HTML+AJAX来替换JSP页面,即浏览器发送请求servlet,servlet 调用完业务逻辑层后将数据直接响应回给浏览器页面,页面使用 HTML 来进行数据展示。

3、同步与异步

  • 同步
    浏览器页面在发送请求给服务器,在服务器处理请求的过程中,浏览器页面不能做其他的操作。只能等到服务器响应结束后才能,浏览器页面才能继续做其他的操作。
  • 异步
    浏览器页面发送请求给服务器,在服务器处理请求的过程中,浏览器页面还可以做其他的操作。

4、应用场景

  • 页面上的上拉加载与下拉刷新
  • 列表数据无刷新分页
  • 表单项离开焦点数据验证(避免页面跳转重新填写表单)
  • 搜索框提示文字下拉列表(如百度的搜索提示 )

二、实现

1、Ajax之get请求

(1)GetUserInfoServlet接口

@WebServlet("/GetUserInfoServlet")
public class GetUserInfoServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");

        String username=req.getParameter("username");
        String password=req.getParameter("password");

        User user = new User();
        user.setUsername(username);
        user.setPassword(password);

        String content= JSON.toJSONString(user);

        PrintWriter writer = resp.getWriter();
        writer.write(content);
    }
}

(2)ajax页面请求

    function getUserInfo() {
      var username = document.getElementById("username").value;
      var password = document.getElementById("password").value;
      //创建Ajax对象
      var http=new XMLHttpRequest();
      //设置Ajax的请求地址与请求方式
      var params='username='+username+'&password='+password;
      http.open("get","http://localhost:8080/GetUserInfoServlet?"+params);
      //发送请求
      http.send();
      //获取响应数据
      http.onreadystatechange=function () {
        //readyState 0=>初始化 1=>载入 2=>载入完成 3=>解析 4=>完成
        if(this.readyState==4&&this.status==200){
          var responseText=this.responseText
          console.log('返回结果:'+responseText)
          var result=JSON.parse(responseText);
          console.log('解析结果:password:'+result.password+' username:'+result.username)
        }
      }
    }

2、Ajax之post请求

(1)GetUserInfoServlet接口

@WebServlet("/UserLoginServlet")
public class UserLoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");

        //解析参数
        InputStreamReader insr = new InputStreamReader(req.getInputStream(),"utf-8");
        String res = "";
        int respInt = insr.read();
        while(respInt!=-1) {
            res +=(char)respInt;
            respInt = insr.read();
        }
        User user=JSON.parseObject(res,User.class);
        //返回结果
        Result result = new Result();
        if(user.getUsername()==null||user.getUsername().isEmpty()){
            result.setSuccess(false);
            result.setErrorCode(-1);
            result.setErrorMsg("请输入用户名");
        }else if(user.getPassword()==null||user.getPassword().isEmpty()){
            result.setSuccess(false);
            result.setErrorCode(-1);
            result.setErrorMsg("请输入密码");
        }else if(!user.getUsername().equals("admin")||!user.getPassword().equals("admin")){
            result.setSuccess(false);
            result.setErrorCode(-1);
            result.setErrorMsg("用户名或者密码错误");
        }else {
            result.setSuccess(true);
        }
        PrintWriter writer = resp.getWriter();
        writer.write(JSON.toJSONString(result));
    }
}

(2)ajax页面请求

function login() {
      var username = document.getElementById("username").value;
      var password = document.getElementById("password").value;
      //创建Ajax对象
      var http=new XMLHttpRequest();
      //设置Ajax的请求地址与请求方式
      http.open("post","http://localhost:8080/UserLoginServlet");
      //设置请求的参数格式的类型(post请求必须要设置)
      // http.setRequestHeader('Content-type','application/x-www-form-urlencoded') username=123&password=344
      http.setRequestHeader('Content-type','application/json')
      //发送请求
      http.send(JSON.stringify({
          username:username,
          password:password
      }));
      //获取响应数据
      http.onreadystatechange=function () {
        //readyState 0=>初始化 1=>载入 2=>载入完成 3=>解析 4=>完成
        if(this.readyState==4&&this.status==200){
          var responseText=this.responseText
          console.log('返回结果:'+responseText)
          var result=JSON.parse(responseText);
          if(result.success){
             alert('登录成功')
          }else {
             alert(result.errorMsg)
          }
        }
      }
    }

相关文章:

  • 生产实用Shell脚本合集
  • 力扣 1856. 子数组最小乘积的最大值
  • Qt实现控件的折叠收起和展开的功能
  • #传输# #传输数据判断#
  • 腾讯高工用 4 部分就讲清楚了 Spring 全家桶 + 微服务
  • Linux(WSL)安装CUDA
  • Oracle VM VirtualBox Ubuntu设置共享文件夹
  • 【机器学习】DBSCAN聚类算法的理论/实现与调参
  • 32、Java——迷你图书管理器(对象+JDBC)
  • pycharm联合Anaconda
  • 不知道视频怎么转音频?手把手教你视频转音频
  • 【C++笔试强训】第十五天
  • 应用软件漏洞排名
  • 基于YOLOV7的桥梁基建裂缝检测
  • BH1750 传感器实战教学 —— 驱动移植篇
  • 收藏网友的 源程序下载网
  • Python socket服务器端、客户端传送信息
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • SegmentFault 2015 Top Rank
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Vue--数据传输
  • Windows Containers 大冒险: 容器网络
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端js -- this指向总结。
  • 前端知识点整理(待续)
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 详解NodeJs流之一
  • 小程序开发中的那些坑
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • #QT(一种朴素的计算器实现方法)
  • (07)Hive——窗口函数详解
  • (09)Hive——CTE 公共表达式
  • (14)Hive调优——合并小文件
  • (4)STL算法之比较
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (js)循环条件满足时终止循环
  • (ZT)出版业改革:该死的死,该生的生
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)Eureka服务搭建,服务注册,服务发现
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • *p++,*(p++),*++p,(*p)++区别?
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .axf 转化 .bin文件 的方法
  • .net实现客户区延伸至至非客户区
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .Net中的集合
  • /boot 内存空间不够
  • @Async注解的坑,小心
  • @Query中countQuery的介绍
  • @Repository 注解
  • @vue/cli脚手架
  • [2024-06]-[大模型]-[Ollama] 0-相关命令
  • [BZOJ 3680]吊打XXX(模拟退火)