Почему атрибут не добавляется в модель?

170
29 декабря 2018, 01:50

Не судите строго, ошибка в какой-то мелочи наверное. Есть view.jsp, кусок интересующего кода вот:

<h1 class="tab"> View parts of details  </h1>
<c:if test="${!empty detailList}">
<table class="tab">
    <tr>
        <th width="200">Name</th>
        <th width="80">Required</th>
        <th width="60">Count</th>
        <th width="60">Edit</th>
        <th width="60">Delete</th>
    </tr>
    <c:forEach items="${detailList}" var="detail">
        <tr>
            <td>${detail.name}</td>
            <td>${detail.required}</td>
            <td>${detail.count}</td>
            <td><a href="<c:url value='/edit/${detail.name}/${page}/${detailList.size()}/${nameoflist}'/>">Edit</a></td>
            <td><a href="<c:url value='/delete/${detail.id}/${page}/${detailList.size()}/${nameoflist}'/>">Delete</a></td>
        </tr>
    </c:forEach>
</table>
</c:if>

из строки со ссылкой, а конкретно вот этой:

<td><a href="<c:url value='/edit/${detail.name}/${page}/${detailList.size()}/${nameoflist}'/>">Edit</a></td>

Перебрасывает в контроллер, конкретно вот сюда:

@GetMapping("/edit/{name}/{page}/{dlist}/{nameoflist}")
public String edit(Model model,
                   @PathVariable("name") String name,
                   @PathVariable("page") int page,
                   @PathVariable("dlist") int dlist,
                   @PathVariable("nameoflist") String nameoflist){
    Detail detailForEdit = serviceClassDetail.findByName(name);
    System.out.println(detailForEdit.getName() + detailForEdit.getId() + detailForEdit.getCount()); 
    String str = serviceClassDetail.creatRedirectForEditDelete(dlist, nameoflist, page);
    model.addAttribute("detailForEdit", detailForEdit);
    return str; // "redirect:/[nameoflist]?=[page]"
}

Из которой редиректится обратно в view. Однако когда я пытаюсь достать там эту переменную, ее там не оказывается вообще. Где и что я не правильно делаю?

Пытаюсь просмотреть эти данные во вьюхе просто:

<c:if test="${detailForEdit != null}">
<a> ${detailForEdit.name} </a>
</c:if>
<a> detailForEdit =  ${detailForEdit.name} </a>

PS: описание логики: при нажатии на edit, я знаю какой элемент мне нужно изменить, перехожу в контроллер-гет-маппинг, там достаю данные для изменений и хочу их подставить во вьюху для уже последующих изменений, редиректюсь туда, но туда эти данные через модель не приходят, почему? Да, sout в контроллере это для проверки, что данные там действительно есть.

Answer 1

Спринг никогда не делает редирект на вью, он использует диспатчер сервлет для направления в JSP. Потому, что JSP - это сервлет, который создается автомвтически после компиляции JSP.

Если вы будете использовать шаблонизатор типа thymeleaf или freemarker, или velocity то тогда после обработки контент сразу пишется в ответ и вам не придется перенаправлять один сервлет на другой.

Как использовать шаблонизатор thymeleaf можно почитать здесь. Что касается freemarker и/или velocity то почитать можно тут. То есть для конкретного шаблонизатора надо выбрать соответствующий вью резолвер.

Если вы еще хотите продолжать использовать JSP для вью, то вашу проблему лучше всего решать если использовать тэги <spring> вместо JSTL. Обратите внимание на то каким образом данные связываются с моделью.

Если вам непонятна суть использования редиректа, то следует почитать здесь каким образом и когда следует, используя методы POST/GET для запросов, развивать PRG паттерн. Этот паттерн часто используется в CRUD приложениях, когда данные из формы после add/edit сабмитятся в контроллер и и он перенаправляет на другой контроллер для просмотра/показа добавленных/измененных данных.

READ ALSO
Как показать изображение оффлайн в FirebaseDatabase

Как показать изображение оффлайн в FirebaseDatabase

Вот мой код! Приложение запоминает имя и статус чтобы показать их оффлайн но как мне сохранить изображение чтобы показать их оффлайнЗаранее...

174
Регистрация servlet в jetty 9: StackOverFlow при отсутствии DefaultServlet

Регистрация servlet в jetty 9: StackOverFlow при отсутствии DefaultServlet

Я запускаю Jetty сервер и пытаюсь зарегистрировать сервлетВот в таком виде все работает:

174
Fullscreen при смене одного Activity на другое Activity

Fullscreen при смене одного Activity на другое Activity

Пытаюсь сделать приложение на полный экран (для всех активити)Создал абстрактный FullscreenActivity и наследую от него остальные активити

177
После сборки проекта maven пропадает папка resources

После сборки проекта maven пропадает папка resources

До сборки проекта путь к ресурсам такой "src/main/resources/", после сборки этот путь уже не работает, тк в файле jar ресурсы находятся в самом начале

152