web-dev-qa-db-fra.com

Spring 3.0.6 MVC @PathVariable et @RequestParam vide / vide en vue JSP

J'ai essayé d'obtenir un contrôleur/une vue incroyablement simple, et je ne peux tout simplement pas le faire fonctionner. Dans mon web.xml, J'ai défini un <servlet> appelé servlet-context.xml, qui fonctionne correctement. Dans servlet-context.xml, J'ai défini:

<?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 />

entre autres. Ma compréhension est que c'est tout ce qu'il faut pour utiliser @ annotations.

Dans mon contrôleur, j'ai:

@RequestMapping(value="/student/{username}/", method=RequestMethod.GET)
public String adminStudent(@PathVariable String username, @RequestParam String studentid) {
    return "student";
}

Et dans mon student.jsp vue, j'ai:

<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>

Lorsque je fais une demande à http://localhost:8080/application/student/xyz123/?studentid=456, J'obtiens la vue que j'attends, mais toutes les variables sont vides ou nulles:

<p>This is the page where you would edit the stuff for .</p>
<p>The URL parameter <code>studentid</code> is set to .</p>

Je soupçonne que c'est un problème avec la façon dont mon web.xml ou servlet-context.xml sont installés, mais je ne trouve le coupable nulle part. Pour autant que je puisse voir, rien n'apparaît dans les journaux.


Mise à jour: je basais mon code sur cette partie de la 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";
}

... ce qui fonctionne bien pour moi. Je ne comprends pas pourquoi cet exemple fonctionne mais le mien ne fonctionne pas. Est-ce parce qu'ils font quelque chose de différent avec servlet-context.xml?

<annotation-driven conversion-service="conversionService">
    <argument-resolvers>
        <beans:bean class="org.springframework.samples.mvc.data.custom.CustomArgumentResolver"/>
    </argument-resolvers>
</annotation-driven>
12
alexmuller

Ah! Enfin compris.

spring-mvc-showcase Utilise Spring 3.1, qui exposera automatiquement @PathVariable Au modèle, selon SPR-754 .

Comme indiqué par @duffymo et @JB Nizet, l'ajout au modèle avec model.put() est la chose à faire pour les versions de Spring antérieures à 3.1.

Ted Young m'a pointé dans la bonne direction avec Spring: Expose @PathVariables To The Model .

7
alexmuller

Créez une carte de modèle et ajoutez-y les paires nom/valeur de paramètre:

@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";
}
17
duffymo

@PathVariable signifie que l'argument de méthode annoté doit être extrait du chemin de l'URL invoquée. @RequestParam signifie que l'argument de méthode annoté doit être extrait des paramètres de la requête. Aucune de ces annotations ne place les arguments annotés dans la portée de la demande, de la session ou de l'application.

${username} signifie "écrire la valeur de l'attribut de nom d'utilisateur (trouvé dans la page, ou la demande, ou la session, ou la portée de l'application) dans la réponse". Puisque vous n'avez inclus aucun attribut de nom d'utilisateur dans aucune de ces étendues, il n'écrit rien.

Le code fonctionnerait si la méthode renvoyait un objet ModelAndView et que le modèle contenait un attribut username et un attribut studentid.

4
JB Nizet

Supposons que cette URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 (pour obtenir les factures de l'utilisateur 1234 pour aujourd'hui)

@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);

}
2
Sudhakar