@RequestParam vs @PathVariable

Wat is het verschil tussen @RequestParam en @PathVariable bij het omgaan met speciale tekens?

+ werd door @RequestParam geaccepteerd als spatie.

In het geval van @PathVariable, + werd geaccepteerd als +.

Als de URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 de facturen ophaalt voor gebruiker 1234 op 5 december 2013, dan zou de controller methode er als volgt uitzien:

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List listUsersInvoices(
            @PathVariable("userId") int user,
            @RequestParam(value = "date", required = false) Date dateOrNull) {
  ...
}

Ook kunnen request parameters optioneel zijn, en vanaf Spring 4.3.3 kunnen path variabelen ook optioneel zijn. Pas echter op, dit kan de URL pad hiërarchie veranderen en request mapping conflicten introduceren. Bijvoorbeeld, zou /user/invoices de facturen voor gebruiker null opleveren of details over een gebruiker met ID "invoices"?

Commentaren (14)

@RequestParam annotatie die wordt gebruikt om toegang te krijgen tot de query parameterwaarden van het verzoek. Kijk naar de volgende verzoek URL:

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

In het bovenstaande URL verzoek, kunnen de waarden voor param1 en param2 benaderd worden zoals hieronder:

public String getDetails(
    @RequestParam(value="param1", required=true) String param1,
        @RequestParam(value="param2", required=false) String param2){
...
}

Hieronder volgt de lijst van parameters die door de @RequestParam annotatie worden ondersteund:

  • defaultValue - Dit is de standaardwaarde als terugvalmechanisme indien het verzoek de waarde niet heeft of leeg is.
  • name - Naam van de te binden parameter
  • required - Of de parameter verplicht is of niet. Als het waar is, zal het niet verzenden van die parameter mislukken.
  • value - Dit is een alias voor het name attribuut

@PathVariable

@PathVariable identificeert het patroon dat wordt gebruikt in de URI voor het inkomende verzoek. Laten we eens kijken naar de onderstaande verzoek URL:

Het bovenstaande URL verzoek kan in je Spring MVC als volgt worden geschreven:

@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){
.......
}

De @PathVariable annotatie heeft slechts één attribuut waarde voor het binden van de request URI template. Het is toegestaan om meerdere @PathVariable annotaties te gebruiken in een enkele methode. Maar zorg ervoor dat niet meer dan één methode hetzelfde patroon heeft.

Ook is er nog een interessante annotatie: @MatrixVariabele

En de Controller methode voor het

 @RequestMapping(value = "/{stocks}", method = RequestMethod.GET)
  public String showPortfolioValues(@MatrixVariable Map matrixVars, Model model) {

    logger.info("Storing {} Values which are: {}", new Object[] { matrixVars.size(), matrixVars });

    List outlist = map2List(matrixVars);
    model.addAttribute("stocks", outlist);

    return "stocks";
  }

Maar je moet het inschakelen:

Commentaren (3)

het kan zijn dat de application/x-www-form-urlencoded midia type spaties omzet in +, en dat de reciever de data decodeert door de + om te zetten in spaties.kijk op de url voor meer info.http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1

Commentaren (0)