【问题标题】:Returning data to ajax from spring controller从spring控制器返回数据到ajax
【发布时间】:2017-05-19 06:55:41
【问题描述】:

所以我让“DVD”存储按钮的添加到购物车对我的服务器进行 ajax 调用,以检查数据库中是否有足够的 DVD 库存并将其添加到会话中的“购物车” .我觉得我的“调用”是正确的,但不太确定如何让我的 spring 控制器“响应”。我本质上只是想要一个带有“successStatus”和“message”字段的对象返回到 ajax显示给用户。

我在 html 中的按钮

 <form method="post">
 <p>Enter quantity you would like to purchase :
<input type="number" id="quantity" name="quantity" step="any" min="1" max="${product.quantityInStock}" value="1"></input>
 </p>
<input type="submit" class="btn btn-primary"  id="addToCart"  name="button" value="Add to cart"/>
<input type="hidden" id="jsonProductId" value='${product.id}'/>
</form>

Ajax 调用

  $("#addToCart").click(function(event) {

        var data = {}
        data["productId"] = $("#jsonProductId").val();
       data["quantity"] = $("#quantity").val();

        $.ajax({
                 type: "POST",
                 contentType: "application/json",
                 url: "addToCart",
                 data: JSON.stringify(data),
                 dataType: 'json',
                 timeout: 600000,
                 success: function (data) {

                     //...
                 },
                 error: function (e) {

                     //...
                 }
        });
  event.preventDefault();

    });

控制器

  @Controller
  @Scope("session")
  public class CartController {
@Autowired
private Cart cart;
@Autowired
ProductService productService;



@RequestMapping(value="/addToCart", method= RequestMethod.POST)
public String searchResults(@RequestBody AddToCartPojo addToCartPojo) {
   //do something
}

@RequestMapping(value="/cart", method= RequestMethod.GET)
public String searchResults(Model model) {
model.addAttribute("cartLines",cart.getLines());
model.addAttribute("cartTotalPrice",cart.getTotalPrice());
    return "cart";
}

AddToCartPojo

public class AddToCartPojo {
private long productId;
private int quantity;

public long getProductId() {
    return productId;
}

public void setProductId(long productId) {
    this.productId = productId;
}

public int getQuantity() {
    return quantity;
}

public void setQuantity(int quantity) {
    this.quantity = quantity;
}
}

【问题讨论】:

    标签: java ajax spring


    【解决方案1】:

    如果您使用@Controller 而不使用@ResponseBody,则在CartController 处理请求后,响应将返回到具有逻辑视图名称的DispatcherServlet(在您的示例中为“cart”)。然后返回视图解析器,根据您的配置准备视图,决定调用哪个配置(JSP、Velocity、PDF 等)。 (例如,使用 cart.jsp 页面)。

    @ResponseBody - 指示方法返回值的注解应该 绑定到 Web 响应正文。支持带注释的处理程序 Servlet 环境中的方法。

    因此,如果您使用@ResponseBody 注释方法,则响应将返回到浏览器,并将作为数据参数在success: function(data) 中可用。

    【讨论】:

      【解决方案2】:

      稍微改变一下你的控制器

      @RestController
      @Scope("session")
      public class CartController {
      
          @Autowired
          private Cart cart;
          @Autowired
          ProductService productService;
      
          @RequestMapping(value="/addToCart", method= RequestMethod.POST)
          public String searchResults(@RequestBody AddToCartPojo addToCartPojo) {
             //do something
      
             String responseMessage = "success";
             return responseMessage;
          }
      }
      

      我添加了@RestController 注释而不是@Controller,这会隐式地将@ResponseBody 添加到此类中的每个方法。

      @Response Body - 指示方法返回值应绑定到 Web 的注解 响应体。支持 Servlet 环境中带注释的处理程序方法。

      无需单独发送状态。相反,可以使用 HTTP 状态。如果你有 200 则成功。

      【讨论】:

      • 非常感谢朋友,我的控制器中是否有任何东西可以通过将其更改为 restcontroller 来改变?我不完全理解实践中的差异。我在哪里可以访问我的 ajax 中的“responseMessage”?
      • 我编辑的控制器中有另一种方法是在购物车页面上显示购物车,不确定@RestController是否会修改其行为
      • 检查success: function (data)data 应该有调用的结果 - 消息。普通控制器应该返回视图名称(要渲染的页面名称)和模型(用于渲染视图的数据)。在我们的例子中,我们只返回 JSON,并且可以在我们的 JS 中使用 JSON
      • 我刚刚添加到帖子中的@RequestMapping(value="/cart", method= RequestMethod.GET) 即使使用restController 也能按预期工作吗?
      猜你喜欢
      • 2018-04-07
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多