Краткое руководство по матричным переменным Spring MVC

Краткое руководство по Spring MVC Matrix Variables

1. обзор

В спецификации URIRFC 3986 параметры пути URI определены как пары имя-значение. Матричные переменные - это термин, придуманный Spring, и альтернативная реализация для передачи и анализа параметров пути URI.

Поддержка матричных переменных стала доступна в Spring MVC 3.2 и предназначена дляsimplify requests with a large number of parameters.

В этой статье мы покажем, как мы можем упростить сложные запросы GET, которые используют переменные или необязательные параметры пути внутри различных сегментов пути URI.

2. конфигурация

Чтобы включить матричные переменные Spring MVC, давайте начнем с конфигурации:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setRemoveSemicolonContent(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}

В противном случае они по умолчанию отключены.

3. Как использовать матричные переменные

Эти переменные могут появляться в любой части пути, и символ равенства («=») используется для задания значений, а точка с запятой (‘;’) для разграничения каждой матричной переменной. По тому же пути мы также можем повторить одно и то же имя переменной или разделить разные значения, используя запятую символа ((, ’).

В нашем примере есть контроллер, который предоставляет информацию о сотрудниках. У каждого сотрудника есть рабочая зона, и мы можем искать по этому атрибуту. Следующий запрос может быть использован для поиска:

http://localhost:8080/spring-mvc-java/employeeArea/workingArea=rh,informatics,admin

или вот так:

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

Когда мы хотим сослаться на эти переменные в Spring MVC, мы должны использовать аннотацию@MatrixVariable.

В наших примерах мы будем использовать классEmployee:

public class Employee {

    private long id;
    private String name;
    private String contactNumber;

    // standard setters and getters
}

А также классCompany:

public class Company {

    private long id;
    private String name;

    // standard setters and getters
}

Эти два класса будут связывать параметры запроса.

4. Определение свойств матричной переменной

Мы можем указать обязательные или стандартные свойства для переменной. В следующем примереcontactNumber требуется, поэтому он должен быть включен в наш путь, примерно так:

http://localhost:8080/spring-mvc-java/employeesContacts/contactNumber=223334411

Запрос будет обработан следующим способом:

@RequestMapping(value = "/employeesContacts/{contactNumber}",
  method = RequestMethod.GET)
@ResponseBody
public ResponseEntity> getEmployeeBycontactNumber(
  @MatrixVariable(required = true) String contactNumber) {
    List employeesList = new ArrayList();
    ...
    return new ResponseEntity>(employeesList, HttpStatus.OK);
}

В результате мы получим всех сотрудников, у которых есть контактный номер223334411.

5. Параметр дополнения

Матричные переменные могут дополнять переменные пути.

Например, мы ищем сотрудника по его / ее имени, но мы также можем включить стартовые номера его / ее контактного номера.

Запрос для этого поиска должен быть таким:

http://localhost:8080/spring-mvc-java/employees/John;beginContactNumber=22001

Запрос будет обработан следующим способом:

@RequestMapping(value = "/employees/{name}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity> getEmployeeByNameAndBeginContactNumber(
  @PathVariable String name, @MatrixVariable String beginContactNumber) {
    List employeesList = new ArrayList();
    ...
    return new ResponseEntity<>(employeesList, HttpStatus.OK);
}

В результате мы получим всех сотрудников, у которых есть контактный номер22001 или имя которыхJohn.

6. Связывание всех матричных переменных

Если по какой-то причине мы хотим получить все переменные, доступные на пути, мы можем привязать их кMap:

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

Этот запрос будет обработан следующим методом:

@GetMapping("employeeData/{employee}")
@ResponseBody
public ResponseEntity> getEmployeeData(
  @MatrixVariable Map matrixVars) {
    return new ResponseEntity<>(matrixVars, HttpStatus.OK);
}

Конечно, мы можем ограничить привязку к матричным переменным определенной части пути. Например, если у нас есть такой запрос:

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

И мы хотим получить только все переменные, принадлежащиеemployeeData; тогда мы должны использовать в качестве входного параметра это:

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

7. Частичная привязка

Помимо простоты, гибкость является еще одним преимуществом, матричные переменные могут использоваться различными способами. Например, мы можем получить каждую переменную из каждого сегмента пути. Рассмотрим следующий запрос:

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

Если мы хотим знать только матричную переменнуюname сегментаcompanyData, тогда мы должны использовать в качестве входного параметра следующее:

@MatrixVariable(value="name", pathVar="company") String name

8. Заключение

Эта статья иллюстрирует некоторые из различных способов использования матричных переменных.

Важно понимать, как этот новый инструмент может обрабатывать слишком сложные запросы или помогает нам добавлять дополнительные параметры, чтобы ограничить наш поиск.

Реализация всех этих примеров и фрагментов кода можно найти вGitHub project - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.