Ajax——异步前后端交互提升OA系统性能体验

本文介绍了Ajax中的基础使用,包括XMLHttpRequest的状态变化、并使用BMI 场景的示例进行介绍,以及结合 DAO 和 Servlet 处理OA系统复杂业务逻辑和JSON数据的处理等等。

本文目录

      • 一、Ajax 基础
        • html页面
      • 二、 XMLHttpRequest
        • XMLHttpRequest的状态变化
        • 同步和异步
      • 三、计算 BMI 场景
      • 四、 如何使用 DAO 和 Servlet 处理复杂业务逻辑
        • 根据 id 查询的 Dao 对象
        • 创建 Servlet
        • 创建请求的页面
      • 五、 JSON 数据处理
        • 接收 json 数据

一、Ajax 基础

html页面

搭建包含用于触发 Ajax 请求元素,如按钮、输入框和显示响应结果区域的 HTML 页面。使用OA用于查询员工绩效的页面为例。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>员工绩效查询</title>
</head>
<body><input type="text" id="employeeId" placeholder="输入员工 ID"><button onclick="getPerformance()">查询绩效</button><div id="performanceResult"></div><script>function getPerformance() {// 请求逻辑}</script>
</body>
</html>

二、 XMLHttpRequest

XMLHttpRequest的状态变化
  • 状态码含义XMLHttpRequest 对象有 5 种状态,0 表示未初始化,1 表示已打开,2 表示已发送,3 表示正在接收,4 表示已完成。可根据状态变化处理不同阶段的逻辑。
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {if (xhr.readyState === 4) {if (xhr.status === 200) {document.getElementById('performanceResult').innerHTML = xhr.responseText;} else {document.getElementById('performanceResult').innerHTML = '请求出错';}}
};
同步和异步
  • 同步:请求发出后,浏览器会等待服务器响应,期间页面会被阻塞,用户无法进行其他操作。例如传统的表单提交。
  • 异步:请求发出后,浏览器不会等待服务器响应,用户可以继续操作页面。使用 Ajax 实现异步请求,可提升用户体验。

三、计算 BMI 场景

  • 原理:通过 Ajax 向服务器发送身高、体重数据,服务器计算 BMI 后返回结果。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>BMI 计算</title>
</head>
<body><input type="text" id="height" placeholder="身高(cm)"><input type="text" id="weight" placeholder="体重(kg)"><button onclick="calculateBMI()">计算 BMI</button><div id="bmiResult"></div><script>function calculateBMI() {const height = document.getElementById('height').value;const weight = document.getElementById('weight').value;const xhr = new XMLHttpRequest();xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {document.getElementById('bmiResult').innerHTML = xhr.responseText;}};xhr.open('GET', `bmiServlet?height=${height}&weight=${weight}`, true);xhr.send();}</script>
</body>
</html>
  • 后端代码Servlet
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/bmiServlet")
public class BMIServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");double height = Double.parseDouble(request.getParameter("height")) / 100;double weight = Double.parseDouble(request.getParameter("weight"));double bmi = weight / (height * height);response.getWriter().write("您的 BMI 是:" + bmi);}
}

四、 如何使用 DAO 和 Servlet 处理复杂业务逻辑

搭建包含数据库连接、DAO 对象和 Servlet 的开发环境,用于处理复杂业务逻辑。下面以员工信息管理为例。

根据 id 查询的 Dao 对象
  • 封装数据库查询操作,根据员工 ID 查询员工信息。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class EmployeeDao {public String getEmployeeInfo(int employeeId) {String info = null;try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/oa_system", "root", "root");PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM employees WHERE id = ?")) {pstmt.setInt(1, employeeId);ResultSet rs = pstmt.executeQuery();if (rs.next()) {info = "姓名:" + rs.getString("name") + ",部门:" + rs.getString("department");}} catch (SQLException e) {e.printStackTrace();}return info;}
}
创建 Servlet
  • 接收前端 Ajax 请求,调用 DAO 对象处理业务逻辑,并将结果返回给前端。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/employeeInfoServlet")
public class EmployeeInfoServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");int employeeId = Integer.parseInt(request.getParameter("employeeId"));EmployeeDao dao = new EmployeeDao();String info = dao.getEmployeeInfo(employeeId);response.getWriter().write(info);}
}
创建请求的页面
  • 输入员工 ID 的输入框和触发查询的按钮,通过 Ajax 发送请求。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>员工信息查询</title>
</head>
<body><input type="text" id="employeeId" placeholder="输入员工 ID"><button onclick="getEmployeeInfo()">查询信息</button><div id="employeeInfoResult"></div><script>function getEmployeeInfo() {const employeeId = document.getElementById('employeeId').value;const xhr = new XMLHttpRequest();xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {document.getElementById('employeeInfoResult').innerHTML = xhr.responseText;}};xhr.open('GET', `employeeInfoServlet?employeeId=${employeeId}`, true);xhr.send();}</script>
</body>
</html>

五、 JSON 数据处理

从数据库查询数据并以 JSON 格式返回给前端。

import com.google.gson.Gson;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@WebServlet("/employeeJsonServlet")
public class EmployeeJsonServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("application/json;charset=UTF-8");List<Map<String, Object>> employeeList = new ArrayList<>();try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/oa_system", "root", "root");PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM employees")) {ResultSet rs = pstmt.executeQuery();while (rs.next()) {Map<String, Object> employee = new HashMap<>();employee.put("id", rs.getInt("id"));employee.put("name", rs.getString("name"));employee.put("department", rs.getString("department"));employeeList.add(employee);}} catch (SQLException e) {e.printStackTrace();}Gson gson = new Gson();String json = gson.toJson(employeeList);response.getWriter().write(json);}
}
接收 json 数据

通过 Ajax 请求获取 JSON 数据,并在页面上显示。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JSON 数据查询</title>
</head>
<body><button onclick="getEmployeeJson()">查询员工 JSON 数据</button><div id="employeeJsonResult"></div><script>function getEmployeeJson() {const xhr = new XMLHttpRequest();xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {const employees = JSON.parse(xhr.responseText);let result = '';employees.forEach(employee => {result += `ID:${employee.id},姓名:${employee.name},部门:${employee.department}<br>`;});document.getElementById('employeeJsonResult').innerHTML = result;}};xhr.open('GET', 'employeeJsonServlet', true);xhr.send();}</script>
</body>
</html>



← 上一篇 Ajax——在OA系统提升性能的局部刷新
记得点赞、关注、收藏哦!
下一篇 JUC小册——公平锁和非公平锁 →

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

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

相关文章

【最后一个单词的长度】

思路 逆向遍历&#xff1a; 从字符串末尾开始向前遍历&#xff0c;跳过末尾的空格&#xff0c;直到找到非空格字符。 遇到非空格字符时开始计数&#xff0c;直到再次遇到空格或字符串开头。 状态标记&#xff1a; 使用 state 标记是否已经进入最后一个单词的计数阶段&#xff1…

OpenCV学习 day3

一、灰度实验 将彩色图像转换为灰度图像的过程称为灰度化&#xff0c;这种做法在图像处理中和计算机视觉领域非常常见 1、灰度图 灰度图是一种 单通道图像&#xff0c;每个像素仅存储 亮度信息&#xff08;0纯黑&#xff0c;255纯白&#xff09;&#xff0c;没有颜色信息&#…

基于单片机一氧化碳CO检测/煤气防中毒检测报警系统

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目速选一览表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目功能速览 概述 基于单片机的CO检测系统通过传感器实时监测环境中的一氧化碳浓度&#xff0c;结合信号处理电路与…

前端-移动Web-day3

目录 1、视口 2、rem体验 3、rem基本使用 4、媒体查询 5、rem适配 6、rem布局 7、less-体验 8、less-注释 9、less-运算 10、less-嵌套 11、less-变量 12、less-导入 13、less-导出 14、less-禁止导出 15、案例-极速问诊 1、视口 <!DOCTYPE html> <htm…

【正点原子K210连载】第二十四章 按键输入实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第二十四章 按键输入实验 本章实验将介绍如何使用CanMV让Kendryte K210获取板载按键的状态。通过本章的学习&#xff0c;读者将学习到在CanMV下读取Kendryte K210的GPIO上的高低电平状态。 本章分为如下几个小节&#xff1a; 14.1 maix.GPIO模块介绍 14.2 硬件设计 14.3 程序设…

基于springboot/java/VUE的旅游管理系统/旅游网站的设计与实现

用户&#xff1a;注册&#xff0c;登录&#xff0c;旅游景点&#xff0c;酒店信息&#xff0c;旅游线路&#xff0c;公告信息&#xff0c;留言板&#xff0c;后台管理&#xff0c;个人中心&#xff0c;门票预订管理&#xff0c;酒店预订管理管理员&#xff1a;登录&#xff0c;…

Python Excel 高阶教程:使用 Spire.XLS 插入、修改和删除迷你图

Python 操作 Word 文档&#xff1a;主流库对比与选择指南 在办公自动化、报告生成、数据处理等领域&#xff0c;利用 Python 程序化地创建、读取或修改 Microsoft Word 文档 (.docx 格式) 是一项非常实用的技能。Python 生态中有多个优秀的库可以完成这项任务&#xff0c;但它…

WebPages PHP:深入解析PHP在网页开发中的应用

WebPages PHP&#xff1a;深入解析PHP在网页开发中的应用 引言 随着互联网技术的飞速发展&#xff0c;PHP作为一种开源的脚本语言&#xff0c;已经在网页开发领域占据了举足轻重的地位。本文将深入探讨PHP在网页开发中的应用&#xff0c;包括其优势、常用框架、开发流程以及未来…

【深度学习】【三维重建】windows11环境配置PyTorch3d详细教程

【深度学习】【三维重建】windows11环境配置PyTorch3d详细教程 文章目录【深度学习】【三维重建】windows11环境配置PyTorch3d详细教程前言确定版本对应关系源码编译安装Pytorch3d总结前言 本人windows11下使用搭建PyTorch3d环境&#xff0c;故此以详细教程以该算法依赖的环境…

SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分离版:日志管理(四)集成Spring Security

目录 一、前言 二、后端开发及调整 1.日志管理开发 2.配置调整 3.日志入库&#xff08;注解、切面&#xff09; 三、前端调整 1.日志管理开发 四、附&#xff1a;源码 1.源码下载地址 五、结语 一、前言 此文章在上次调整的基础上开发后端管理系统的用户请求日志功能&…

ceph 14.2.22 nautilus Balancer 数据平衡

Ceph Balancer (upmap 模式) 启用与配置 在 Ceph Nautilus (14.2.22) 版本中启用和配置 Balancer 的完整步骤 1. 前提检查 检查集群的初始状态和版本。 集群状态 (ceph -s)cluster:id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxhealth: HEALTH_OKservices:mon: 3 daemons, quo…

在Linux上对固态硬盘进行分区、格式化和挂载的步骤

在Linux上对固态硬盘进行分区、格式化和挂载的步骤如下&#xff1a; 插入固态硬盘&#xff1a;将固态硬盘插入计算机的SATA或M.2接口。 确认固态硬盘被识别&#xff1a;打开终端&#xff0c;输入以下命令查看硬盘是否被系统识别 fdisk -l 查找硬盘列表中的固态硬盘&#xf…

用Unity结合VCC更改人物模型出现的BUG

1、上传模型时出现错误经过排查是因为服装发型预制体放到人物模型上之后&#xff0c;物体上自动多了一个空脚本&#xff0c;怀疑是VRC工具箱自动添加的。解决方法&#xff1a;在上传前将带有空脚本的物体上的组件删除即可2、添加头发时出现模型碰撞错误按照【【VRCHAT】从零开始…

k8s之DevicePlugin

解密 Kubernetes Device Plugin&#xff1a;让容器轻松驾驭特殊硬件 在容器化技术飞速发展的今天&#xff0c;容器凭借轻量、隔离、可移植的特性成为应用部署的主流选择。但在实际应用中&#xff0c;当容器需要访问 GPU、FPGA 等特殊硬件资源时&#xff0c;事情就变得不那么简单…

动态规划Day7学习心得

今天给动态规划扫个尾&#xff0c;还有两题。 第一道&#xff1a;647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 暴力解法 两层for循环&#xff0c;遍历区间起始位置和终止位置&#xff0c;然后还需要一层遍历判断这个区间是不是回文。所以时间复杂度&#xff1a;O…

SpringCloud实战:机器人对战系统架构

基于Spring Cloud的机器人对战 以下是基于Spring Cloud的机器人对战实例相关案例和技术实现方向的整理,涵盖微服务架构设计、通信机制及典型应用场景: 分布式对战系统架构 采用Spring Cloud Alibaba+Nacos实现服务注册与发现,每个机器人实例作为独立微服务部署。通过Open…

LLM 核心能力解构与项目实践指南

大语言模型&#xff08;LLM&#xff09;的爆发式发展&#xff0c;本质上是其核心能力在产业场景中的规模化验证。作为技术博主&#xff0c;本文将系统拆解 LLM 的六大核心能力&#xff0c;结合工业级项目案例&#xff0c;提供从能力映射到工程实现的完整技术路径&#xff0c;并…

retro-go 1.45 编译及显示中文

最近做了个使用 retro-go 的开源掌机 基于ESP32-S3的C19掌机&#xff08;适配GBC外壳&#xff09; - 立创开源硬件平台 &#xff0c;做完后用提供的固件发现屏幕反显了&#xff0c;估计是屏幕型号不太对&#xff0c;随即自己拉 retro-go 官方库来编译&#xff0c;拉取的最新的 …

中州养老项目:Mybatis自动填充拦截器

功能:在新增护理项目的时候,创建人,创建时间和修改时间字段会自动拦截填充,这些公共字段可以省去我们一个一个处理的麻烦依靠:AutoFillInterceptor拦截器,MybatisConfig配置类第一步:我们需要借助一个MybatisConfig,configuration标志着这是一个配置类,我们需要将autoFillInter…

[创业之路-527]:什么是产品技术成熟度曲线?

产品技术成熟度曲线&#xff08;Gartner Hype Cycle&#xff09;是由全球知名咨询机构Gartner提出的工具&#xff0c;用于可视化展示新兴技术从诞生到成熟的发展轨迹&#xff0c;以及市场对其预期和实际采用趋势的变化。该曲线通过五个阶段刻画技术生命周期&#xff0c;帮助企业…