Qual è la differenza tra @RequestParam
e @PathVariable
nella gestione dei caratteri speciali?
+
è stato accettato da @RequestParam
come spazio.
Nel caso di @PathVariable
, +
è stato accettato come +
.
@PathVariable
è per ottenere qualche segnaposto dall'URI (Spring lo chiama un URI Template)@RequestParam
è per ottenere anche un parametro dall'URI - vedi Spring Reference Chapter 16.3.3.3 Binding request parameters to method parameters with @RequestParamSe l'URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013
ottiene le fatture per l'utente 1234 il 5 dicembre 2013, il metodo del controller sarebbe come:
@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
...
}
Inoltre, i parametri di richiesta possono essere opzionali, e a partire da Spring 4.3.3 le variabili di percorso possono anche essere opzionali. Attenzione però, questo potrebbe cambiare la gerarchia del percorso dell'URL e introdurre conflitti di mappatura della richiesta. Per esempio, /user/invoices
fornirebbe le fatture per l'utente null
o i dettagli su un utente con ID "invoices"?
L'annotazione @RequestParam usata per accedere ai valori dei parametri della query dalla richiesta. Guardate il seguente URL di richiesta:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
Nella richiesta dell'URL di cui sopra, i valori di param1 e param2 sono accessibili come segue:
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
Di seguito sono elencati i parametri supportati dall'annotazione @RequestParam:
@PathVariable
@PathVariable identifica il modello che è usato nell'URI per la richiesta in arrivo. Guardiamo il seguente URL di richiesta:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
La richiesta URL di cui sopra può essere scritta nel vostro Spring MVC come segue:
@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'annotazione @PathVariable ha solo un valore di attributo per legare il modello URI della richiesta. È permesso usare l'annotazione multipla @PathVariable nel singolo metodo. Ma, assicuratevi che non più di un metodo abbia lo stesso modello.
C'è anche un'altra annotazione interessante: @MatrixVariable
E il metodo di controllo per esso
@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";
}
Ma è necessario abilitare:
<mvc:annotation-driven enableMatrixVariables="true" >
può essere che il tipo midia application/x-www-form-urlencoded converta lo spazio in +, e il ricevitore decodifica i dati convertendo il + in spazio.controllare l'url per maggiori informazioni.http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1