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

【JavaWeb学习 | 第21篇】AJAX与JSON详解

【JavaWeb学习 | 第21篇】AJAX与JSON详解

在前面的文章中,我们学习了Servlet + MVCFilterEL + JSTL,页面交互基本都是同步的:提交表单 → 页面整体刷新 → 显示结果。
这种方式用户体验较差(白屏、闪烁),尤其在列表查询、登录校验、实时提示等场景下很不友好。

AJAX(Asynchronous JavaScript and XML)的出现,彻底改变了这一点。它允许异步与服务器通信,在不刷新整个页面的情况下,局部更新数据,大幅提升用户体验。

JSON是目前前后端数据交换最主流的格式,轻量、易解析、跨语言。


一、什么是AJAX?

AJAX 不是一种新技术,而是一种开发技术组合

  • Asynchronous(异步)
  • JavaScript
  • And
  • XML(现在基本被 JSON 替代)

核心原理:通过 JavaScript(XMLHttpRequest 或现代 Fetch API)向服务器发送请求,服务器返回数据后,JavaScript 动态更新页面部分内容。

优点

  • 无页面刷新,体验流畅
  • 减少服务器压力(只传必要数据)
  • 支持局部更新(如搜索提示、点赞、评论等)

缺点

  • 不利于 SEO(搜索引擎抓取困难)
  • 浏览器前进/后退按钮可能失效(需额外处理)
  • 增加了前端代码复杂度

二、JSON(JavaScript Object Notation)

JSON 是一种轻量级数据交换格式,语法简单,人类和机器都易读。

基本语法

{"name":"张三","age":25,"hobbies":["篮球","编程"],"address":{"city":"北京","zip":"100000"},"married":false}

在Java中常用处理库(推荐):

  • Gson(Google,出色,轻量)
  • Jackson(功能强大,Spring 默认使用)
  • Fastjson(阿里巴巴,速度快,但有安全历史问题,谨慎使用)

三、JavaWeb 中 AJAX + JSON 完整示例(用户异步校验用户名是否存在)

1. 前端页面(check.jsp)—— 使用 jQuery(学习阶段推荐,简单易懂)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>异步用户名校验</title> <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script> </head> <body> <h2>注册</h2> 用户名:<input type="text" id="username" placeholder="请输入用户名"> <span id="msg" style="color:red;"></span><br><br> <button onclick="checkUsername()">检查用户名</button> <script> function checkUsername() { var username = $("#username").val(); if (!username) { alert("用户名不能为空!"); return; } $.ajax({ url: "${pageContext.request.contextPath}/checkUsername", // 请求Servlet type: "POST", data: {"username": username}, dataType: "json", // 期望服务器返回JSON success: function(result) { // 请求成功回调 if (result.code === 200) { $("#msg").html("✅ " + result.msg).css("color", "green"); } else { $("#msg").html("❌ " + result.msg).css("color", "red"); } }, error: function() { // 请求失败回调 $("#msg").html("网络错误,请稍后重试").css("color", "red"); } }); } </script> </body> </html>

现代推荐写法(不依赖 jQuery)
使用原生Fetch API(浏览器内置):

fetch('${pageContext.request.contextPath}/checkUsername',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:'username='+encodeURIComponent(username)}).then(response=>response.json()).then(result=>{// 处理 result}).catch(error=>console.error('Error:',error));
2. 后端 Servlet(CheckUsernameServlet.java)
// com.example.web.CheckUsernameServlet.java@WebServlet("/checkUsername")publicclassCheckUsernameServletextendsHttpServlet{@OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{resp.setContentType("application/json;charset=UTF-8");Stringusername=req.getParameter("username");// 模拟业务:调用Service判断用户名是否存在booleanexists=UserService.isUsernameExists(username);// 实际写业务逻辑Map<String,Object>result=newHashMap<>();if(exists){result.put("code",500);result.put("msg","用户名已被注册!");}else{result.put("code",200);result.put("msg","用户名可用!");}// 使用 Gson 转为 JSON 返回(推荐)Gsongson=newGson();Stringjson=gson.toJson(result);resp.getWriter().write(json);}}

使用 Jackson 的写法(更常见于企业项目):

ObjectMappermapper=newObjectMapper();Stringjson=mapper.writeValueAsString(result);
3. 返回的 JSON 示例
{"code":200,"msg":"用户名可用!"}{"code":500,"msg":"用户名已被注册!"}

四、AJAX 核心参数说明(jQuery.ajax)

参数含义说明常用值
url请求地址Servlet路径
type请求方式GET / POST
data发送到服务器的数据对象或字符串
dataType预期服务器返回的数据类型json / text / html
success请求成功时的回调函数function(result){}
error请求失败时的回调函数function(){}
async是否异步(默认true)true / false

五、实际开发最佳实践(2026年视角)

  1. 优先使用 Fetch API 或 Axios(比 jQuery.ajax 更现代)
  2. 统一返回格式(推荐):
    {"code":200,// 业务状态码"msg":"操作成功","data":{...}// 真正的数据}
  3. 前后端分离趋势:传统 JavaWeb(JSP)中 AJAX 仍常用;大型项目推荐Spring Boot + Vue/React + RESTful JSON 接口
  4. 安全注意
    • 服务器端一定要校验参数,防止注入
    • 敏感操作使用 POST + Token/CSRF 防护
    • JSON 中避免直接返回敏感信息
  5. Gson vs Jackson:学习阶段用 Gson 简单;企业项目推荐 Jackson(注解丰富、性能好)。

六、练习建议(必须动手!)

  1. 实现异步用户名唯一性校验(本篇示例)。
  2. 做一个商品搜索提示(输入关键字,AJAX返回匹配商品列表,用JSTL或JS动态渲染表格)。
  3. 实现无刷新分页(点击下一页,AJAX获取数据,局部更新表格)。
  4. 尝试用Jackson替换 Gson,并返回包含 List 的复杂 JSON。
  5. 进阶:前后端完全分离,用纯 HTML + JS 调用 Servlet 返回 JSON(不再用 JSP 渲染)。

系列文章导航(持续更新中):

  • 第19篇:Filter过滤器
  • 第20篇:EL表达式与JSTL标签
  • 第21篇:AJAX与JSON详解(本文)
  • 第22篇:Listener监听器(应用监听、Session监听、在线人数统计等)

下一篇文章预告:我们将学习Listener(监听器),它能监听 ServletContext、HttpSession、ServletRequest 的生命周期和属性变化,是实现“网站在线人数统计”、“Session超时处理”等功能的必备技术。


有任何疑问(比如想看完整注册+校验的代码、Jackson详细用法、或如何用Axios替代jQuery),欢迎在评论区留言,我会及时补充更多示例!

掌握了AJAX + JSON后,你的JavaWeb项目将从“静态刷新”升级为“动态交互”,用户体验迈上一个新台阶!继续加油,你已经越来越接近能独立开发中小型Web项目了!🚀

下一篇文章见~

http://www.jsqmd.com/news/570901/

相关文章:

  • Dramatron:重新定义AI协同剧本创作的技术范式与实践路径
  • 背负式静电喷雾机的设计【solidworks三维、5张cad图纸论文、答辩稿】
  • 3个步骤突破微信小程序渲染瓶颈:pixi-miniprogram的WebGL性能革新实践
  • 当我成功生成了一个cpg并做了可视化,表示汗颜,如果一个函数这么复杂的话,那它可是太复杂了
  • 如何用Mermaid Live Editor高效创建专业技术图表
  • ComfyUI-Custom-Scripts终极指南:20+功能插件提升AI绘画工作流效率
  • 用WSL2+ROS2 Humble给Autoware.universe搭个开发环境:从依赖安装到地图测试的完整流水线
  • NVIDIA Profile Inspector高级显卡配置工具全攻略
  • OpCore-Simplify:让黑苹果配置从复杂到简单的智能转变
  • MyBatisr如何模拟生成Mapper代理对象
  • Windows 11系统优化指南:基于Win11Debloat的一站式性能调校方案
  • STC89C52抢答器DIY避坑指南:从万能板焊接调试到常见故障排查(蜂鸣器不响、按键失灵)
  • 虚拟显示技术多场景适配指南:从驱动配置到性能优化的完整实践
  • 新手告别visio下载困惑,快马AI带你零代码入门流程图设计
  • HTML基本标签的用法第二弹
  • 革新性AI图像引擎:Qwen-Image-Edit-Rapid-AIO全方位应用指南
  • 18-SpringBootLoader原理
  • 千问3.5-2B与Dify平台结合:无需编码快速搭建AI应用
  • 从计算器到编译器:浅谈后缀表达式(逆波兰)在C++实际项目中的应用场景
  • 连云港查找财产线索服务哪家价格便宜 - 工业品牌热点
  • 思源宋体TTF字体终极指南:7种样式免费商用,新手也能快速上手
  • 4种Windows运行Android应用方案测评:轻量工具如何重塑跨平台体验
  • Go Routine 调度器负载均衡机制
  • 【JavaWeb学习 | 第22篇】文件上传下载与 Excel 导入导出
  • 调查财产线索哪家专业,连云港地区有靠谱的吗 - 工业推荐榜
  • 如何高效使用猫抓cat-catch:5个关键技巧完全指南
  • Windows系统性能优化全景指南:从问题诊断到持续优化
  • postman接口自动化如何进行参数化
  • 嵌入式设备OTA升级,如何用RSA-3072和Ed25519给固件‘验明正身’?
  • 轻量级投资决策中枢:TrafficMonitor股票插件的创新实践