@RequestParam vs @PathVariable

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 +.

Se 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 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"?

Commentari (14)

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&param2=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:

  • defaultValue - Questo è il valore predefinito come meccanismo di fallback se la richiesta non ha il valore o è vuoto.
  • name - Nome del parametro da legare
  • required - Se il parametro è obbligatorio o no. Se è vero, il mancato invio del parametro fallirà.
  • value - Questo è un alias per l'attributo name

@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&param2=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 matrixVars, Model model) {

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

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

    return "stocks";
  }

Ma è necessario abilitare:

Commentari (3)

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

Commentari (0)