【发布时间】:2014-06-30 16:14:49
【问题描述】:
我正在使用 spring 3.1 MVC 创建一个 AJAX 表单。我很困惑,已经在互联网和 stackoverflow 上搜索了我的问题的解决方案,但到目前为止还没有成功。我也在使用 Tiles 2.2.2
我收到警告:不支持请求方法“POST”
控制器方法
@RequestMapping(value="/createProject", method=RequestMethod.POST,headers ="Accept:*/*")
public @ResponseBody Project createProject(@RequestBody Project project){
try {
projectBusiness.createProject(project);
} catch (Exception e) {
e.printStackTrace();
}
return project;
}
@RequestMapping(value="/createProject", method=RequestMethod.GET)
public ModelAndView displayCreateProjectForm(){
ModelAndView mav = new ModelAndView("createProject");
mav.addObject("project", new Project());
return mav;
}
我的 JSP
$(function() {
var url = $('#myForm').attr('action'); //http://localhost:7001/ProjectPortfolioTracker/app/projects/createProject
$('#submitForm').click(function(e){
console.log("hello");
e.preventDefault();
var formData = $('#myForm').serialize();
alert(formData);
console.log('in form click');
$.ajax({
type: 'POST',
url: url,
data:formData,
success: function(){
alert('success');
},error: function(){
alert('failure');
},
}).done(function() {
alert("ajax post completed");
});
});
});
<body>
<h1>Create a Project</h1>
<table>
<form method="post" action="${pageContext.request.contextPath}/app/projects/createProject" id="myForm">
<tr>
<td>Description: </td><td><textarea id="description" name="description" ></textarea></td>
</tr>
<tr>
<td>Category:</td>
<td>
<select name="category">
<option value="marketing">Marketing</option>
<option value="sales">Sales</option>
<option value="accounting">Accounting</option>
</select>
</td>
</tr>
<tr>
<td>Estimated Duration:(in days)</td><td><input id="durationSlider" type="range" min="1" max="90" step="1" value="1"/></td><td><input type="text" id="durationValue" name="estimatedduration" readonly/></td>
</tr>
<tr>
<td>Estimated Cost:(in 100's of dollars)</td><td><input id="costSlider" type="range" min="1" max="500" step="1" value="1" /></td><td><input type="text" id="costValue" name="estimatedcost"readonly/></td>
</tr>
<tr>
<td>Objective:</td><td><textarea id="objective" name="objective"></textarea></td>
</tr>
<tr>
<td>Resources:</td><td><input id="resources" type="number" value="0" name="resources"/> </td>
</tr>
<tr>
<td>Status:</td>
<td>
<select name="status">
<option value="design">Design Stage</option>
<option value="working">Work in Progress</option>
<option value="finished">Finished</option>
<option value="publishing">Publishing</option>
</select>
</td>
</tr>
<tr>
<td>Supports:</td><td><textarea id="supports" name="supports"></textarea></td>
</tr>
<tr>
<td>ManagerID</td><td><input type="number" value="0" id="managerid" name="managerid"/></td>
</tr>
<tr>
<td><button type="submit" id="submitForm">Submit</button></td>
</tr>
</form>
</table>
我还应该提到我通过 ajax 获得了要发布的实际信息,但我没有以 ajax 方式处理控制器代码,这意味着我仍然在方法结束时返回视图,因为更改为使用 @ResponseBody @RequestBody 是问题开始发生的时候
请原谅我仍在学习的可怕格式。
【问题讨论】:
-
当应用启动时,您是否在日志文件中看到任何提及无法为 POST 创建端点的内容?
-
不,但我认为它的设置是由于以下信息:映射“{[/app/projects/createProject],methods=[POST],params=[],headers=[Accept:* /*],consumes=[],produces=[],custom=[]}" 到公共模型上。项目控制器.ProjectController.createProject(model.Project)
-
我的建议是通过 AnnotationMethodHandlerAdapter 类(特别是“handle”方法)进行调试,看看发生了什么。
-
看看你如何将 GET 和 POST 映射到 /createProject(我假设在
/ProjectPortfolioTracker/app/projects/createProject),你能进入 GET 版本好吗?如果是这样,那么我会在 POST 期间在客户端进行调试,以确保它访问了正确的 url。 -
GET 版本运行良好,据我所知,ajax 调用被发布到同一个 url,我在 url 变量中添加了一个 console.log,它应该是 /ProjectPortfolioTracker/应用程序/项目/createProject