WedX - журнал о программировании и компьютерных науках

Как связать два объекта в результате jsp?

У меня есть контроллер, который получает все новости из базы данных и в то же время считает количество комментариев к каждой из новостей, но у меня есть проблема, потому что даже когда данные правильно вытаскиваются из базы данных, 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;
}

Вот результат консоли:

Вот JSP:

И вот результат (0 за все комментарии, когда это не так):

<table class="table table-hover">                               
    <c:forEach var="statusUpdate" items="${page.content}">
        <tr>
            <td>
                <ul class="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>

введите здесь описание изображения

Проблема в том, как добавить

@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;
}
в модель.

24.03.2017

Ответы:


1

Каждый раз, когда вы устанавливаете новое значение с тем же именем: commentscouner. Поэтому каждый раз, когда вы переопределяете значение, добавленное на предыдущей итерации цикла. Это означает, что когда цикл завершится, модель будет содержать только последнее значение countComments. И если последнее значение равно 0, JSP выведет 0 для всех записей.

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);
}

Таким образом, вы должны хранить количество комментариев для каждого StatusUpdate отдельно. Например на карте:

Теперь в JSP вы можете выводить значения карты:

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);

Идеальное исправление. Большое спасибо.

<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>
25.03.2017
  • !!!!!! STATUSUPDATECONTROLLER: viewOneStatus : Количество комментариев: 2 !!!!! VIEWSTATUS statusUpdate: StatusUpdate [id = 98, title = Title97, text = обновление статуса 97, добавлено = 28.06.2017 12:52:04.0, siteUser = SiteUser [id = 1, email = [email protected], 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 DEBUG 1088 -- [nio-8080-exec-6] org.hibernate.SQL: выберите count(comment0_.id) как col_0_0_ из комментариев comment0_ левое внешнее соединение status_update statusupda1_ on comment0_.statusupdateid=statusupda1_.id, где statusupda1_.id=? Гибернация: выберите count(comment0_.id) как col_0_0_ из комментариев comment0_ left external join status_update statusupda1_ on comment0_.statusupdateid=statusupda1_.id, где statusupda1_.id=? !!!!!! STATUSUPDATECONTROLLER: viewOneStatus: Количество комментариев: 1 !!!!! VIEWSTATUS statusUpdate: StatusUpdate [id = 97, title = Title96, text = обновление статуса 96, добавлено = 27.06.2017 12:52:04.0, siteUser = SiteUser [id = 1, email = [email protected], 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 DEBUG 1080 -- [nio-8080-exec-6] org.hibernate.SQL: выберите count(comment0_.id) как col_0_0_ из комментариев comment0_ левое внешнее соединение status_update statusupda1_ on comment0_.statusupdateid=statusupda1_.id, где statusupda1_.id=? Гибернация: выберите count(comment0_.id) как col_0_0_ из комментариев comment0_ left external join status_update statusupda1_ on comment0_.statusupdateid=statusupda1_.id, где statusupda1_.id=? !!!!!! STATUSUPDATECONTROLLER: viewOneStatus : Количество комментариев: 0 !!!!! VIEWSTATUS statusUpdate: StatusUpdate [id = 96, title = Title95, text = обновление статуса 95, добавлено = 26.06.2017 12:52:04.0, siteUser = SiteUser [id = 1, email = [email protected], 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 DEBUG 1082 -- [nio-8080-exec-6] org.hibernate.SQL: выберите count(comment0_.id) как col_0_0_ из комментариев comment0_ левое внешнее соединение status_update statusupda1_ on comment0_.statusupdateid=statusupda1_.id, где statusupda1_.id=? Гибернация: выберите count(comment0_.id) как col_0_0_ из комментариев comment0_ left external join status_update statusupda1_ on comment0_.statusupdateid=statusupda1_.id, где statusupda1_.id=? !!!!!! STATUSUPDATECONTROLLER: viewOneStatus : Количество комментариев: 0 !!!!! VIEWSTATUS statusUpdate: StatusUpdate [id = 95, title = Title94, text = обновление статуса 94, добавлено = 25.06.2017 12:52:04.0, siteUser = SiteUser [id = 1, email = [email protected], 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 DEBUG 1084 -- [nio-8080-exec-6] org.hibernate.SQL: выберите count(comment0_.id) как col_0_0_ из комментариев comment0_ левое внешнее соединение status_update statusupda1_ on comment0_.statusupdateid=statusupda1_.id, где statusupda1_.id=? Гибернация: выберите count(comment0_.id) как col_0_0_ из комментариев comment0_ left external join status_update statusupda1_ on comment0_.statusupdateid=statusupda1_.id, где statusupda1_.id=? !!!!!! STATUSUPDATECONTROLLER: viewOneStatus: Количество комментариев: 0 27.03.2017
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]