春天& jQuery:AJAX调用无法找到Controller函数的路径

时间:2015-08-30 16:16:07

标签: java jquery ajax spring spring-mvc

好的,我通过jQuery向Spring Controller提交一个简单的表单。这是代码:

<form id="addNote" role="form" action="addNote" method="POST">
        <div class="form-group error">
            <label for="note">Enter your Note </label>
            <textarea rows="3" cols="50" name="note" class="form-control"
                id="note"></textarea>
        </div>
        <div class="alert alert-danger" style="display: none">
            <strong>Error!</strong> Text length must not exceed 100 characters
        </div>
        <button type="submit" class="btn btn-default">Save Note</button>

$(document).ready(function(){
    $("#addNote").submit(function(e){
        e.preventDefault();
        var formObj = $(this);
        var formURL = "addNote";
        var formData = $("#note").val();
        $.ajax({
            url: formURL,
            type: 'POST',
            data: formData,
            success: function(response){
                alert(response);
            },
            error: function(response){

            }
        });
    });
});

Controller方法:

@RequestMapping(value="/addNote", method=RequestMethod.POST)
public Vector<String> addNote(Locale locale, Model model, HttpServletRequest httpServletRequest, HttpSession httpSession){
    String note = httpServletRequest.getParameter("note");
    notes.add(note);
    ModelAndView mv = new ModelAndView("notes");
    mv.addObject("thenotes", notes);
    return notes;
}

我需要将notes对象返回给jQuery,以便我可以将其作为输出显示出来。但这是我在Chrome控制台中遇到的错误:

enter image description here

显然路径上存在问题。我尝试在jQuery中将var formURL = "addNote";更改为var formURL = "assessment/addNote";,但它不起作用。

但出于某种原因,如果我将Controller中的addNote()函数的返回值更改为ModelAndView并返回mv,那么它可以工作,但它不是jQuery中的响应我需要。

1 个答案:

答案 0 :(得分:0)

首先你使用的是AJAX,所以你不能使用modelAndView返回数据。你必须以xml / json的形式返回数据。

在您的javascript代码中添加以下功能:

function getContextPath() {
       return window.location.pathname.substring(0, window.location.pathname.indexOf("/",2));
    }

参考:How do you get the contextPath from JavaScript, the right way?

然后将formURL更改为:

var formURL = getContextPath()+"/addNote";

通过上述代码请求到达控制器。在控制器中您必须更改您的requestMapping:如果您想要返回一些简单的消息,那么您可以将其作为字符串返回(我不确定它是否是最好的方式,但这就是我这样做的方式)

@RequestMapping(value = "/addNote", produces=MediaType.APPLICATION_XML_VALUE, method = RequestMethod.GET)
        @ResponseBody
        public String showNote(){

            System.out.println("saving note..");

             return "<response>Example</response>";

        }

如果你想将一个Vector或java对象返回给JQuery,那么最好的想法是使用jackson-mapper或一些类似的库,你可以用google轻松找到信息。更简单(不一定是更好的解决方案)就是定义一个方法,通过循环遍历向量来创建xml String,如:

<notes>
<note>note1</note>
<note>note2</note>
</notes>

并将其作为String从控制器返回,然后在JQuery中处理xml。

我也学习春天,所以如果有人知道更好的解决方案,我会乐意阅读它; - )

此致 Mikajlo8

编辑:我已将requestMethod更改为GET,否则您必须处理CSRF TOKENS。如果您想使用POST,很容易在互联网上找到如何处理csrf令牌。