所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

SpringMVC+Jquery实现Ajax功能:超详细实战步骤+避坑指南

SpringMVC+Jquery实现Ajax功能:超详细实战步骤+避坑指南 一

文章目录CloseOpen

这篇文章直接瞄准这些痛点:不聊虚的理论,只给超详细实战步骤——从SpringMVC环境配置、Jquery的Ajax请求写法,到后端Controller接口的参数接收、JSON数据返回,每一步都有具体代码示例和操作说明;更把大家常掉的“坑”(比如@ResponseBody漏加、contentType设置错误、跨域配置)提前拎出来,告诉你怎么避、怎么解决。

不管你是刚接触SpringMVC的新手,还是想快速搞定Ajax功能的开发人员,不用查零散资料、不用反复调试,跟着这篇指南走,就能顺利跑通前后端异步交互—— 能少踩坑、多省时间的教程,才是真的好用。

你有没有过这种情况?做Java Web项目时想实现异步加载数据,比如点击按钮刷新订单列表、输入手机号自动查用户信息,用原生JS写Ajax总踩坑:要么请求发不出去,要么后端收不到参数,好不容易调通了,返回的JSON又解析不了?去年我帮朋友的线下超市做库存管理系统,就遇到过一模一样的问题——他之前用原生JS写了50多行Ajax代码,结果每次改需求都要翻半天,后来我给他换成SpringMVC+Jquery的组合,不仅代码量减了一半,调试的时候也少了很多麻烦。今天就把我亲测有效的“笨办法”分享给你,不用记复杂的理论,跟着步骤做就能跑通,还能避开我踩过的那些“暗坑”。

为什么选SpringMVC+Jquery做Ajax?先理清真实场景需求

先不说高大上的框架对比,咱们先讲真实项目里的痛点:大部分中小企业的Java Web项目,用的还是SpringMVC做后端框架(毕竟稳定、团队熟悉),前端要做异步交互,总不能让运维再搭个Node.js服务吧?而Jquery的Ajax封装刚好解决了原生JS的“繁琐”——比如原生JS要写XMLHttpRequest、处理状态码、解析响应,Jquery用$.ajax()一行代码就能搞定,就连我那只会写HTML的朋友,看了一遍示例也能跟着写。

我去年帮超市做库存系统时,最直观的感受是:SpringMVC+Jquery的组合“兼容性强”——后端用SpringMVC的Controller接收参数,不用自己解析请求体;前端用Jquery发请求,不用考虑浏览器兼容问题(比如IE的XMLHttpRequest版本差异)。举个例子,超市要做“库存预警”功能:当输入商品编号,前端用Ajax发请求到后端,后端查数据库返回库存数量,前端直接把结果显示在输入框旁边——这个场景用SpringMVC+Jquery简直是“天作之合”:SpringMVC的@ResponseBody注解能直接把Java对象转成JSON,Jquery的success回调能轻松拿到数据,连解析JSON的步骤都省了。

再讲点专业逻辑:Ajax的核心是“异步请求+局部刷新”,而SpringMVC的DispatcherServlet本来就擅长处理HTTP请求,@ResponseBody注解会跳过“视图解析”步骤,直接把响应体返回给前端;Jquery的Ajax方法则帮你封装了“打开连接、发送请求、接收响应”的全过程,甚至连错误处理(error回调)都帮你做好了。不是说Vue或React不好,但对于不想额外学新框架的团队来说,SpringMVC+Jquery是“性价比最高的选择”——毕竟你不用再搭前端工程化环境,也不用教后端同事学Vue的双向绑定。

对了,Spring官方文档里也提到:@ResponseBody是处理异步请求的“标准方案”,它会根据请求头的Accept参数,自动选择合适的消息转换器(比如Jackson转JSON)。我之前没信这个邪,非要用Gson自己写转换器,结果调了3小时才把JSON格式弄对——后来老老实实用Jackson,反而省了很多事。

从0到1实现Ajax:超详细步骤+我踩过的坑

接下来直接上能落地的操作,我把步骤拆成“环境配置→前端代码→后端代码→测试调试”,每一步都附我踩过的坑,帮你少走弯路。

  • 环境配置:别忘加Jackson依赖!我曾因为这个调了2小时
  • 做Ajax的第一步,不是写代码,是把SpringMVC的JSON转换搞定——因为后端要返回JSON给前端,必须让SpringMVC能把Java对象转成JSON字符串。这一步最容易忘的就是加Jackson依赖,我去年帮超市做系统时,就因为漏加了这个,结果后端返回的是User@123456这种对象toString的结果,前端拿到后根本没法解析。

    直接给你pom.xml里的依赖代码(如果是Maven项目):

    <!-
  • Jackson核心依赖,SpringMVC默认用它转JSON >
  • com.fasterxml.jackson.core

    jackson-databind

    2.15.2 <!-

  • 版本可以选最新的,但要和Spring版本兼容 >
  • 如果是Gradle项目,加这个:

    implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'

    划重点:这个依赖不是“可选”的——SpringMVC的@ResponseBody注解,必须靠Jackson才能把Java对象转成JSON。我之前试过不用Jackson,自己写了个JSON工具类,结果返回的JSON格式总有问题(比如日期变成时间戳),后来还是乖乖加了依赖。

  • 前端Jquery代码:这3个参数错了,后端肯定收不到数据
  • 前端部分其实很简单,但90%的坑都出在参数配置上。我先给你一个能直接用的Jquery Ajax示例,再逐个讲参数的“坑点”:

    // 假设你有个按钮,ID是btnQuery
    

    $("#btnQuery").click(function() {

    //

  • 收集前端参数(比如商品编号)
  • var productId = $("#productId").val();

    //

  • 发Ajax请求
  • $.ajax({

    url: "/inventory/query", // 后端接口地址(对应SpringMVC的@RequestMapping)

    type: "POST", // 请求方式,POST比GET更适合传复杂参数

    contentType: "application/json;charset=utf-8", // 必加!告诉后端传的是JSON

    data: JSON.stringify({ productId: productId }), // 把JSON对象转成字符串(必做)

    dataType: "json", // 预期后端返回JSON格式

    success: function(response) {

    //

  • 成功回调:把结果显示在页面上
  • if (response.code === 200) {

    $("#stockNum").text(response.data.stockNum); // 显示库存数量

    $("#warning").text(response.data.warningMsg); // 显示预警信息

    } else {

    alert("查询失败:" + response.msg);

    }

    },

    error: function(xhr, status, error) {

    //

  • 错误回调:比如网络问题、后端报错
  • alert("请求失败:" + error);

    }

    });

    });

    我帮超市调代码时,最常遇到的3个“参数坑”,你一定要避开:

  • 坑1:没加contentType: "application/json;charset=utf-8":Jquery默认的contentTypeapplication/x-www-form-urlencoded(表单格式),如果后端用@RequestBody接收JSON参数,会直接报400错误(“请求格式不正确”)。我去年第一次写的时候就忘加了,结果后端同事说“没收到你的参数”,查了半小时才发现是这个问题。
  • 坑2:data没转成字符串:Jquery的data参数如果是JSON对象,会自动转成表单格式(比如productId=123),但如果后端要JSON格式,必须用JSON.stringify()转成字符串——我之前没转,结果后端用@RequestBody接收时,一直提示“JSON格式错误”。
  • 坑3:dataType设错:如果后端返回的是JSON,dataType要设为json,不然Jquery会把响应当成字符串,你用response.code会报错(因为字符串没有code属性)。我之前做的时候把dataType写成了text,结果前端拿到的是"{"code":200,"data":{"stockNum":10}}"这种字符串,解析了半天才弄对。
  • 后端SpringMVC代码:@RequestBody和@RequestParam别搞混!
  • 后端的核心是接收前端参数→处理业务→返回JSON,这里最容易混淆的是@RequestBody@RequestParam的用法——我之前就犯过傻:把前端传的JSON参数用@RequestParam接收,结果一直报400错误,后来查了Spring文档才明白:

  • @RequestBody:用来接收JSON格式的参数(比如前端用contentType: "application/json"传的参数),会把请求体里的JSON字符串转成Java对象。
  • @RequestParam:用来接收表单格式URL参数(比如/query?productId=123),适合传简单参数。
  • 直接给你能跑通的后端代码示例(以“查询库存”为例):

    第一步:定义返回结果的Java类(统一响应格式)

    为了让前端好处理,后端最好返回统一的JSON结构,比如:

    public class Result {
    

    private Integer code; // 状态码:200成功,400参数错误,500服务器错误

    private String msg; // 提示信息

    private T data; // 具体数据(比如库存信息)

    // 构造方法、getter/setter省略, 写静态方法简化调用

    public static Result success(T data) {

    Result result = new Result();

    result.setCode(200);

    result.setMsg("成功");

    result.setData(data);

    return result;

    }

    public static Result fail(String msg) {

    Result result = new Result();

    result.setCode(400);

    result.setMsg(msg);

    return result;

    }

    }

    第二步:写SpringMVC的Controller

    import org.springframework.web.bind.annotation.;
    

    @RestController // 等价于@Controller + @ResponseBody,所有方法都返回JSON

    @RequestMapping("/inventory") // 父路径,对应前端的url

    public class InventoryController {

    // 假设你有个库存服务类(@Service注解的)

    private final InventoryService inventoryService;

    // 构造方法注入(Spring推荐)

    public InventoryController(InventoryService inventoryService) {

    this.inventoryService = inventoryService;

    }

    // 对应前端的POST请求:/inventory/query

    @PostMapping("/query")

    public Result queryInventory(@RequestBody ProductQueryParam param) {

    //

  • 调用服务层查库存
  • InventoryVO inventoryVO = inventoryService.getInventoryByProductId(param.getProductId());

    //

  • 处理业务逻辑(比如判断库存是否低于预警值)
  • if (inventoryVO.getStockNum() < 10) {

    inventoryVO.setWarningMsg("库存不足10件,请尽快补货!");

    } else {

    inventoryVO.setWarningMsg("库存充足");

    }

    //

  • 返回统一结果
  • return Result.success(inventoryVO);

    }

    // 定义接收参数的Java类(对应前端传的JSON)

    static class ProductQueryParam {

    private String productId; // 对应前端的productId

    // getter/setter省略

    public String getProductId() {

    return productId;

    }

    public void setProductId(String productId) {

    this.productId = productId;

    }

    }

    // 定义返回给前端的VO类(库存信息)

    static class InventoryVO {

    private String productId; // 商品编号

    private Integer stockNum; // 库存数量

    private String warningMsg; // 预警信息

    // getter/setter省略

    }

    }

    划重点

  • @RestController代替@Controller:这样所有方法都默认加了@ResponseBody,不用每个方法都写(省代码!);
  • 接收JSON参数一定要用@RequestBody:比如上面的ProductQueryParam类,SpringMVC会自动把前端传的JSON字符串转成这个对象;
  • 返回Result类:前端拿到的JSON结构是{"code":200,"msg":"成功","data":{"productId":"123","stockNum":5,"warningMsg":"库存不足..."}},这样前端处理起来更统一。
  • 测试调试:用这2个工具,5分钟找到问题
  • 代码写好了,怎么快速验证对不对?我常用的2个工具,比Postman还方便:

    工具1:浏览器的“开发者工具”(F12)

    打开页面后按F12,点“Network”标签,然后点击前端的按钮发请求:

  • 看“Name”列:找到你请求的接口(比如query);
  • 点进去看“Headers”:检查Request URL是不是对的,Content-Type是不是application/json
  • 看“Response”:检查后端返回的JSON是不是你预期的结构(比如有没有codedata字段)。
  • 我去年调库存系统时,就用这个工具发现了“后端返回的warningMsg是空的”——后来查服务层代码,才发现我把“预警值”写成了20而不是10,改完就好了。

    工具2:Postman(用来单独测后端接口)

    如果前端还没写好,或者想单独测后端接口,可以用Postman发请求:

  • 选择POST方法,输入接口地址(比如http://localhost:8080/inventory/query);
  • 点“Body”→“raw”→选择“JSON”格式;
  • 输入JSON参数(比如{"productId":"123"});
  • 点“Send”,看返回的结果。
  • 这个工具能帮你快速确认“后端接口是不是正常”——比如如果Postman返回的JSON是对的,那问题肯定在前端;如果Postman也返回错误,那就是后端的问题(比如没加Jackson依赖、Controller的路径写错了)。

    最容易踩的5个“暗坑”:我用3小时才解决的问题,你1分钟就能避开

    最后给你整理一个“避坑表”,都是我实际做项目时踩过的,看完能省很多调试时间:

    常见错误 错误原因 解决方法
    后端返回字符串而不是JSON 没加Jackson依赖,或依赖版本不兼容 在pom.xml里加jackson-databind依赖,版本和Spring对应
    前端传JSON,后端收不到参数 前端没加contentType,或没转JSON字符串 前端加contentType: “application/json”,用JSON.stringify()转数据
    后端报400错误(参数错误) @RequestBody和@RequestParam用反了,或参数名不匹配 JSON参数用@RequestBody,表单参数用@RequestParam;检查Java类的参数名和前端一致
    跨域报错(Access-Control-Allow-Origin) 前端和后端不在同一个域名或端口(比如前端是8081,后端是8080) 在Controller类上加@CrossOrigin注解(或全局配置CORS)
    前端success回调不执行 后端返回的JSON格式不对,或dataType设错了 检查后端返回的JSON是不是有code、msg、data字段;前端dataType设为json

    我猜你现在已经打开IDE开始写代码了——记住,*先跑通最小


    为什么不用原生JS或其他框架,非要选SpringMVC+Jquery做Ajax?

    主要是真实项目里的痛点——大部分中小企业Java Web项目还在用SpringMVC,稳定且团队熟悉,没必要额外搭新框架;而原生JS写Ajax要处理XMLHttpRequest、状态码、浏览器兼容,太繁琐,Jquery的$.ajax()封装了这些步骤,代码量减一半,连只会写HTML的朋友看示例都能跟着做。比如我去年帮朋友的超市做库存系统,他之前用原生JS写了50多行Ajax,改需求要翻半天,换成SpringMVC+Jquery后,调试麻烦少了很多。

    SpringMVC配置JSON转换时,忘加Jackson依赖会有什么后果?

    后果很直接——后端返回的不是JSON字符串,而是Java对象toString的结果(比如User@123456),前端拿到后根本解析不了。我之前试过不用Jackson,自己写JSON工具类,结果日期变成时间戳,格式总出错,后来乖乖加了jackson-databind依赖才解决,版本和Spring兼容就行。

    前端Jquery Ajax里的contentType参数为什么必须设成application/json?

    因为Jquery默认的contentType是application/x-www-form-urlencoded(表单格式),如果后端用@RequestBody接收JSON参数,会直接报400错误(请求格式不正确)。我去年第一次写的时候就忘加了,后端同事说没收到参数,查了半小时才发现是这个问题,设成application/json后,后端才知道要解析请求体里的JSON字符串。

    后端用@RestController还是@Controller?两者有什么区别?

    优先用@RestController,它等价于@Controller+@ResponseBody,所有方法都默认返回JSON,不用每个方法都写@ResponseBody,省很多代码。比如之前用@Controller时,我漏写过@ResponseBody,结果后端返回了视图路径,前端拿不到数据,换成@RestController后就没再犯这错。

    Ajax请求遇到跨域报错(Access-Control-Allow-Origin),怎么快速解决?

    跨域一般是前端和后端不在同一个域名或端口(比如前端8081,后端8080)。最快的解决方法是在Controller类上加@CrossOrigin注解,后端会允许跨域请求;如果要全局配置,也可以写个CORS配置类。我去年帮超市调代码时就遇到过端口不同的问题,加了@CrossOrigin后马上就好了。

    原文链接:https://www.mayiym.com/49886.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码