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 11

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, которая автоматически подвергает @PathVariableS модели, согласноSPR-7543 .

Как указали @duffymo и @JB Nizet, добавление к модели с model.put() - это то, что нужно сделать для версий Spring более ранних, чем 3.1.

Тед Янг указал мне правильное направление с помощьюSpring: Expose @PathVariables to the Model .

@PathVariable означает, что аннотированный аргумент метода должен быть извлечен из пути вызываемого URL. @RequestParam означает, что аннотированный аргумент метода должен быть извлечен из параметров запроса. Ни одна из этих аннотаций не приводит к тому, что аннотированные аргументы помещаются в область запроса, сеанса или приложения.

${username} означает "записать значение атрибута username (найденного в page, или request, или session, или application scope) в ответе". Поскольку вы не включили никакого имени пользователя атрибут в любой из этих областей, он ничего не пишет.

Код будет работать, если метод возвращает объект ModelAndView, а модель содержит атрибут username и атрибут studentid.

Предположим, что этот 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);

}