Qt+QtWebApp开发笔记(五):http服务器html中使用json触发ajax与后台交互实现数据更新传递

news2024/11/28 21:57:15

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131122772

红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

Qt开发专栏:三方库开发技术

上一篇:《Qt+QtWebApp开发笔记(四):http服务器使用Session和Cookie实现用户密码登录和注销功能》
下一篇:敬请期待…


前言

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


Demo

  在这里插入图片描述

下载地址

  链接:https://pan.baidu.com/s/1tJMTPhIIyVE40qWxRWcmVA?pwd=1234


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时才可用。检测返回结果的判断就是:

if(readyState===4 && statusText===200)
{
	……
}

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

函数

open():初始化请求

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

var xhr = new XMLHttpRequest();

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

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

步骤三:发送请求

xhr.send();

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

xhr.onreadystatechange = function() {
	if(xhr.readyState === 4 && xhr.status === 200)
	{
		……
	}
}

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

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

Demo增量使用ajax交互过程

步骤一:准备代码模板

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

步骤二:新增checkState.html页面

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

步骤三:创建CheckStateRequestHandle处理

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

  在这里插入图片描述

步骤四:将CheckStateRequestHandle接入

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


Demo源码

checkState.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>长沙红胖子Qt</title>
</head>
<body>
	<p><a>这里是检测状态Demo v1.4.0了</a></p>
	<p><a id="dt1">123.567</a></p>
	<p><a id="dt2">123.567</a></p>
	<p><a id="dt3">123.567</a></p>
	<p><button onclick="reset()">清空</button></p>
	<p><button onclick="getDt1()">获取</button></p>
	<script>
		function reset() {
			document.getElementById("dt1").innerHTML="---.---";
			document.getElementById("dt2").innerHTML="---.---";
			document.getElementById("dt3").innerHTML="---.---";
		}
		function getDt1() {
			var xhr = new XMLHttpRequest();
			xhr.open('GET','/checkState/data',true);
			xhr.send();
			xhr.onreadystatechange = function() {
				if(xhr.readyState === 4 && xhr.status === 200)
				{
					document.getElementById("dt1").innerHTML = xhr.responseText;
				}
			}
			
		}
	</script>
	<script>
		/* 定时获取dt2 */
		function getDt2() {
			var xhr = new XMLHttpRequest();
			xhr.open('GET','/checkState/data',true);
			xhr.send();
			xhr.onreadystatechange = function() {
				if(xhr.readyState === 4 && xhr.status === 200)
				{
					document.getElementById("dt2").innerHTML = xhr.responseText;
				}
			}
		}
		window.setInterval(getDt2, 1000);
	</script>
</body>

CheckStateRequestHandler.h

#ifndef CHECKSTATEREQUESTHANDLER_H
#define CHECKSTATEREQUESTHANDLER_H

#include "httprequesthandler.h"

using namespace stefanfrings;

class CheckStateRequestHandler : public HttpRequestHandler
{
public:
    CheckStateRequestHandler(QObject *parent = 0);

public:
    void service(HttpRequest& request, HttpResponse& response);

private:
    QTextCodec *_pTextCodec;
};

#endif // CHECKSTATEREQUESTHANDLER_H

CheckStateRequestHandler.cpp

#include "CheckStateRequestHandler.h"

#include "DataManager.h"

#include <QTextCodec>
#include <QApplication>

#include <QDebug>
#include <QDateTime>
//#define LOG qDebug()<<__FILE__<<__LINE__
//#define LOG qDebug()<<__FILE__<<__LINE__<<__FUNCTION__
//#define LOG qDebug()<<__FILE__<<__LINE__<<QThread()::currentThread()
//#define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd")
#define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz")

using namespace stefanfrings;

CheckStateRequestHandler::CheckStateRequestHandler(QObject *parent)
    : HttpRequestHandler(parent)
{
    // 返回文本(我们需要在浏览器上看,所以将Qt内部编码都转成GBK输出即可,不管他本身是哪个编码)
    // WINDOWS: GBK  GB2312
    // LINUX  : urf-8
//    _pTextCodec = QTextCodec::codecForName("utf-8");
    _pTextCodec = QTextCodec::codecForName("GBK");
}

void CheckStateRequestHandler::service(HttpRequest &request, HttpResponse &response)
{
    QString str;

    QString path = request.getPath();
    LOG << path;


    if(path == "/checkState")
    {
        // 为了方便,开始单独加载html文件做处理
        QString filePath = QString("%1/html/checkState.html").arg(qApp->applicationDirPath());
        QFile file(filePath);
        if(!file.open(QIODevice::ReadOnly))
        {
            str = QString("The URL is wrong, no checkState.html [%1]").arg(filePath);
        }else{
            str = file.readAll();
            file.close();
        }
    }else if(path == "/checkState/data")
    {
        str = DataManager::getInstance()->getDt1Value();
    }else {
        response.setStatus(404,"Not found");
        str = "The URL is wrong, no such document.";
    }

    // 返回文本(我们需要在浏览器上看,所以将Qt内部编码都转成GBK输出即可,不管他本身是哪个编码)
//    QByteArray byteArray = _pTextCodec->fromUnicode(str);
    QByteArray byteArray = str.toUtf8();
    response.write(byteArray);
}

工程模板v1.4.0

  在这里插入图片描述


上一篇:《Qt+QtWebApp开发笔记(四):http服务器使用Session和Cookie实现用户密码登录和注销功能》
下一篇:敬请期待…


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131122772

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

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

相关文章

如何规划和执行安全测试

如何规划和执行安全测试 在现代软件开发中&#xff0c;安全测试已经成为一个必不可少的环节。在完成软件开发后&#xff0c;需要对应用程序进行安全测试&#xff0c;以确保其可以在生产环境中正常运行并能够抵御各种安全攻击和漏洞。 如何规划和执行安全测试是一个重要的问题&a…

Microsoft Excel中HYPERLINK函数的6个用途

Excel 在工具栏中提供了自己的内置链接功能。但 HYPERLINK 功能可以让你做更多的事情,比如公司内部网上的工作簿链接、共享服务器、其他驱动器,甚至 Word 文档中的书签。让我们来看看使用这个多功能功能可以做的一切。 HYPERLINK函数的6个用途 链接到电子表格中的单元格链接到…

概率论:方差、标准差、协方差、皮尔逊相关系数、线性相关

方差和标准差&#xff1a; 一个随机变量&#xff0c;的值的变化程度可以用方差计算&#xff1a; &#xff1b;其中 是期望。 我们举个例子&#xff1a; 服从均一分布&#xff0c;取值为0.1&#xff0c;0.2&#xff0c;0.3&#xff0c;0.4&#xff0c;0.5 &#xff0c;每种值…

springboot 精华

一、基础 官方文档地址&#xff1a;Spring Boot 注&#xff1a;以下部分例子 有些用到 .properties 方式&#xff0c;有些用 .yml方式&#xff0c;两者可自行学习&#xff0c;这里部分是为了省空间而写 .properties 方式。 1、泛谈 &#xff08;1&#xff09;优势 快速构建…

MyBatis Plus 拦截器实现数据权限控制(完整版)

一、说明 变化&#xff1a;相比于之前写的数据权限拦截器&#xff0c;新增了白名单功能&#xff0c;通过注解的方式让哪些SQL不进行数据权限拦截&#xff0c;之前的文章地址 思路&#xff1a;通过MyBatisPlus的拦截器对每个要执行的SQL进行拦截&#xff0c;然后判断其是否为查询…

勒索病毒远程桌面——防御方案

一、适用目标&#xff08;校园网、企业网&#xff0c;windows系列的操作系统&#xff09;&#xff1a; 所有在局域网内运行windows系统的电脑&#xff0c;并非只感染服务器操作系统&#xff0c;单机照样感染。会将你电脑中的所有文件全部加密&#xff0c;部分已感染案例有2个共…

常见的存储类型:DAS vs SAN vs NAS

什么是存储 你有想过你在朋友圈分享的照片都存在哪里&#xff1f;你在视频网站上浏览的视频都存放在哪里&#xff1f;甚至&#xff0c;你在银行卡里的存款、房贷是如何随时查询、随时存取的&#xff1f; 没错&#xff0c;这些照片、视频&#xff0c;甚至你的存款、房贷的数值…

机器学习-6 支持向量机

支持向量机 算法概述算法流程线性分类线性可分性向量内积硬间隔分类软间隔SVM模型非线性支持向量机非线性的情况非线性支持向量机核函数 SVM优点 算法步骤线性可支持向量机的程序流程图SVM算法步骤 算法实例有关数据集利用Sklearn的datasets模块生成数据集其他生成数据集的方法…

BIM与点云:一种基于航空LiDAR点云的大规模建筑重建

文章&#xff1a;City3D: Large-Scale Building Reconstruction from Airborne LiDAR Point Clouds 作者&#xff1a;Jin Huang , Jantien Stoter , Ravi Peters and Liangliang Nan 编辑&#xff1a;点云PCL 来源&#xff1a;arXiv2023 欢迎各位加入知识星球&#xff0c;获取P…

GeoServer SQL注入漏洞复现(CVE-2023-25157)

0x01 产品简介 GeoServer是一款开源的地理数据服务器软件&#xff0c;主要用于发布、共享和处理各种地理空间数据。它支持众多的地图和空间数据标准&#xff0c;能够使各种设备通过网络来浏览和使用这些地理信息数据。 0x02 漏洞概述 GeoServer在预览图层的时候&#xff0c;可…

Ubuntu20.04平台下使用二进制包部署MongoDB-6.0.4单实例

文章目录 1.1 准备服务器的基本信息1.2 操作系统上创建其用户1.3 部署MongoDB服务端1.4 部署MongoDB客户端1.5 部署MongoDB 27017实例1.5.1 创建相关目录1.5.2 准备配置文件1.5.3 准备启停脚本1.5.4 进行启停测试1.5.5 加入开机自启动 1.6 创建超级管理员用户1.6.1 创建本地的超…

do..while、while、for循环反汇编剖析

1、循环语句重要特征提取 循环语句最重要的特点就是执行的过程中会往上跳&#xff01;&#xff01;&#xff01; 箭头往上跳的一般都是循环语句&#xff0c;比如下面的for循环&#xff1a; 2、do..while语句反汇编 #include<iostream> using namespace std; #pragma …

【SpinalHDL快速入门】2、新建SpinalHDL工程,通过计数器Demo快速上手

文章目录 新建工程各个工具版本build.sbt 示例build.properties 示例如何在IEDA中更新 SpinalVersion 并 Reload sbt Project SpinalHDL入门例子&#xff1a;计数器demo1demo2&#xff08;支持reset信号异步复位&#xff0c;低电平有效&#xff09;demo3&#xff08;一个文件&a…

Flume学习--1、Flume概述、Flume入门、

1、Flume概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。Flume基于流式结构&#xff0c;灵活简单。 Flume最主要的作用就是实时读取服务器本地磁盘的数据&#xff0c;将数据写入到HDFS。 1.2…

C#winform多国语言应用实例

我们在开发项目中,一般需要软件支持多种语言,供不同客户使用。本文实例讲解实现办法。 1 窗体项目创建 添加控件MenuStrip、comboBox及Button,并修改对应显示文本,combobox编辑项输入英语 确定窗体的Localizable属性为true,自动创建Form1.resx,为False时,没有Form1.r…

基站机房:保障通信网络稳定,如何解决安全隐患?

基站机房作为无线通信网络的关键组成部分&#xff0c;承载着大量的网络设备和通信设施&#xff0c;对于运营商和通信服务提供商来说具有重要意义。 无论是大型运营商还是通信服务提供商&#xff0c;动环监控系统都将成为他们成功运营和管理通信网络的关键工具。 客户案例 案例…

vue使用高德地图--附带移动获取当前城市信息

高德地图 1.使用准备申请密钥vue使用 2.移动地图获取城市案例(注意事项)3.总结 1.使用准备 申请密钥 登录注册高德开放平台进入控制台 创建应用 申请key–生成key和安全密钥(2021之后key需要配合安全密钥使用) 注意&#xff1a;安全密钥需要在key之前 vue使用 首先在pubil…

一款功能强大的报表引擎-VeryReport报表引擎

在企业管理中&#xff0c;数据分析和决策制定是非常重要的环节。而报表则是这个过程中最常用的工具之一。但是&#xff0c;传统的报表设计与展现方式已经无法满足企业对于数据分析和报表展示的需求。为了解决这些问题&#xff0c;我们向大家推荐一款新一代Web报表软件——VeryR…

越是大型企业越需要企业内部知识库?

随着信息时代的到来&#xff0c;越来越多的企业开始注重知识管理。知识管理是一种通过有效地捕捉、共享和利用企业内部的知识资源&#xff0c;促进企业创新和发展的方法。而企业内部知识库作为知识管理的一种重要方式&#xff0c;对于大型企业来说尤为重要。 一、大型企业内部…

苹果相关网站和服务器状态

https://www.apple.com.cn/cn/support/systemstatus/