如何将Spring MVC的JSON响应放入jsp中的表中

How to place Spring MVC's JSON response into the table in jsp?

本文关键字:jsp 响应 JSON Spring MVC      更新时间:2023-09-26
这是我

的AJAX脚本的样子:

<script>
function addToCart(itemId) {
    var url = "./addToCart/" + itemId;
    $.get(url, function(response){
        $('#shoppingCartId').text(response);
    });
}
</script>

它从JSP中获取一个itemId,用这个itemId调用下面的控制器方法。这是控制器方法:

@RequestMapping(value="/addToCart/{itemId}", method=RequestMethod.GET)
public @ResponseBody ShoppingCart addToCart(@PathVariable Long itemId, @ModelAttribute ShoppingCart shoppingCart) {
    Item item = itemService.getItemWithId(itemId);
    if(item != null) {
        shoppingCartService.addItem(shoppingCart, item);
    }
    return shoppingCart;
}

问题是,我想将响应(购物车对象)放入此表中,该表位于同一jsp上。但是怎么做呢?

<div class="span2" id="shoppingCartId">
    <table class="table table-condensed">
        <tr>
            <td><b>#</b></td>
            <td><b>NAME</b></td>
            <td><b>PRICE</b></td>
        </tr>
        <c:forEach items="${shoppingCart.items}" var="item" varStatus="count">
            <tr>
                <td>${count}</td>
                <td>${item.name}</td>
                <td>${item.price}</td>
            </tr>
        </c:forEach>
        <tr>
            <td></td>
            <td></td>
            <td><b>Total Price: {shoppingCart.totalPrice}</b></td>
        </tr>
    </table>
</div>

如果我可以将响应添加到请求属性中,则表将得到满足。但是如何将此对象放入请求中呢?还是实际上进入表格?

我认为问题就在这里,在成功函数中:

function(response){
            $('#shoppingCartId').text(response);
        }

在这里,我获取 shoppingCartId DOM 对象(这是表所在的分区),并将响应对象(即购物车)设置为 Text。我甚至可以像这样设置购物车对象的属性:

function(response){
            $('#shoppingCartId').text(response.totalPrice);
        }

并且对象的 totalPrice 将显示在看到该表的 jsp 上。但是如何将这个响应对象直接放置在表中呢?正如我已经说过的,如果我能像任何其他 java 对象一样将响应添加到请求属性中,那么该表将得到满足。但是如何将此 JSON 对象放入请求中?还是实际上进入表格?

如果您询问如何使用 jsp 渲染ShoppingCart,则需要删除@ResponseBody注释,而是返回一个值,该值指示要用于进行渲染的视图,例如具有视图名称的String

@RequestMapping(value="/addToCart/{itemId}", method=RequestMethod.GET)
public String addToCart(@PathVariable Long itemId, @ModelAttribute ShoppingCart shoppingCart) {
    Item item = itemService.getItemWithId(itemId);
    if(item != null) {
        shoppingCartService.addItem(shoppingCart, item);
    }
    return "yourViewName";
}

在此示例中,"yourViewName"表示要在其中呈现表的 jsp。

评论后编辑

如果你对 JavaScript 对象作为 success() 方法中的response有一些其他需求,那么你需要在客户端从头开始重绘表。但是,如果这样做,则会重复视图呈现工作:在第一次访问时,视图使用 jsp 呈现,但在后续的 ajax 调用中,它使用 jquery 重绘,并且对视图的任何更改都必须在两个位置进行修改。不过,如果要走这条路,则必须逐步执行response对象中的每个必要属性,并创建重建该表所需的相应 HTML 标记。正如您所注意到的,简单地尝试$('#shoppingCartId').text(response);只会用一些废话代替您的桌子;这是因为response没有内置HTML的概念...这只是数据。

为了避免视图渲染重复,我建议您尝试其他方法。<table>...</table>部分应移动到其自己的 jsp,并且您的 ajax 调用应将响应视为文本而不是 json。当你这样做时,你的response对象将是呈现的表格html,然后你可以简单地$('#shoppingCartId').html(response);将旧表换成新表。对于第一次访问,只需将表的 jsp 包含在<div class="span2" id="shoppingCartId">...</div>中即可重复使用。最后,您的视图将始终使用相同的方法呈现,因此您的代码将更加干净。