经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » AJAX » 查看文章
Qt+QtWebApp开发笔记(五):http服务器html中使用json触发ajax与后台交互实现数据更新传递
来源:cnblogs  作者:红胖子(红模仿)  时间:2023/6/9 11:35:12  对本文有异议

前言

前面完成了页面的跳转、登录,很多时候不刷新页面就想刷新局部数据,此时ajax就是此种技术,且是异步的。
??本篇实现网页内部使用js调用ajax实现异步交互数据。
??在js中使用 ajax是通过XMLHttpRequest来实现的。

 

Demo

在这里插入图片描述

下载地址

 

Ajax与XMLHttpRequest

Ajax

Ajax即Asynchronous Javascript And XML(异步JavaScript和XML)在 2005年被Jesse James Garrett提出的新术语,用来描述一种使用现有技术集合的‘新’方法,包括:HTML或XHTML、CSS、JavaScript、DOM、XML、XSLT以及最重要的XMLHttpRequest。使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。
??Ajax不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。使用JavaScript向服务器提出请求并处理响应而不阻塞用户核心对象XMLHttpRequest。通过这个对象,JavaScript可在不重载页面的情况与Web服务器交换数据,即在不需要刷新页面的情况下,就可以产生局部刷新的效果。Ajax在浏览器与 Web 服务器之间使用异步数据传输(HTTP 请求),这样就可使网页从服务器请求少量的信息,而不是整个页面。

  • Ajax可使因特网应用程序更小、更快,更友好。
  • Ajax是一种独立于Web服务器软件的浏览器技术。
  • Ajax基于Web标准:JavaScript、XML、HTML与CSS,在Ajax中使用的Web标准已被良好定义,并被所有的主流浏览器支持。
  • Ajax用程序独立于浏览器和平台。

Web应用程序较桌面应用程序有诸多优势;它们能够涉及广大的用户,它们更易安装及维护,也更易开发。但是,因特网应用程序并不像传统的桌面应用程序那样完善且友好。 通过 Ajax,因特网应用程序可以变得更完善,更友好。

 

XMLHttpRequest

XMLHTTP是一组API函数集,可被JavaScript、JScript、VBScript以及其它web浏览器内嵌的脚本语言调用,通过HTTP在浏览器和web服务器之间收发XML或其它数据。XMLHTTP最大的好处在于可以动态地更新网页,它无需重新从服务器读取整个网页,也不需要安装额外的插件。该技术被许多网站使用,以实现快速响应的动态网页应用。例如:Google的Gmail服务、Google Suggest动态查找界面以及Google Map地理信息服务。
??XMLHTTP是AJAX网页开发技术的重要组成部分。除XML之外,XMLHTTP还能用于获取其它格式的数据,如JSON或者甚至纯文本。
??使用XMLHttpRequest来发送HTTP请求以实现网站和服务器之间的数据交换。
??XMLHttpRequest对象是Ajax的核心,它有许多的属性、方法和事件。

属性

readyState:当前状态

当一个XMLHttpRequest对象被创建后,readyState属性标识了当前对象的状态。
??在这里插入图片描述

responseText:响应文本

responseText属性包含客户端接收到的HTTP响应的文本内容。

  • readyState为0、1、2时:为一个空字符串;
  • readyState为3时:为还未完成的响应信息;
  • readyState为4时:为含完整的响应信息;

statusText:状态文本

描述了HTTP状态代码文本,并且仅当readyState属性值为3或4时才可用。检测返回结果的判断就是:

  1. if(readyState===4 && statusText===200)
  2. {
  3. ……
  4. }

如我们的Demo:
??在这里插入图片描述

函数

open():初始化请求

  1. open(method, url, async, username, password)
  • 参数method:请求的类型,GET、POST、PUT、DELETE、HEAD类型,输入的时候使用大写;
  • 参数url:请求的资源地址,请求资源的web api地址;
  • 参数async:是否发送异步请求,true-异步请求,false-同步请求;
  • 参数username(可为空):需要服务器验证访问用户时,设置username;
  • 参数password(可为空):需要服务器验证访问用户时,设置password;

send():发送请求

调用open()方法后,再调用send()方法将请求发送。当open()方法中async参数为true(异步)时,在send()方法调用后立即返回,否则将会中断直到请求返回。

setRequestHeader():设置头部信息

设置请求的头部信息

getResponseHeader():获取头部信息

获取请求的头部信息

事件

onreadystatechange:状态变化事件
??当readyState属性值发生改变时,就会触发onreadystatechang事件,代码中是依赖onreadystatechang进一步判断状态和状态文本来做处理。
??在这里插入图片描述

 

使用XMLHttpRequest的步骤

步骤一:在脚本中实例化XHMLHttpRequest

  1. var xhr = new XMLHttpRequest();

步骤二:初始化请求open()

  1. xhr.open('GET','/checkState/data',true);

步骤三:发送请求

  1. xhr.send();

步骤四:书写事件处理函数并判断状态和状态文本

  1. xhr.onreadystatechange = function() {
  2. if(xhr.readyState === 4 && xhr.status === 200)
  3. {
  4. ……
  5. }
  6. }

步骤五:书写返回成功的js处理代码

  1. document.getElementById("dt2").innerHTML = xhr.responseText;
 

Demo增量使用ajax交互过程

步骤一:准备代码模板

准备之前的demo v1.3.0模板:
??在这里插入图片描述

步骤二:新增checkState.html页面

下面是新增定时获取和手动按钮获取得html:
??在这里插入图片描述

步骤三:创建CheckStateRequestHandle处理

新建了一个处理,特别是增加了对于ajax技术的路径处理
??在这里插入图片描述

在这里插入图片描述

步骤四:将CheckStateRequestHandle接入

在这里插入图片描述
??在这里插入图片描述

 

Demo源码

checkState.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>长沙红胖子Qt</title>
  8. </head>
  9. <body>
  10. <p><a>这里是检测状态Demo v1.4.0了</a></p>
  11. <p><a id="dt1">123.567</a></p>
  12. <p><a id="dt2">123.567</a></p>
  13. <p><a id="dt3">123.567</a></p>
  14. <p><button onclick="reset()">清空</button></p>
  15. <p><button onclick="getDt1()">获取</button></p>
  16. <script>
  17. function reset() {
  18. document.getElementById("dt1").innerHTML="---.---";
  19. document.getElementById("dt2").innerHTML="---.---";
  20. document.getElementById("dt3").innerHTML="---.---";
  21. }
  22. function getDt1() {
  23. var xhr = new XMLHttpRequest();
  24. xhr.open('GET','/checkState/data',true);
  25. xhr.send();
  26. xhr.onreadystatechange = function() {
  27. if(xhr.readyState === 4 && xhr.status === 200)
  28. {
  29. document.getElementById("dt1").innerHTML = xhr.responseText;
  30. }
  31. }
  32. }
  33. </script>
  34. <script>
  35. /* 定时获取dt2 */
  36. function getDt2() {
  37. var xhr = new XMLHttpRequest();
  38. xhr.open('GET','/checkState/data',true);
  39. xhr.send();
  40. xhr.onreadystatechange = function() {
  41. if(xhr.readyState === 4 && xhr.status === 200)
  42. {
  43. document.getElementById("dt2").innerHTML = xhr.responseText;
  44. }
  45. }
  46. }
  47. window.setInterval(getDt2, 1000);
  48. </script>
  49. </body>

CheckStateRequestHandler.h

  1. #ifndef CHECKSTATEREQUESTHANDLER_H
  2. #define CHECKSTATEREQUESTHANDLER_H
  3. #include "httprequesthandler.h"
  4. using namespace stefanfrings;
  5. class CheckStateRequestHandler : public HttpRequestHandler
  6. {
  7. public:
  8. CheckStateRequestHandler(QObject *parent = 0);
  9. public:
  10. void service(HttpRequest& request, HttpResponse& response);
  11. private:
  12. QTextCodec *_pTextCodec;
  13. };
  14. #endif // CHECKSTATEREQUESTHANDLER_H

CheckStateRequestHandler.cpp

  1. #include "CheckStateRequestHandler.h"
  2. #include "DataManager.h"
  3. #include <QTextCodec>
  4. #include <QApplication>
  5. #include <QDebug>
  6. #include <QDateTime>
  7. //#define LOG qDebug()<<__FILE__<<__LINE__
  8. //#define LOG qDebug()<<__FILE__<<__LINE__<<__FUNCTION__
  9. //#define LOG qDebug()<<__FILE__<<__LINE__<<QThread()::currentThread()
  10. //#define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd")
  11. #define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz")
  12. using namespace stefanfrings;
  13. CheckStateRequestHandler::CheckStateRequestHandler(QObject *parent)
  14. : HttpRequestHandler(parent)
  15. {
  16. // 返回文本(我们需要在浏览器上看,所以将Qt内部编码都转成GBK输出即可,不管他本身是哪个编码)
  17. // WINDOWS: GBK GB2312
  18. // LINUX : urf-8
  19. // _pTextCodec = QTextCodec::codecForName("utf-8");
  20. _pTextCodec = QTextCodec::codecForName("GBK");
  21. }
  22. void CheckStateRequestHandler::service(HttpRequest &request, HttpResponse &response)
  23. {
  24. QString str;
  25. QString path = request.getPath();
  26. LOG << path;
  27. if(path == "/checkState")
  28. {
  29. // 为了方便,开始单独加载html文件做处理
  30. QString filePath = QString("%1/html/checkState.html").arg(qApp->applicationDirPath());
  31. QFile file(filePath);
  32. if(!file.open(QIODevice::ReadOnly))
  33. {
  34. str = QString("The URL is wrong, no checkState.html [%1]").arg(filePath);
  35. }else{
  36. str = file.readAll();
  37. file.close();
  38. }
  39. }else if(path == "/checkState/data")
  40. {
  41. str = DataManager::getInstance()->getDt1Value();
  42. }else {
  43. response.setStatus(404,"Not found");
  44. str = "The URL is wrong, no such document.";
  45. }
  46. // 返回文本(我们需要在浏览器上看,所以将Qt内部编码都转成GBK输出即可,不管他本身是哪个编码)
  47. // QByteArray byteArray = _pTextCodec->fromUnicode(str);
  48. QByteArray byteArray = str.toUtf8();
  49. response.write(byteArray);
  50. }
 

工程模板v1.4.0

在这里插入图片描述

原文链接:https://www.cnblogs.com/qq21497936/p/17468770.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号