【问题标题】:How correctly handle an AJAX request using Spring MVC? Why this example can't work in my project?如何使用 Spring MVC 正确处理 AJAX 请求?为什么这个例子不能在我的项目中工作?
【发布时间】:2016-01-20 13:25:39
【问题描述】:

我是 Spring MVC 和 AJAX 的新手,遇到以下问题。

进入页面我的应用程序执行这个执行 AJAX GET 请求的 JavaScript 函数:

function caricaDettaglioRegione(regioneSelezionata) {
    var codiceRegione = regioneSelezionata.getAttribute("data-reveal-id");
    var nomeRegione = regioneSelezionata.getAttribute("data-nome-regione");

    alert("codiceRegione: " + codiceRegione + " - nomeRegione: " + nomeRegione);

    $.ajax({
           type: "GET",
           data: {'codiceRegione' : codiceRegione
                 },
           url: "riepilogoDettaglioRegione",
           contentType:"application/json"

        }).done(function(response) {
            alert("DONE");

        }).error(function(xhr) {
            alert("ERROR");
            manageError(xhr);
        });
}

正如您在 Http GET 请求中看到的那样,该行将 codiceRegione 的值作为请求参数(名为 codiceRegione)传递:

           data: {'codiceRegione' : codiceRegione
                 },

所以现在我想处理这个 AJAX 请求,并且我已经在 @Controller 类中实现了这个控制方法:

@RequestMapping(value = "/riepilogoDettaglioRegione", method = RequestMethod.GET)
public String riepilogoDettaglioRegione(@RequestParam("codiceRegione") String codiceRegione, Model model) {
    System.out.println("INTO riepilogoDettaglioRegione()");

    return "blabla";
}

如您所见,它处理对先前资源 (/riepilogoDettaglioRegione) 的 GET 请求,我尝试通过 @RequestParam("代码区域”)

但是在执行之前的AJAX请求时,它不起作用并且没有执行此方法。

为什么?我错过了什么?我该如何解决这个问题?

Tnx

【问题讨论】:

  • 您确定网址正确吗?

标签: java ajax spring spring-mvc jakarta-ee


【解决方案1】:

您明确表示 codeceRegione 是一个参数而不是请求正文。

因此,您需要更改您的 ajax 调用,例如:

 $.ajax({
       type: "GET",
       url: "riepilogoDettaglioRegione?codiceRegione=blah",
       contentType:"application/json"

    }).done(function(response) {
        alert("DONE");

    }).error(function(xhr) {
        alert("ERROR");
        manageError(xhr);
    });

或者将 codiceRegione 包装在一个对象中,然后将注解 @RequestParam 更改为 @RequestBody。

希望对你有帮助。

【讨论】:

  • 如何将 codiceRegione 包装到一个对象中?
  • 创建一个名为 MyForm 的新类并将其添加到其中 codiceRegione,然后将控制器的签名从 @RequestParam("codiceRegione") String codiceRegione 更改为应该可以工作的 @RequestBody MyForm 表单。跨度>
【解决方案2】:

自己解决。 问题是该项目使用了 Spring Security,并且该资源也必须可供未登录用户访问,因此我必须插入类似这样的内容

<intercept-url pattern="/riepilogoDettaglioRegione" access="permitAll" />

进入 authernticationManager 配置进入 spring-security.xml 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2011-04-22
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多