我是 Spring MVC 的新手。我有一个使用 Spring MVC 和 SimpleController 的现有系统。在提交按钮时,有一个 ajax 调用,它依次调用控制器并返回模型视图对象。
在这种情况下,我有一个问题。此模型视图对象返回一个视图、一个 jsp 页面,并且在成功调用 ajax 时,还会调用 windows.href.location 重定向到另一个 url。有人可以帮我这两个中的哪一个会被调用吗?
视图的 jsp 是否会被渲染,然后会再次重定向到成功函数中指定的 url?
我是 Spring MVC 的新手。我有一个使用 Spring MVC 和 SimpleController 的现有系统。在提交按钮时,有一个 ajax 调用,它依次调用控制器并返回模型视图对象。
在这种情况下,我有一个问题。此模型视图对象返回一个视图、一个 jsp 页面,并且在成功调用 ajax 时,还会调用 windows.href.location 重定向到另一个 url。有人可以帮我这两个中的哪一个会被调用吗?
视图的 jsp 是否会被渲染,然后会再次重定向到成功函数中指定的 url?
@Controller返回一个View或视图名称。将DispatcherServlet使用它View来渲染一个jsp. 它将呈现jsp的内容写入 HTTP 响应正文。这就是您的 AJAX 调用将收到的内容。所以在我假设你有的方法中
$.ajax({
type: "POST",
url: someUrl,
data: someData,
success: function(data){
windows.href.location = someNewLocation;
},
error: function(X) {
}
});
成功回调中的变量包含HTTP 响应正文中包含data的呈现的所有 HTML 。在上面的方法中,虽然你已经下载了它,但你不会对它jsp做任何事情。data您只需通过重新分配来更改页面的位置windows.href.location。所以你看到的不是渲染的,而是你指向jsp的网页。someNewLocation
通常,您不希望我们的 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,控件将尝试按名称呈现视图。