如何通过ajax从spring控制器获取数据?

Posted

技术标签:

【中文标题】如何通过ajax从spring控制器获取数据?【英文标题】:How can I get data from spring controller by ajax? 【发布时间】:2015-01-03 21:04:06 【问题描述】:

我在 jsp 页面上有一个 ajax 通过 URL /check 调用弹簧控制器。

$.ajax(
    type : "GET",
    url : "$pageContext.request.contextPath/check",
    data : 
    "id" : $articleCount
    ,
    success: function(data)
    //response from controller
    
);

现在,控制器看起来像,

@RequestMapping("/check")
public String check(@RequestParam Integer id, HttpServletRequest request,
        HttpServletResponse response, Model model) 
    boolean a = getSomeResult();
    if (a == true) 
        model.addAttribute("alreadySaved", true);
        return view;
     else
        model.addAttribute("alreadySaved", false);

    return view;

我使用模型发送数据并尝试在success: function(data) 中以"$alreadySaved" 访问它,但它显示为空白。

有什么方法可以在视图页面上接收true/false 数据?

【问题讨论】:

【参考方案1】:

您必须为 spring ajax 调用示例添加 @ResponseBody 注释

@RequestMapping("/check")     
@ResponseBody
public String check(@RequestParam Integer id, HttpServletRequest request, HttpServletResponse response, Model model) 
    boolean a = getSomeResult();
    if (a == true) 
        model.addAttribute("alreadySaved", true);
        return view;
     else 
        model.addAttribute("alreadySaved", false);
        return view;
    

【讨论】:

好的。如何在视图方面获得响应? 表示视图为空。请返回模型对象作为响应。 不,视图不是空的。视图由 springmvc servlet 中的 spring 注入。它是一个解析为加载 JSP 的字符串。 我有一些误解。我现在明白了。谢谢:)【参考方案2】:

使用@ResponseBody

当您添加 @ResponseBody 注释时,Spring 会将返回值绑定到传出的 HTTP 响应正文。

@ResponseBody
public String check(@RequestParam Integer id, HttpServletRequest request, HttpServletResponse response, Model model) 
    boolean a = getSomeResult();
    if (a == true) 
        return "already saved";
     
    return "error exist";

Spring 将使用 HTTP 消息转换器将返回值转换为 HTTP 响应正文 [将对象序列化为响应正文],基于请求 HTTP 标头中使用的 Content-Type。

更多信息:

http://websystique.com/springmvc/spring-mvc-requestbody-responsebody-example/

【讨论】:

【参考方案3】:

控制器部分

您必须为 spring ajax 调用示例添加 @ResponseBody 注释

查看部分

$.ajax(
    type : "GET",
    url : "$pageContext.request.contextPath/check",
    data : 
        "id" : $articleCount
    ,
    success: function(data)
        $('#input_field').val(data);
    
);

【讨论】:

【参考方案4】:

当您尝试从 ajax 请求返回值时,您应该使用 @ResponseBody 注释。由于您的方法返回类型是String,请确保您返回的是字符串值,而不是您对 jsp 的视图。

因为它会再次渲染jsp响应

@ResponseBody
public String check(@RequestParam Integer id, HttpServletRequest request, HttpServletResponse response, Model model) 
    boolean a = getSomeResult();
    if (a == true) 
        return "already saved";
     
    return "error exist";

在你的jsp中,

success: function(data)
    alert(data);

【讨论】:

但我需要从该方法返回视图,因为没有它,spring 将无法加载 jsp。 @najus 不,ajax 的概念是刷新页面的一部分,因此仅发送返回值就足够了。当您加载同一页面时

以上是关于如何通过ajax从spring控制器获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从控制器获取记录到 Ajax laravel 5.2

Codeigniter - 如何从 ajax 获取数据表数据?

如何使用 AJAX 将数据从视图传递到控制器

codeigniter php 和 jquery - 如何从多个表中获取数据并通过 ajax 返回

MVC 从控制器获取数据以使用 AJAX 查看有啥问题?

从 JSON 数据中获取产品 ID 并通过 AJAX 发布