it-swarm.com.de

@RequestParam vs @PathVariable

Was ist der Unterschied zwischen @RequestParam und @PathVariable beim Umgang mit Sonderzeichen?

+ wurde von @RequestParam als Leerzeichen akzeptiert.

Im Fall von @PathVariable wurde + als + akzeptiert.

310
user1857181

Wenn URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 die Rechnungen für Benutzer 1234 am 5. Dezember 2013 erhält, sieht die Controller-Methode folgendermaßen aus:

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

Außerdem können Anforderungsparameter optional sein und ab Version 4.3.3 Pfadvariablen kann auch optional sein . Beachten Sie jedoch, dass dies die URL-Pfadhierarchie ändern und Konflikte bei der Anforderungszuordnung verursachen kann. Würde /user/invoices beispielsweise die Rechnungen für den Benutzer null oder Details zu einem Benutzer mit der ID "Rechnungen" bereitstellen?

461
Ralph

@ RequestParam Annotation, die für den Zugriff auf die Abfrageparameterwerte aus der Anforderung verwendet wird. Sehen Sie sich die folgende Anforderungs-URL an:

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

In der obigen URL-Anfrage kann auf die Werte für param1 und param2 wie folgt zugegriffen werden:

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

Im Folgenden finden Sie eine Liste der Parameter, die von der Annotation @RequestParam unterstützt werden:

  • defaultValue - Dies ist der Standardwert als Fallback-Mechanismus, wenn die Anforderung nicht den Wert hat oder leer ist.
  • name - Name des zu bindenden Parameters
  • erforderlich - Ob der Parameter obligatorisch ist oder nicht. Wenn dies der Fall ist, schlägt das Senden dieses Parameters fehl.
  • value - Dies ist ein Alias ​​für das Namensattribut

@ PathVariable

@ PathVariable gibt das Muster an, das in der URI für die eingehende Anforderung verwendet wird. Sehen wir uns die folgende Anforderungs-URL an:

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

Die obige URL-Anfrage kann wie folgt in Ihre Spring MVC geschrieben werden:

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

Die Annotation @ PathVariable enthält nur einen Attributwert zum Binden der Anforderungs-URI-Vorlage. Es ist erlaubt, die mehrfache @ PathVariable Annotation in der einzelnen Methode zu verwenden. Stellen Sie jedoch sicher, dass nicht mehr als eine Methode dasselbe Muster aufweist.

Außerdem gibt es noch eine interessante Anmerkung: @ 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

Und die Controller-Methode dafür

 @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";
  }

Sie müssen jedoch Folgendes aktivieren:

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

@RequestParam wird für Abfrageparameter (statische Werte) verwendet wie: http: // localhost: 8080/berechnung/pow? Base = 2 & ext = 4

@PathVariable wird für dynamische Werte wie: http: // localhost: 8080/berechnung/sqrt/8 verwendet

@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;
}
20
alok

es kann sein, dass die Anwendung/x-www-form-urlencoded Midia-Typ konvertieren Leerzeichen zu + , und der Empfänger wird die Daten durch Konvertieren der + to space.check die URL für weitere Informationen . http://www.w3.org/TR/html401/interact/forms. html # h-17.13.4.1

0
andy