从spring控制器返回数据到ajax

时间:2017-05-19 06:55:42

标签: java ajax spring

所以我正在添加购物车以获得" DVD"存储按钮对我的服务器进行ajax调用以访问检查数据库中是否有足够的DVD库存并将其添加到"购物车"在会话中。我觉得我有#34;电话"是的,但不太确定如何让我的弹簧控制器响应"。我基本上只想要一个带有字段的对象" successStatus"和"消息"返回到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;
}
}

2 个答案:

答案 0 :(得分:0)

稍微改变你的控制器

@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则成功。

答案 1 :(得分:0)

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

  

@ResponseBody - 指示方法返回值的注释应该   受到网络响应机构的约束。支持带注释的处理程序   Servlet环境中的方法。

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