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>
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 .
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";
}
@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
.
@PathVariable
est d'obtenir un espace réservé de l'uri (Spring l'appelle un modèle d'URI) - voir Spring Reference Chapter 16.3.2.2 URI Template Patterns@RequestParam
est d'obtenir un paramètre - voir Spring Reference Chapter 16.3.3.3 Binding request parameters to method parameters with @RequestParamSupposons 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);
}