好的,我通过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控制台中遇到的错误:
显然路径上存在问题。我尝试在jQuery中将var formURL = "addNote";
更改为var formURL = "assessment/addNote";
,但它不起作用。
但出于某种原因,如果我将Controller中的addNote()
函数的返回值更改为ModelAndView
并返回mv
,那么它可以工作,但它不是jQuery中的响应我需要。
答案 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令牌。