Передача параметров от JSP к контроллеру в Spring MVC

Я пытаюсь выполнить образец проекта с помощью Spring аннотированных контроллеров MVC. Все примеры, которые я нашел в сети, привязывают JSP к конкретной модели, и контроллер использует @ModelAttribute для извлечения объекта модели в методе обработчика.

Как мне перейти на передачу других параметров (не присутствующих в объекте Model) с JSP на контроллер? Использую ли я JavaScript для этого? Также может кто-то уточнить, для чего должен использоваться объект HttpServletRequest.

Спасибо.

Ответ 1

Просто удалите "путь" из тега ввода jsp и используйте HttpServletRequest для извлечения оставшихся данных.

Например, у меня есть bean как

public class SomeData {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Затем в jsp я будут добавлены дополнительные поля данных для отправки в обычный тег html

<form:form method="post" action="somepage" commandName="somedata">
    <table>
    <tr>
        <td>name</td>
        <td><form:input path="name" /></td>
    </tr>
    <tr>
        <td>age</td>
        <!--Notice, this is normal html tag, will not be bound to an object -->
        <td><input name="age" type="text"/></td>
    </tr>
    <tr>
        <td colspan="2">
            <input type="submit" value="send"/>
        </td>
    </tr>
</table>
</form:form>

Обратите внимание, что somedata bean имеет поле имени, возраст которого не указан. Поэтому поле возраста добавляется без "пути". Без атрибута пути свойство объекта не будет привязано к этому полю.

на контроллере я должен будет использовать HttpServletRequest, например,

@RequestMapping("/somepage")
public String someAction(@ModelAttribute("somedata") SomeData data, Map<String, Object> map,
                                HttpServletRequest request) {

       System.out.println("Name=" + data.getName() + " age=" + request.getParameter("age"));

       /* do some process and send back the data */
        map.put("somedata", data);
        map.put("age", request.getParameter("age"));

        return "somepage";
   }

при доступе к данным в представлении,

<table>
    <tr>
        <td>name</td>
        <td>${somedata.name}</td>
    </tr>
    <tr>
        <td>age</td>
        <td>${age}</td>
    </tr>
 </table>

somedata - это bean, который предоставляет свойство name, а age - явно установленный атрибут с помощью контроллера.

Ответ 2

Если вы не хотите создавать другой класс (bean), хотя он должен быть там, то кроме @ModelAttrbute можно также использовать @RequestParam.

public String someAction(@RequestParam("somedata") String data)
{
------
}