1

我是 Spring MVC 的新手。我有一个使用 Spring MVC 和 SimpleController 的现有系统。在提交按钮时,有一个 ajax 调用,它依次调用控制器并返回模型视图对象。

在这种情况下,我有一个问题。此模型视图对象返回一个视图、一个 jsp 页面,并且在成功调用 ajax 时,还会调用 windows.href.location 重定向到另一个 url。有人可以帮我这两个中的哪一个会被调用吗?

视图的 jsp 是否会被渲染,然后会再次重定向到成功函数中指定的 url?

4

2 回答 2

2

@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

于 2013-08-08T18:47:46.283 回答
0

通常,您不希望我们的 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,控件将尝试按名称呈现视图。

于 2013-08-08T19:35:51.343 回答