Контроллер spring не передает параметр jsp для отображения в качестве входного значения

Я работал над учебником по созданию простого весеннего веб-приложения.

В приложении у меня есть список задач, успешно отображаемых из репозитория CRUD в представлении JSP. В этом представлении списка задач у меня есть возможность ОБНОВИТЬ отдельную задачу.

Проблема в том, что представление формы обновления не извлекает атрибуты задачи во входном значении. Я не получаю никаких сообщений об ошибках, поэтому я не понимаю, что мне не хватает.

Контроллер получает атрибуты, так как я могу распечатать их в консоли.

Контроллер:

@GetMapping("/update-tasks")
    public String updateTasks(@RequestParam int id, HttpServletRequest req)  {
        req.setAttribute("tasks", taskService.findTask(id));
        System.out.println(taskService.findTask(id).getDescription()); ----> this is just to test if I was getting the description attribute.
        req.setAttribute("mode", "MODE_UPDATE");
        return "index";
    }

Вид формы обновления JSP:

<c:when test="${mode == 'MODE_NEW'||mode == 'MODE_UPDATE' }" >
            <div class="container text-center">
                <h3>Manage Task</h3>
                <hr>
                <form class="form-horizontal" method="POST" action="save-task">
                    <input type="hidden" name="id" value="${task.id}"/>
                    <div class="form-group row">                        
                        <label class="control-label col-md-3">Name</label>      
                        <div class="col-md-7">              
                            <input type="text" class="form-control" name="name" value="${task.name}"/>
                        </div>          
                    </div>
                    <div class="form-group row">
                        <label class="control-label col-md-3">Description</label>
                        <div class="col-md-7">
                            <input type="text" class="form-control" name="description" value="${task.description}"/>
                        </div>              
                    </div>
                    <div class="form-group row">
                        <label class="control-label col-md-3">Finished</label>
                        <div class="col-md-7">
                            <div class="form-row">
                                <input type="radio" class="col-sm-1" name="finished" value="true"/>
                                <div class="col-sm-1">Yes</div>
                                <input type="radio" class="col-sm-1" name="finished" value="false" checked/>
                                <div class="col-sm-1">No</div>
                            </div>
                        </div>              
                    </div>      
                    <div class="form-group">
                        <input type="submit" class="btn btn-primary" value="Save"/>
                    </div>
                </form>
            </div>  
        </c:when>

Просмотр списка задач JSP. Этот раздел JSP работает с JSTL:

<c:when test="${mode == 'MODE_TASKS' }" >
                <div class="container text-center" id="tasksDiv">
                <h3>My Tasks</h3>
                <hr>
                <div class="table-responsive">

                    <table class="table table-striped table-bordered table-hover"">
                        <thead>
                            <tr class="table-dark">
                                <th>Id</th>
                                <th>Name</th>
                                <th>Description</th>
                                <th>Date created</th>
                                <th>Finished</th>
                                <th></th>
                                <th></th>

                            </tr>
                        </thead>

                        <tbody>
                            <c:forEach items="${tasks}" var="task" >
                                <tr>
                                    <td>${task.id}</td>
                                    <td>${task.name}</td>
                                    <td>${task.description}</td>
                                    <td><fmt:formatDate pattern="yyyy-MM-dd HH:mm:ss" value="${task.dateCreated}"/></td>
                                    <td>${task.finished}</td>
                                    <td><a href="update-tasks?id=${task.id}"><i class="fa fa-pencil" aria-hidden="true"></i></a></td>
                                    <td><a href="delete-tasks?id=${task.id}"><i class="fa fa-trash-o" aria-hidden="true"></i></a></td>
                                </tr>
                            </c:forEach>                
                        </tbody>            
                    </table>

                </div>      
            </div>
        </c:when>
0
0
276
2

Ответы 2

Решение

Я использовал объект ModelAndView для передачи значений из контроллера для просмотра, поэтому теперь мой контроллер обновления выглядит так:

@GetMapping("/update-tasks")
    public ModelAndView updateTasks(@RequestParam int id)  {

        ModelAndView mv = new ModelAndView();
        mv.addObject("task", taskService.findTask(id));
        mv.addObject("mode", "MODE_UPDATE");
        mv.setViewName("index");
        return mv;
    }

Я считаю, что вам нужно будет внести несколько изменений, чтобы он работал.

В контроллере вместо возврата String вы должны вернуть Viewable и передать index.jsp в его конструктор.

@GetMapping("/update-tasks")
@Produces(MediaType.TEXT_HTML)
public String updateTasks(@RequestParam int id, @Context HttpServletRequest req)  {
    req.setAttribute("tasks", taskService.findTask(id));
    System.out.println(taskService.findTask(id).getDescription()); 
    req.setAttribute("mode", "MODE_UPDATE");
    return new Viewable("/index.jsp", null);
}

Спасибо, Амит !!, попробую.

Alonso hernandez 13.09.2018 20:18

Другие вопросы по теме