Quelle est la différence entre @RequestParam
et @PathVariable
lors du traitement des caractères spéciaux ?
+
a été accepté par @RequestParam
comme espace.
Dans le cas de @PathVariable
, +
a été accepté comme +
.
@PathVariable
permet d'obtenir un placeholder de l'URI (Spring appelle cela un URI Template)@RequestParam
permet d'obtenir un paramètre de l'URI - voir [Spring Reference Chapter 16.3.3.3 Binding request parameters to method parameters with @RequestParam][2].Si l'URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013
obtient les factures de l'utilisateur 1234 le 5 décembre 2013, la méthode du contrôleur ressemblerait à ceci :
@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
...
}
[1] : http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-ann-requestmapping-uri-templates [2] : http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-ann-requestparam [3] : https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/PathVariable.html#required--
En outre, les paramètres de requête peuvent être facultatifs et, depuis Spring 4.3.3, les variables de chemin [peuvent également être facultatives][3]. Attention toutefois, cela peut modifier la hiérarchie des chemins d'accès aux URL et introduire des conflits de mappage de requêtes. Par exemple, est-ce que /user/invoices
fournit les factures de l'utilisateur null
ou des détails sur un utilisateur avec l'ID "invoices" ?
Annotation @RequestParam utilisée pour accéder aux valeurs des paramètres de requête de la demande. Regardez l'URL de la requête suivante :
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
Dans la requête URL ci-dessus, les valeurs de param1 et param2 sont accessibles comme suit :
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
Voici la liste des paramètres pris en charge par l'annotation @RequestParam :
@PathVariable
@PathVariable identifie le modèle qui est utilisé dans l'URI pour la demande entrante. Examinons l'URL de la demande ci-dessous :
La requête URL ci-dessus peut être écrite dans votre Spring MVC comme ci-dessous :
@RequestMapping("/hello/{id}") public String getDetails(@PathVariable(value="id") String id,
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
.......
}
L'annotation @PathVariable n'a qu'une seule valeur d'attribut pour lier le modèle d'URI de la requête. Il est possible d'utiliser plusieurs annotations @PathVariable dans une seule méthode. Mais assurez-vous que pas plus d'une méthode n'a le même modèle.
Il existe également une autre annotation intéressante : @MatrixVariable
Et la méthode du contrôleur pour cela
@RequestMapping(value = "/{stocks}", method = RequestMethod.GET)
public String showPortfolioValues(@MatrixVariable Map<String, List<String>> matrixVars, Model model) {
logger.info("Storing {} Values which are: {}", new Object[] { matrixVars.size(), matrixVars });
List<List<String>> outlist = map2List(matrixVars);
model.addAttribute("stocks", outlist);
return "stocks";
}
Mais vous devez l'activer :
<mvc:annotation-driven enableMatrixVariables="true" >
il se peut que le type midia application/x-www-form-urlencoded convertisse l'espace en +, et que le récepteur décode les données en convertissant le + en espace.vérifiez l'url pour plus d'infos.http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1