Een beknopte handleiding voor Spring MVC-matrixvariabelen

1. Overzicht

De URI-specificatie RFC 3986 definieerde URI-padparameters als naam-waardeparen. Matrixvariabelen is een door Spring bedachte term en een alternatieve implementatie voor het doorgeven en ontleden van URI-padparameters.

Ondersteuning voor matrixvariabelen is beschikbaar gekomen in Spring MVC 3.2 en is bedoeld voor vereenvoudig verzoeken met een groot aantal parameters.

In dit artikel laten we zien hoe we complexe GET-verzoeken kunnen vereenvoudigen die gebruik maken van variabele of optionele padparameters binnen de verschillende padsegmenten van een URI.

2. Configuratie

Om Spring MVC Matrix Variables in te schakelen, laten we beginnen met de configuratie:

@Configuration public class WebConfig implementeert WebMvcConfigurer {@Override public void configurePathMatch (PathMatchConfigurer configurer) {UrlPathHelper urlPathHelper = nieuwe UrlPathHelper (); urlPathHelper.setRemoveSemicolonContent (false); configurer.setUrlPathHelper (urlPathHelper); }}

Anders zijn ze standaard uitgeschakeld.

3. Hoe matrixvariabelen te gebruiken

Deze variabelen kunnen in elk deel van het pad voorkomen en het teken is gelijk aan ("=") wordt gebruikt om waarden op te geven en de puntkomma (‘;’) om elke matrixvariabele af te bakenen. Op hetzelfde pad kunnen we ook dezelfde variabelenaam herhalen of verschillende waarden scheiden met de tekenkomma (‘,’).

Ons voorbeeld heeft een controller die informatie geeft over de medewerkers. Elke medewerker heeft een werkgebied en we kunnen zoeken op dat kenmerk. Het volgende verzoek kan worden gebruikt om te zoeken:

// localhost: 8080 / spring-mvc-java-2 / employeeArea / workingArea = rh, informatica, admin

of zo:

// localhost: 8080 / spring-mvc-java-2 / employeeArea / workingArea = rh; workingArea = informatics; workingArea = admin

Als we in Spring MVC naar deze variabelen willen verwijzen, moeten we de annotatie gebruiken @MatrixVariable.

In onze voorbeelden gebruiken we de Werknemer klasse:

openbare klasse Medewerker {privé lange id; private String naam; privé String contactNumber; // standaard setters en getters}

En ook de Bedrijf klasse:

naamloze vennootschap {privé lange id; private String naam; // standaard setters en getters}

Deze twee klassen binden de verzoekparameters.

4. Eigenschappen van matrixvariabelen definiëren

We kunnen vereiste of standaard eigenschappen voor de variabele specificeren. In het volgende voorbeeld is het contact nummer is vereist, dus het moet in ons pad worden opgenomen, zoiets als dit:

// localhost: 8080 / spring-mvc-java-2 / workersContacts / contactNumber = 223334411

Het verzoek wordt op de volgende manier afgehandeld:

@RequestMapping (value = "/ workersContacts / {contactNumber}", method = RequestMethod.GET) @ResponseBody openbare ResponseEntity getEmployeeBycontactNumber (@MatrixVariable (verplicht = true) String contactNumber) {List workersList = nieuwe ArrayList (); ... retourneer nieuwe ResponseEntity(workersList, HttpStatus.OK); }

Als gevolg hiervan krijgen we alle medewerkers die het contactnummer hebben 223334411.

5. Aanvullende parameter

Matrixvariabelen kunnen padvariabelen aanvullen.

Zo zoeken we een medewerker op zijn / haar naam, maar kunnen we ook de startnummers van zijn / haar contactnummer opnemen.

Het verzoek voor deze zoekopdracht zou als volgt moeten zijn:

// localhost: 8080 / spring-mvc-java-2 / werknemers / John; beginContactNumber = 22001

Het verzoek wordt op de volgende manier afgehandeld:

@RequestMapping (value = "/ workers / {name}", method = RequestMethod.GET) @ResponseBody openbare ResponseEntity getEmployeeByNameAndBeginContactNumber (@PathVariable String naam, @MatrixVariable String beginContactNumber) {List workersList = new ArrayList (); ... retourneer nieuwe ResponseEntity (workersList, HttpStatus.OK); }

Als gevolg hiervan krijgen we alle medewerkers die het contactnummer hebben 22001 of wiens naam is John.

6. Alle matrixvariabelen binden

Als we om de een of andere reden alle variabelen willen ophalen die beschikbaar zijn op het pad, kunnen we ze binden aan een Kaart:

// localhost: 8080 / spring-mvc-java-2 / employeeData / id = 1; naam = John; contactNumber = 2200112334

Dit verzoek wordt op de volgende manier afgehandeld:

@GetMapping ("employeeData / {employee}") @ResponseBody openbare ResponseEntity getEmployeeData (@MatrixVariable Map matrixVars) {retourneer nieuwe ResponseEntity (matrixVars, HttpStatus.OK); }

Natuurlijk kunnen we de binding beperken tot de matrixvariabelen van een specifiek deel van het pad. Als we bijvoorbeeld een verzoek als dit hebben:

// localhost: 8080 / spring-mvc-java-2 / companyEmployee / id = 2; naam = Xpto / employeeData / id = 1; naam = John; contactNumber = 2200112334

En we willen alleen alle variabelen krijgen die erbij horen employeeData; dan moeten we dit als invoerparameter gebruiken:

@RequestMapping (value = "/ companyEmployee / {company} / employeeData / {employee}", method = RequestMethod.GET) @ResponseBody openbare ResponseEntity getEmployeeDataFromCompany (@MatrixVariable (pathVar = "employee") Map matrixVars) {...}

7. Gedeeltelijke binding

Naast eenvoud is flexibiliteit een andere winst, matrixvariabelen kunnen op verschillende manieren worden gebruikt. We kunnen bijvoorbeeld elke variabele uit elk padsegment halen. Overweeg het volgende verzoek:

// localhost: 8080 / spring-mvc-java-2 / companyData / id = 2; naam = Xpto / employeeData / id = 1; naam = John; contactNumber = 2200112334

Als we alleen de matrixvariabele willen weten naam van de Bedrijfsgegevens segment, dan moeten we het volgende als invoerparameter gebruiken:

@MatrixVariable (waarde = "naam", pathVar = "bedrijf") Stringnaam 

8. Conclusie

Dit artikel illustreert enkele van de verschillende manieren waarop matrixvariabelen kunnen worden gebruikt.

Het is essentieel om te begrijpen hoe deze nieuwe tool kan omgaan met verzoeken die te complex zijn of ons kan helpen meer parameters toe te voegen om onze zoekopdracht af te bakenen.

De implementatie van al deze voorbeelden en codefragmenten is te vinden in een GitHub-project - dit is een op Maven gebaseerd project, dus het moet gemakkelijk te importeren en uit te voeren zijn zoals het is.