当前位置: 首页 > 知识库问答 >
问题:

如何在一个jsp结果中链接两个对象?

金谭三
2023-03-14

我有一个控制器,它可以从数据库中获取所有新闻,同时计算每个新闻的评论数,但我有一个问题,因为即使数据正确地从数据库中提取出来,jsp也不会将每个新闻对象与其相应的评论数混合……

这是我的控制器:

@RequestMapping(value = "/viewstatus", method = RequestMethod.GET)
public ModelAndView viewStatus(ModelAndView modelAndView, @RequestParam(name = "p", defaultValue = "1") int pageNumber) {

    Page<StatusUpdate> page = statusUpdateService.getPage(pageNumber);

    for(StatusUpdate statusUpdate: page){

        SiteUser siteUser= statusUpdate.getSiteUser();

        modelAndView.getModel().put("siteuser", siteUser);

        int countComments = commentService.countStatusComments(statusUpdate);

        modelAndView.getModel().put("commentscounter", countComments);
    }

    modelAndView.getModel().put("page", page);

    modelAndView.setViewName("app.viewStatus");

    return modelAndView;
}

以下是控制台结果:

!!!!!!状态更新控制器: 视图一状态 : 计数 del 注释: 2 !!!!!查看状态状态更新: 状态更新 [id=98, title=Title97, 文本=状态更新 97, 已添加=2017-06-28 12:52:04.0, siteUser=SiteUser [id=1, email=test@caveofprogramming.com, plainPassword=null, password=$2a$10$TlfLjCcq8vPZHYkWcZ4rwurnqx5/g5C.5nk3hGTdiG6/cxlx1COPq, enabled=true, firstname=Mike, surname=River, repeatPassword=null, role=ROLE_ADMIN]] 2017-03-24 21:00:23.278 调试 1080 --- [nio-8080-exec-6] org.hibernate.SQL :从注释中选择 count(comment0_.id) 作为col_0_0_comment0_comment0_.statusupdateid=statusupda1_.id 上左外联接status_update statusupda1_,其中 statusupda1_.id=?Hibernate:从注释中选择 count(comment0_.id) 作为col_0_0_ comment0_ comment0_.statusupdateid=statusupda1_.id 上的左外部联接status_update statusupda1_,其中 statusupda1_.id=? !!!!!!状态更新控制器: 视图一状态 : 计数 del 注释: 1 !!!!!查看状态状态更新: 状态更新 [id=97, title=Title96, 文本=状态更新 96, 已添加=2017-06-27 12:52:04.0, siteUser=SiteUser [id=1, email=test@caveofprogramming.com, plainPassword=null, password=$2a$10$TlfLjCcq8vPZHYkWcZ4rwurnqx5/g5C.5nk3hGTdiG6/cxlx1COPq, enabled=true, firstname=Mike, surname=River, repeatPassword=null, role=ROLE_ADMIN]] 2017-03-24 21:00:23.280 调试 1080 --- [NIO-8080-exec-6] org.hibernate.SQL :从注释中选择 count(comment0_.id) 作为col_0_0_comment0_comment0_.statusupdateid=statusupda1_.id 上左外联接status_update statusupda1_,其中 statusupda1_.id=?Hibernate:从注释中选择 count(comment0_.id) 作为col_0_0_ comment0_ comment0_.statusupdateid=statusupda1_.id 上的左外部联接status_update statusupda1_,其中 statusupda1_.id=? !!!!!!状态更新控制器: 视图一状态 : 计数 del 注释: 0 !!!!!查看状态状态更新: 状态更新 [id=96, title=Title95, 文本=状态更新 95, 已添加=2017-06-26 12:52:04.0, siteUser=SiteUser [id=1, email=test@caveofprogramming.com, plainPassword=null, password=$2a$10$TlfLjCcq8vPZHYkWcZ4rwurnqx5/g5C.5nk3hGTdiG6/cxlx1COPq, enabled=true, firstname=Mike, surname=River, repeatPassword=null, role=ROLE_ADMIN]] 2017-03-24 21:00:23.282 调试 1080 --- [nio-8080-exec-6] org.hibernate.SQL :从注释中选择 count(comment0_.id) 作为col_0_0_comment0_comment0_.statusupdateid=statusupda1_.id 上左外联接status_update statusupda1_,其中 statusupda1_.id=?Hibernate:从注释中选择 count(comment0_.id) 作为col_0_0_ comment0_ comment0_.statusupdateid=statusupda1_.id 上的左外部联接status_update statusupda1_,其中 statusupda1_.id=? !!!!!!状态更新控制器: 视图一状态 : 计数 del 注释: 0 !!!!!查看状态状态更新: 状态更新 [id=95, title=Title94, 文本=状态更新 94, 已添加=2017-06-25 12:52:04.0, siteUser=SiteUser [id=1, email=test@caveofprogramming.com, plainPassword=null, password=$2a$10$TlfLjCcq8vPZHYkWcZ4rwurnqx5/g5C.5nk3hGTdiG6/cxlx1COPq, enabled=true, firstname=Mike, surname=River, repeatPassword=null, role=ROLE_ADMIN]] 2017-03-24 21:00:23.284 调试 1080 --- [nio-8080-exec-6] org.hibernate.SQL :从注释中选择 count(comment0_.id) 作为col_0_0_comment0_comment0_.statusupdateid=statusupda1_.id 上左外联接status_update statusupda1_,其中 statusupda1_.id=?Hibernate:从注释中选择 count(comment0_.id) 作为col_0_0_ comment0_ comment0_.statusupdateid=statusupda1_.id 上的左外部联接status_update statusupda1_,其中 statusupda1_.id=? !!!!!!状态更新控制器: 视图一状态 : 计数 del 注释: 0

以下是 JSP:

<table class="table table-hover">                               
    <c:forEach var="statusUpdate" items="${page.content}">
        <tr>
            <td>
                <ul class="html" target="_blank">list-inline posted-info">
                    <li>By
                        <a href="${contextRoot}/profile/${statusUpdate.siteUser.id}">
                            ${statusUpdate.siteUser.firstname}
                            ${statusUpdate.siteUser.surname}
                        </a>
                    </li>
                    <li>Posted</li>
                    <li>
                        <fmt:formatDate pattern="EEEE d MMMM y 'at' H:mm:ss" value="${statusUpdate.added}" />
                    </li>
                </ul>
            </td>
        </tr>
        <tr>
            <td>
                <h2>
                    <a href="${contextRoot}/viewonestatus/${statusUpdate.id}">${statusUpdate.title}></a>
                </h2>
                 <p>${statusUpdate.text}</p> 
            </td>
        </tr>
        <tr>
            <td>
                <ul class="post-shares">
                    <li>
                        <a href="#"> <i class="rounded-x icon-speech"></i>
                            <span>${commentscounter}</span>
                        </a>
                    </li>
                    <li><a href="#"><i class="rounded-x icon-share"></i></a></li>
                    <li><a href="#"><i class="rounded-x icon-heart"></i></a></li>
                </ul>
            </td>
        </tr>                   
    </c:forEach>                                
</table>

下面是结果(不为真时所有评论为0):

共有1个答案

帅德惠
2023-03-14

问题是如何将评论计数器添加到模型中。

for(StatusUpdate statusUpdate: page){
    SiteUser siteUser= statusUpdate.getSiteUser();
    modelAndView.getModel().put("siteuser", siteUser);
    int countComments = commentService.countStatusComments(statusUpdate);

    // next line is a cause of problem
    modelAndView.getModel().put("commentscounter", countComments);
}

每次使用相同名称设置新值时:commentscouner。因此,每次重写在循环的上一次迭代中添加的值时。这意味着当循环完成时,模型将只包含countComments的最后一个值。如果最后一个值是0,则JSP将为所有记录输出0

因此,您必须单独存储每个状态更新的评论计数。例如,在地图中:

HashMap<StatusUpdate, Integer> counterMap = new HashMap<StatusUpdate, Integer>();

for(StatusUpdate statusUpdate: page){
    ...
    int countComments = commentService.countStatusComments(statusUpdate);       
    counterMap.put(statusUpdate, countComments);
}
modelAndView.put("counterMap", counterMap);

现在,在 JSP 中,您可以输出映射的值:

<table class="table table-hover">                               
    <c:forEach var="statusUpdate" items="${page.content}">
        ...
        <tr>
            <td>
                <ul class="post-shares">
                    <li>
                        <a href="#"> 
                            <i class="rounded-x icon-speech"></i>
                            <span>${counterMap[statusUpdate]}</span>
                        </a>
                    </li>
                    <li><a href="#"><i class="rounded-x icon-share"></i></a></li>
                    <li><a href="#"><i class="rounded-x icon-heart"></i></a></li>
                </ul>
            </td>
        </tr>                   
    </c:forEach>                                
</table>
 类似资料:
  • 问题内容: 我有两个完成。我想做以下情形:如果第一个Completable到达onComplete,则继续第二个Completable。最终结果将是第二完成的onComplete。 当我有单个 getUserIdAlreadySavedInDevice() 和Completable login() 时,这就是我的方法: 问题答案: 您正在寻找运营商。 返回一个Completable,它首先运行此C

  • 这是我的一个货车租赁数据库的起始代码。 如何将汽车链接到该位置。例如,CBD的位置有Wicked,Zepplin和Floyd,Penrith有Queen。因此,如果命令行参数具有“打印CBD”,那么它必须显示CBD中可用的货车。 任何帮助将不胜感激。

  • 问题: 给定两个非空链表,表示两个非负整数。数字以相反的顺序存储,每个节点包含一个数字。将这两个数字相加,并以链表形式返回。 您可以假设这两个数字不包含任何前导零,除了数字0本身。 例子: 建议的解决办法: 产出:[7,0,8]; 为什么以下更改会输出[]列表。 任何建议都会有帮助。

  • 问题内容: 我有两个桌子:玩具和游戏。 一个小孩可以有多个玩具。一个小孩可以一次参加多个游戏。 我想要一个查询,该查询将为我提供little_kid涉及的玩具和游戏的总数。 基本上,我想要这两个查询的总和: 是否可以在单个SQL查询中获得它?显然,我可以通过编程的方式对它们进行汇总,但这并不是很理想。 (我意识到人为的例子使模式看起来效率低下。让我们假设我们无法更改模式。) 问题答案: 包装它们并

  • 我有两个完整的。我想做以下场景:如果第一个Completable到达onComplete,继续第二个Completable。最终结果将是完成第二个可完成项。 这就是我在使用单getUserIdAlreadySavedInDevice()和Compltable login()时的做法:

  • 在使用RxJs时,一个非常常见的问题似乎是希望一个或多个观测值的结果在后续的观测值中使用它们。 e、 g.在伪代码中(这不是rx或有效的js语法) 这可以通过一种丑陋的方式来实现,你可以订阅这两个网站,然后在另一个网站中调用其中一个。。然而,这是非常混乱的,不能给你太多的灵活性。 例如(真实语法) 这也意味着,当您完成这两个可观察的内容时,没有任何其他内容可以轻松地使用此流。 我的特定用例需要以下

  • 问题内容: 我正在尝试以下查询: 那是三个查询卡在一起,有点儿。但是,返回的结果集将反映查询3的结果,而不是查询1的结果。 有什么方法可以对它们进行优先级排序,以使查询#1的结果全部相同,查询#2的结果全部相同,然后查询#3的结果全部相同?我现在还不想在PHP中执行此操作(更不用说必须控制在第一个查询中显示的结果而不在第二个查询中显示等等)。 问题答案: 也许您应该尝试包括第四列,说明它来自的表,

  • 我正在尝试将我的两个Android布局连接起来,并完成这个过程。 MainActivity.java 记录活动。Java语言 content_main.xml recording.xml AndroidManifest。xml 堆栈跟踪04-22 14:24:09.415 4470-4470/andler.java:102E/AndroidRuntime: FATAL EXCEPTION: mai