Ποια είναι η διαφορά μεταξύ @RequestParam
και @PathVariable
κατά το χειρισμό ειδικών χαρακτήρων;
Το +
έγινε δεκτό από το @RequestParam
ως κενό.
Στην περίπτωση της @PathVariable
, το +
έγινε δεκτό ως +
.
@PathVariable
είναι να λάβετε κάποιο placeholder από το URI (η Άνοιξη το αποκαλεί πρότυπο URI)@RequestParam
είναι για να λάβετε επίσης μια παράμετρο από το URI - βλέπε Spring Reference Chapter 16.3.3.3 Binding request parameters to method parameters with @RequestParamΑν το URL http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013
παίρνει τα τιμολόγια για τον χρήστη 1234 στις 5 Δεκεμβρίου 2013, η μέθοδος του ελεγκτή θα έμοιαζε ως εξής:
@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
...
}
Επίσης, οι παράμετροι αίτησης μπορούν να είναι προαιρετικές, και από την Spring 4.3.3 οι μεταβλητές διαδρομής μπορούν επίσης να είναι προαιρετικές. Προσοχή όμως, αυτό μπορεί να αλλάξει την ιεραρχία των διαδρομών URL και να εισάγει συγκρούσεις αντιστοίχισης αιτήσεων. Για παράδειγμα, θα μπορούσε το /user/invoices
να παρέχει τα τιμολόγια για τον χρήστη null
ή λεπτομέρειες για έναν χρήστη με ID "invoices"?
@RequestParam σχολιασμός που χρησιμοποιείται για την πρόσβαση στις τιμές των παραμέτρων του ερωτήματος από την αίτηση. Κοιτάξτε την ακόλουθη διεύθυνση URL αίτησης:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
Στην παραπάνω αίτηση URL, οι τιμές για τις παραμέτρους param1 και param2 μπορούν να προσπελαστούν ως εξής:
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
Ακολουθεί ο κατάλογος των παραμέτρων που υποστηρίζονται από τον σχολιασμό @RequestParam:
@PathVariable
Το @PathVariable προσδιορίζει το μοτίβο που χρησιμοποιείται στο URI για την εισερχόμενη αίτηση. Ας δούμε την παρακάτω διεύθυνση URL αίτησης:
Το παραπάνω αίτημα URL μπορεί να γραφτεί στο Spring MVC σας ως εξής:
@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){
.......
}
Ο σχολιασμός @PathVariable έχει μόνο μία τιμή χαρακτηριστικού για τη δέσμευση του προτύπου URI της αίτησης. Επιτρέπεται η χρήση πολλαπλών σχολίων @PathVariable σε μία μόνο μέθοδο. Βεβαιωθείτε όμως ότι δεν θα έχουν περισσότερες από μία μέθοδο το ίδιο πρότυπο.
Επίσης, υπάρχει ένας ακόμη ενδιαφέρων σχολιασμός: @MatrixVariable
Και η μέθοδος ελεγκτή για αυτό
@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";
}
Αλλά πρέπει να ενεργοποιήσετε:
<mvc:annotation-driven enableMatrixVariables="true" >
μπορεί να είναι ότι το application/x-www-form-urlencoded τύπου midia μετατρέπει το κενό σε +, και ο δέκτης θα αποκωδικοποιήσει τα δεδομένα μετατρέποντας το + σε κενό.ελέγξτε το url για περισσότερες πληροφορίες.http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1