【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")
public class CheckUsernameServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {

        resp.setContentType("application/json;charset=UTF-8");

        String username = req.getParameter("username");

        // 模拟业务:调用Service判断用户名是否存在
        boolean exists = UserService.isUsernameExists(username);  // 实际写业务逻辑

        Map<String, Object> result = new HashMap<>();

        if (exists) {
            result.put("code", 500);
            result.put("msg", "用户名已被注册!");
        } else {
            result.put("code", 200);
            result.put("msg", "用户名可用!");
        }

        // 使用 Gson 转为 JSON 返回(推荐)
        Gson gson = new Gson();
        String json = gson.toJson(result);

        resp.getWriter().write(json);
    }
}

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

ObjectMapper mapper = new ObjectMapper();
String json = 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": { ... }  // 真正的数据
   }
  1. 前后端分离趋势:传统 JavaWeb(JSP)中 AJAX 仍常用;大型项目推荐 Spring Boot + Vue/React + RESTful JSON 接口
  2. 安全注意
  • 服务器端一定要校验参数,防止注入
  • 敏感操作使用 POST + Token/CSRF 防护
  • JSON 中避免直接返回敏感信息
  1. 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项目了!🚀

下一篇文章见~

文章已创建 5295

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部