【问题标题】:Spring MVC using AJAX使用 AJAX 的 Spring MVC
【发布时间】:2013-08-10 12:47:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: jquery spring jsp servlets spring-mvc


    【解决方案1】:

    @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) { 
        }       
    });
    

    成功回调中的data 变量包含来自呈现的jsp 的所有HTML,这些HTML 包含在HTTP 响应正文中。在上面的方法中,虽然你已经下载了所有的data,但你不会做任何事情。您只需通过重新分配windows.href.location 来更改页面的位置。所以你看到的不是渲染出来的jsp,而是你的someNewLocation指向的网页。

    【讨论】:

      【解决方案2】:

      通常您不希望我们的 ajax 调用返回呈现的页面(即 JSP),而是应该遵循 RFC 2616 - Hypertext Transfer Protocol -- 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);
          }
      
      }
      

      如果您的类路径中有 jackson,使用 @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,控件将尝试按名称呈现视图。

      【讨论】:

      • 请注意,无论发送什么 HTTP 响应正文,浏览器仍然会从您当前的位置移动到 someNewLocation
      • 你能改写一下吗?无论控制器返回 XML、HTML、JSON 还是二进制数据,ajax 函数都会忽略 data 中的内容。所以从这个意义上说,这真的无关紧要。
      猜你喜欢
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      相关资源
      最近更新 更多