Spring 3.0.6 MVC @PathVariable и @RequestParam пустой / пустой в представлении JSP
Я пытался получить невероятно простой контроллер / представление, и просто не могу заставить его работать. В моем web.xml
я определил <servlet>
под названием servlet-context.xml
, который работает нормально. В servlet-context.xml
я установил:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
<...other stuff in here... />
<mvc:annotation-driven />
Помимо всего прочего. Насколько я понимаю, это все, что нужно для использования аннотаций @
.
В моем контроллере у меня есть:
@RequestMapping(value="/student/{username}/", method=RequestMethod.GET)
public String adminStudent(@PathVariable String username, @RequestParam String studentid) {
return "student";
}
И на мой взгляд, у меня есть:
<p>This is the page where you would edit the stuff for ${username}.</p>
<p>The URL parameter <code>studentid</code> is set to ${studentid}.</p>
Когда я делаю запрос к http://localhost:8080/application/student/xyz123/?studentid=456
, я получаю представление, которое ожидаю, но все переменные пустые или нулевые:
<p>This is the page where you would edit the stuff for .</p>
<p>The URL parameter <code>studentid</code> is set to .</p>
Я подозреваю, что это проблема с тем, как мои web.xml
или servlet-context.xml
настроены, но я нигде не могу найти виновника. Насколько я вижу, ни в одном журнале ничего не записано.
Update: я основывал свой код на этой части spring-mvc-showcase :
@RequestMapping(value="pathVariables/{foo}/{fruit}", method=RequestMethod.GET)
public String pathVars(@PathVariable String foo, @PathVariable String fruit) {
// No need to add @PathVariables "foo" and "fruit" to the model
// They will be merged in the model before rendering
return "views/html";
}
...который отлично работает для меня. Я не могу понять, почему этот пример работает, а мой-Нет. это потому, что они делают что-то другое с servlet-context.xml
?
<annotation-driven conversion-service="conversionService">
<argument-resolvers>
<beans:bean class="org.springframework.samples.mvc.data.custom.CustomArgumentResolver"/>
</argument-resolvers>
</annotation-driven>
4 ответа:
Создайте карту модели и добавьте к ней пары имя/значение параметра:
@RequestMapping(value="/student/{username}/", method=RequestMethod.GET) public String adminStudent(@PathVariable String username, @RequestParam String studentid, Model model) { model.put("username", username); model.put("studentid", studentid); return "student"; }
Ага! Наконец-то я все понял.
В
spring-mvc-showcase
используется пружина 3.1, которая автоматически подвергает@PathVariable
S модели, согласноSPR-7543 .Как указали @duffymo и @JB Nizet, добавление к модели с
model.put()
- это то, что нужно сделать для версий Spring более ранних, чем 3.1.Тед Янг указал мне правильное направление с помощьюSpring: Expose @PathVariables to the Model .
@PathVariable
означает, что аннотированный аргумент метода должен быть извлечен из пути вызываемого URL.@RequestParam
означает, что аннотированный аргумент метода должен быть извлечен из параметров запроса. Ни одна из этих аннотаций не приводит к тому, что аннотированные аргументы помещаются в область запроса, сеанса или приложения.Код будет работать, если метод возвращает объект ModelAndView, а модель содержит атрибут
${username}
означает "записать значение атрибута username (найденного в page, или request, или session, или application scope) в ответе". Поскольку вы не включили никакого имени пользователя атрибут в любой из этих областей, он ничего не пишет.username
и атрибутstudentid
.
@PathVariable
заключается в получении некоторого заполнителя из uri (назовем его шаблоном URI) - см. Справочник по пружинам глава 16.3.2.2 шаблоны URI@RequestParam
заключается в получении параметра-см. Spring Reference глава 16.3.3.3 привязка параметров запроса к параметрам метода с помощью @RequestParamПредположим, что этот Url
http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013
(чтобы получить счета для пользователя 1234 на сегодня)@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET) public List<Invoice> listUsersInvoices( @PathVariable("userId") int user, @RequestParam(value = "date", required = false) Date dateOrNull) { model.put("userId", user); model.put("date", dateOrNull); }