前后端分离与实现 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后端可以监听 -->
<!-- //原文链接:https://blog.csdn.net/xietansheng/article/details/78704783 -->

<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>Title</title>
		<script>
			function fun() {
				// 创建XMLHttpRequest对象
				var xhr = new XMLHttpRequest();

				// 设置请求类型和URL
				// xhr.open('POST', 'http://example.com/api', true);
				// xhr.open('POST', 'http://localhost:8080/aa', true);
				// xhr.open('POST', '/aa', true);
				// xhr.open('POST', 'http://localhost:8080/aa', true);
				xhr.open('POST', 'http://localhost:8080', true);
				// 设置请求头
				xhr.setRequestHeader('Content-Type', 'application/json');

				console.log("请求头已设置\n");
				// 监听服务器响应

				// 构建JSON对象
				var data = {
					name: 'John',
					age: 25,
					email: 'john@example.com'
				};

				// 将JSON对象转换为字符串
				var jsonData = JSON.stringify(data);

				// 发送数据
				// xhr.send(jsonData);
				// 所有的 send 注释掉就会爆 POST 错误提示
				// xhr.send("6655ookk\n");
				let sendText = document.getElementById("message").value
				
				xhr.send(sendText);
				
				//4、接收及处理响应结果,当服务器响应成功了再获取
				xhr.onreadystatechange = function() { //当xmlhttp对象就绪状态改变时会触发事件
					if (xhr.readyState == 4 && xhr.status == 200) { //请求已完成且响应就绪,响应状态码为200
						alert(xhr.responseText);
						console.log(xhr.responseText);
						console.log("检测的正确的返回\n");
						// 把数据写进网页里,动态增加数据
						// https://blog.csdn.net/jerrcy_fly/article/details/69367264
						// document.write(xhr.responseText);
						// document.write("<h1 id=\"h2\">通过document.write输出内容</h1>");

						// 动态追加数据
						// https://segmentfault.com/q/1010000007420031
						var element = document.getElementById("div1");
						var para = document.createElement("p");
						var node = document.createTextNode("这是新段落。");
						var nodev2 = document.createTextNode(xhr.responseText);
						para.appendChild(node);
						para.appendChild(nodev2);
						element.appendChild(para);

					} else {
						console.log("检测到错误的返回\n");
					}
					console.log("检测到返回函数\n");
				};

			}
		</script>
		
<!-- 这里注释的脚本不会执行 -->
<!-- 	<script>
		var para = document.createElement("p");
		var node = document.createTextNode("这是新段落。");
		para.appendChild(node);

		var element = document.getElementById("div1");
		element.appendChild(para);
	</script> -->

	</head>
	<body>
		<input type="button" value="发送异步请求" onclick="fun();">
		<input type="text" id="message">
		<div id="div1">
			<p>old</p>
		</div>
	</body>
	<!-- 在nody之后放置脚本就会在后面增加数据 可见在body之后执行数据-->
	<script>
		var para = document.createElement("p");
		var node = document.createTextNode("这是新段落。");
		para.appendChild(node);

		var element = document.getElementById("div1");
		element.appendChild(para);
	</script>
</html>

后端

注释的代码 是 JDBC 链接数据库Sqlsserver

但是可以运行,不使用sqlserver2019的代码,只允许原生 java自带的 http服务器也可

package httpWtihSQL;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
//import java.sql.Connection;
//import java.sql.DriverManager;
//import java.sql.PreparedStatement;
//import java.sql.ResultSet;
//import java.sql.SQLException;
//import java.sql.Statement;
import java.util.Arrays;
//import java.util.Scanner;

class Mydata {
	public String str ;

//	解决等于号失败数据被消除的问题
//	public void strcpy(String oldstr) {
//		this.str = new String(oldstr);
//		System.out.println(this.str);
//	}
}

public class httpv5 {

	// 来源
	// https://blog.csdn.net/xietansheng/article/details/78704783

	// 浏览器访问: http://localhost:8080/、http://localhost:8080/bb,输出: Hello World

	// 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
	// 原文链接:https://blog.csdn.net/xietansheng/article/details/78704783

	public static void main(String[] args) throws Exception {

		Mydata mydata = new Mydata();

		// 创建 http 服务器, 绑定本地 8080 端口
		HttpServer httpServer = HttpServer.create(new InetSocketAddress(8080), 0);
		// 创上下文监听, "/" 表示匹配所有 URI 请求

		httpServer.createContext("/", new HttpHandler() {
			@Override
			public void handle(HttpExchange httpExchange) throws IOException {
//				打印请求开头的数据
				System.out.println("addr: " + httpExchange.getRemoteAddress() + // 客户端IP地址
						"; protocol: " + httpExchange.getProtocol() + // 请求协议: HTTP/1.1
						"; method: " + httpExchange.getRequestMethod() + // 请求方法: GET, POST 等
						"; URI: " + httpExchange.getRequestURI()); // 请求 URI

				// 获取请求头
				String userAgent = httpExchange.getRequestHeaders().getFirst("User-Agent");
				System.out.println("User-Agent: " + userAgent);

				// 设置响应内容
//	                byte[] respContents = "Hello World".getBytes("UTF-8");
				byte[] respContents = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" + "<note>\r\n"
						+ "  <to>Tove</to>\r\n" + "  <from>Jani</from>\r\n" + "  <heading>Reminder</heading>\r\n"
						+ "  <body>Don't forget me this weekend!</body>\r\n" + "</note>").getBytes("UTF-8");
				// 设置响应头
				// 参数解释-允许跨域的各个参数
//	              https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Request-Headers
				httpExchange.getResponseHeaders().add("Access-Control-Allow-Origin", "*");
				httpExchange.getResponseHeaders().add("Access-Control-Allow-Headers", "*");
				httpExchange.getResponseHeaders().add("Access-Control-Allow-Methods", "*");
//	              允许接收各种消息头 对应前端 xhr.setRequestHeader('Content-Type', 'application/json');
				httpExchange.getResponseHeaders().add("Access-Control-Request-Headers", "*");
				httpExchange.getResponseHeaders().add("Access-Control-Expose-Headers", "*");
//	              对应前端特定消息头 xhr.setRequestHeader('Content-Type', 'application/json');
				httpExchange.getResponseHeaders().add("Content-Type", "text/html; charset=UTF-8");

				// 设置响应code和内容长度
				httpExchange.sendResponseHeaders(200, respContents.length);

				// 设置响应内容
				httpExchange.getResponseBody().write(respContents);

//	                测试数据
//	                获取数组,把其他的body打印出来,发现是asc码
				byte[] receivev3 = httpExchange.getRequestBody().readAllBytes();
				System.out.println(Arrays.toString(receivev3));

//	                字节流转字符流
				String utf_8 = new String(receivev3, StandardCharsets.UTF_8);
				System.out.println(utf_8);

//				把接收到的数据传出handle,handle回復完消息就會消失,但是数据不想消失,数据还得传出去给数据库,于是就增加字符串,靠一个类实现传出
//				mydata.str = utf_8;

				mydata.str = new String(utf_8);

//				mydata.strcpy(utf_8);

				// 关闭处理器
				httpExchange.close();

//	              来源
//	              https://vimsky.com/examples/detail/java-method-com.sun.net.httpserver.HttpExchange.getResponseHeaders.html

			}

		});

		// 启动服务
		httpServer.start();
//
//		Scanner scanner = new Scanner(System.in);
//		String choose = scanner.next();
//		System.out.println(choose);
//
//		try {
//			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//			Connection con = DriverManager.getConnection(
//					"jdbc:sqlserver://localhost:1433;DatabaseName=cyz;encrypt=true;trustServerCertificate=true", "sa",
//					"sa");
//			System.out.println("数据库链接成功\n");
//
//			Statement stmt = con.createStatement();
//
//			// ? 问号被设定为参数
//			String sql = "select * from borrow where bno=?";
//
//			PreparedStatement pst = con.prepareStatement(sql);
//			// 第一个问号替换为字符串choose
			pst.setString(1, choose);
//			pst.setString(1, mydata.str);
//			System.out.println(mydata.str);
//			// 执行查询
//			ResultSet rsv2 = pst.executeQuery();
//
//			while (rsv2.next()) {
//				System.out.println(rsv2.getString("bno") + "\t" + rsv2.getString("rbdate") + "\t");
//			}
//
//			System.out.println("读取完毕");
//			stmt.close();
//			con.close();
//		} catch (ClassNotFoundException e) {
//			System.out.println("驱动找不到");
//			e.printStackTrace();
//		} catch (SQLException e) {
//			System.out.println("数据库链接不成功");
//			e.printStackTrace();
//		}
	}
}

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

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

相关文章

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源码怎么实现…

程序员修炼之道 07:调试

不记录&#xff0c;等于没读。 这里是我阅读《程序员修炼之道》这本书的记录。 软件缺陷以各种方式表现出来&#xff0c;从对需求的误解到编码错误。现在的计算机系统仍有局限性&#xff0c;能干你让它干的事情&#xff0c;但不一定能干你想让它干的事情。本章介绍调试中涉及的…

基于STC12C5A60S2系列1T 8051单片机实现串口调试助手软件与单片机相互发送数据的RS485通信功能

基于STC12C5A60S2系列1T 8051单片机实现串口调试助手软件与单片机相互发送数据的RS485通信功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串口通信的特殊功…

编译原理总结

编译器构成 1. 前端分析部分 1.1 词法分析 确定词性&#xff0c;输出为token序列 1.2 语法分析 识别短语 1.3 语义分析 分析短语在句子中的成分 IR中间代码生成 2. 机器无关代码优化 3. 后端综合部分 目标代码生成 机器相关代码优化 4. 其他 全局信息表 异常输出

SOCKS 代理 和 HTTP 代理, WebSocket

SOCKS 代理 和 HTTP 代理 的区别 SOCKS 代理 和 HTTP 代理 都是代理服务器&#xff0c;它们充当客户端和目标服务器之间的中介&#xff0c;但它们的工作方式和应用场景有所不同。 1. SOCKS 代理&#xff1a; 工作原理&#xff1a; SOCKS 代理是一种更底层的代理&#xff0c;…

列存在 OceanBase 数据库架构中的应用与演进

OceanBase 4.3 版本上线了列存功能&#xff0c;以满足实时分析的需求。 本文作为《特性解读&#xff1a;列存技术》的后续&#xff0c;将详细阐述列存技术在OceanBase数据库架构中的应用、发展历程&#xff0c;以及未来的趋势。 一、前言 1970 年&#xff0c;关系模型之父 Co…

Java物业管理系统+数据库应用程序开发[JavaSE+JDBC+idea控制台+MySQL]

背景&#xff1a; 使用JavaSEJDBCMySQL技术实现一个物业管理系统&#xff0c;具体要求如下 物业管理系统需求&#xff1a; 需求分析 1.1用户需求分析 在进入系统之前&#xff0c;要进行身份确认&#xff0c;只有用户名和用户密码都相符的用户方可进入本系统&#xff0c;为…

PCL 抛物线回归拟合(Quadratic,二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里仍然是最小二乘法的应用,其推导过程如下所述: 1.二次函数模型: 其中,a、b 和 c 是需要确定的参数。 2.最小二乘法 假设我们有一组数据点 ( x 1 ​ , y