通常,您不希望我们的 ajax 调用返回呈现的页面(即 JSP),而是应该遵循RFC 2616 - 超文本传输协议 - HTTP/1.1 这是我正在处理的项目中的一个控制器。
@Controller
public class MilestoneController extends BaseRESTController {
protected static final String ACCEPT_JSON = "Accept=application/json";
@Resource private GuidelineService _guidelineService;
@RequestMapping(value="/guideline/{id}/milestones", method= RequestMethod.GET, headers=ACCEPT_JSON)
public @ResponseBody List<Milestone> getMilestones(@PathVariable("id") Long guidelineId) {
return _guidelineService.getGuideline(guidelineId).getMilestones();
}
@RequestMapping(value="/guideline/{id}/milestones/new", method= RequestMethod.GET, headers=ACCEPT_JSON)
public @ResponseBody Milestone addMilestones(@PathVariable("id") Long guidelineId) {
return _guidelineService.newMilestone(guidelineId);
}
@RequestMapping(value="/guideline/{id}/milestones", method={RequestMethod.POST, RequestMethod.PUT}, headers=ACCEPT_JSON)
public @ResponseBody ResponseEntity<String> updateUpdateMilestone(@PathVariable("id") Long guidelineId, @RequestBody Milestone milestone) {
_guidelineService.updateMilestone(guidelineId, milestone);
return new ResponseEntity<String>(HttpStatus.ACCEPTED);
}
}
如果您的类路径中有杰克逊,使用 @ResponseBody 会将您的返回值呈现为 JSON。@RequestBody 将允许您从客户端 POST 和 PUT json。在我的 updateUpdateMilestone() 方法中,您可以看到我不需要返回值,所以我只返回 202 (HttpStatus.ACCEPTED)。
使用@Sotirios 发布的内容
$.ajax({
type: "POST",
url: someUrl,
data: someData,
success: function(data){
windows.href.location = someNewLocation;
},
error: function(X) {
}
});
您的控制器方法需要类似于
@RequestMapping(value="/somePage", method={RequestMethod.POST},
headers="Accept=application/json")
public @ResponseBody String doStuff(@RequestBody SomeObject obj) {
// do stuff here....
return "viewName"
}
如果没有@ResponseBody,控件将尝试按名称呈现视图。