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 +
.
@PathVariable
is om een placeholder te verkrijgen van de URI (Spring noemt dit een URI Template)@RequestParam
is om ook een parameter uit de URI te halen - zie Spring Reference Chapter 16.3.3.3 Binding request parameters to method parameters with @RequestParamAls 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<Invoice> 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"?
@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¶m2=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:
@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<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";
}
Maar je moet het inschakelen:
<mvc:annotation-driven enableMatrixVariables="true" >
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