【问题标题】:How to place Spring MVC's JSON response into the table in jsp?java - 如何将Spring MVC的JSON响应放入jsp中的表中?
【发布时间】:2013-11-08 22:51:24
【问题描述】:

这就是我的 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 对象(即表所在的分区),并将响应对象(即 shoppingCart)设置为 Text。我什至可以像这样设置 shoppingCart 对象的属性:

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

并且对象的totalPrice会显示在看到表格的jsp上。但是如何将这个响应对象直接放到表中呢?正如我已经说过的,如果我可以像任何其他 java 对象一样将响应添加到请求属性中,那么该表将被完成。但是我怎样才能把这个 JSON 对象放入请求中呢?还是真的进了桌子?

【问题讨论】:

    标签: javascript jquery json spring jsp


    【解决方案1】:

    如果您询问如何使用 jsp 渲染 ShoppingCart,那么您需要删除您的 @ResponseBody 注释,而是返回一个值,该值指示您希望用于渲染的视图,例如 @ 987654323@ 与视图名称。

    @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。

    评论后编辑

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

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

    【讨论】:

    • 不,我想留在同一个 jsp 上。我只想更新它的一部分,在哪里可以看到表格。这就是为什么我只想将 JSON 对象返回到同一个视图。
    • 编辑了我的答案。希望对您有所帮助。
    • 我当然不想重绘表格。所以我尝试了你的第二个建议。如果我理解正确,我现在有这个设置:我没有改变我的控制器方法。我没有改变我的剧本。 (你可以看到上面的那些)。我将表格移动到一个单独的jsp。我的 home-jsp(也包含 ajax 调用)看起来像这样
      。它还不起作用。你还有别的意思吗?
    • 但听起来还是不对。我的 shoppingCart.jsp 需要一个名为“shoppingCart”类型的 ShoppingCart 的请求参数。但是我像这样使用 ajax 响应:$('#shoppingCartId').text(response).. 那么这个响应将如何转换为 ShoppingCart 对象呢?我想念……
    • 不,您需要将控制器更改为类似于我的控制器。使用你的,你仍然返回一个转换为 JSON 的对象,但是你需要返回“myTable”,以便结果是可以简单地放置到位的纯 html。当您真正想做的只是呈现 ShoppingCart 的 html 视图时,为什么还需要“转换为 ShoppingCart 对象”的响应?
    猜你喜欢
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2021-08-30
    • 1970-01-01
    • 2016-12-24
    • 2011-05-11
    • 2018-09-07
    相关资源
    最近更新 更多