web-dev-qa-db-fra.com

@RequestParam vs @PathVariable

Quelle est la différence entre @RequestParam et @PathVariable lors du traitement de caractères spéciaux?

+ a été accepté par @RequestParam comme espace.

Dans le cas de @PathVariable, + a été accepté comme +.

294
user1857181

Si l'URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 récupère 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) {
  ...
}

En outre, les paramètres de demande peuvent être facultatifs et, à compter de Spring 4.3.3, les variables de chemin peuvent également être facultatives . Attention cependant: cela pourrait modifier la hiérarchie des chemins d'URL et introduire des conflits de mappage des demandes. Par exemple, /user/invoices fournirait-il les factures de l'utilisateur nullou des détails sur un utilisateur portant un identifiant "factures"?

450
Ralph

@ RequestParam annotation utilisée pour accéder aux valeurs du paramètre de requête à partir de la requête. Regardez l'URL de requête suivante:

http://localhost:8080/springmvc/hello/101?param1=10&param2=20

Dans la demande d'URL ci-dessus, les valeurs pour 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:

  • defaultValue - Il s'agit de la valeur par défaut en tant que mécanisme de secours si la demande ne contient pas la valeur ou est vide.
  • name - Nom du paramètre à lier
  • required - Indique si le paramètre est obligatoire ou non. Si c'est vrai, si ce paramètre n'est pas envoyé, cela échouera.
  • value - C'est un alias pour l'attribut name

@ PathVariable

@ PathVariable identifie le modèle utilisé dans l'URI pour la demande entrante. Regardons l’URL de requête ci-dessous:

http: // localhost: 8080/springmvc/hello/101? param1 = 10 & param2 = 2

La demande d'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 valeur d'attribut pour la liaison du modèle d'URI de demande. Il est autorisé d'utiliser plusieurs annotations @ PathVariable dans la méthode unique. Mais assurez-vous qu’une seule méthode a le même schéma.

Il existe également une autre annotation intéressante: @ MatrixVariable

http: // localhost: 8080/spring_3_2/matrixvars/stocks; BT.A = 276,70, + 10,40, + 3,91; AZN = 236,00, + 103,00, + 3,29; SBRY = 375,50, + 7,60, + 2,07

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

<mvc:annotation-driven enableMatrixVariables="true" >
94
Xelian

@RequestParam est utilisé pour le paramètre de requête (valeurs statiques) comme: http: // localhost: 8080/calcul/pow? Base = 2 & ext = 4

@PathVariable est utilisé pour les valeurs dynamiques telles que: http: // localhost: 8080/computing/sqrt/8

@RequestMapping(value="/pow", method=RequestMethod.GET)
public int pow(@RequestParam(value="base") int base1, @RequestParam(value="ext") int ext1){
    int pow = (int) Math.pow(base1, ext1);
    return pow;
}

@RequestMapping("/sqrt/{num}")
public double sqrt(@PathVariable(value="num") int num1){
    double sqrtnum=Math.sqrt(num1);
    return sqrtnum;
}
15
alok

il se peut que le type midia application/x-www-form-urlencoded convertisse l’espace en + , et le destinataire décodera les données en convertissant le + pour space.check l'URL pour plus d'information . http://www.w3.org/TR/html401/interact/forms. html # h-17.13.4.1

0
andy