«1. Введение

В этом коротком руководстве мы узнаем, как использовать Thymeleaf для создания URL-адресов с использованием переменных пути Spring.

Мы используем переменные пути, когда хотим передать значение как часть URL. В контроллере Spring мы получаем доступ к этим значениям с помощью аннотации @PathVariable.

2. Использование переменных пути

Во-первых, давайте настроим наш пример, создав простой класс Item:

public class Item {
    private int id;
    private String name;

    // Constructor and standard getters and setters
}

Теперь давайте создадим наш контроллер:

@Controller
public class PathVariablesController {

    @GetMapping("/pathvars")
    public String start(Model model) {
        List<Item> items = new ArrayList<Item>();
        items.add(new Item(1, "First Item"));
        items.add(new Item(2, "Second Item"));
        model.addAttribute("items", items);
        return "pathvariables/index";
    }
    
    @GetMapping("/pathvars/single/{id}")
    public String singlePathVariable(@PathVariable("id") int id, Model model) {
        if (id == 1) {
            model.addAttribute("item", new Item(1, "First Item"));
        } else {
            model.addAttribute("item", new Item(2, "Second Item"));
        }
        
        return "pathvariables/view";
    }
}

В нашем index.html шаблон, давайте пройдемся по нашим элементам и создадим ссылки, вызывающие метод singlePathVariable:

<div th:each="item : ${items}">
    <a th:href="@{/pathvars/single/{id}(id = ${item.id})}">
        <span th:text="${item.name}"></span>
    </a>
</div>

Код, который мы только что создали, создает такие URL-адреса:

http://localhost:8080/pathvars/single/1

Это стандартный синтаксис Thymeleaf для использования выражений в URL-адресах.

Мы также можем использовать конкатенацию для достижения того же результата:

<div th:each="item : ${items}">
    <a th:href="@{'/pathvars/single/' + ${item.id}}">
        <span th:text="${item.name}"></span>
    </a>
</div>

3. Использование нескольких переменных пути

Теперь, когда мы рассмотрели основы создания URL-адреса переменной пути в Thymeleaf, давайте быстро рассмотрим использование несколько.

Во-первых, мы создадим класс Detail и изменим наш класс Item, чтобы он содержал их список:

public class Detail {
    private int id;
    private String description;

    // constructor and standard getters and setters
}

Затем давайте добавим список Detail в Item:

private List<Detail> details;

Теперь давайте обновите наш контроллер, чтобы добавить метод, использующий несколько аннотаций @PathVariable:

@GetMapping("/pathvars/item/{itemId}/detail/{dtlId}")
public String multiplePathVariable(@PathVariable("itemId") int itemId, 
  @PathVariable("dtlId") int dtlId, Model model) {
    for (Item item : items) {
        if (item.getId() == itemId) {
            model.addAttribute("item", item);
            for (Detail detail : item.getDetails()) {
                if (detail.getId() == dtlId) {
                    model.addAttribute("detail", detail);
                }
            }
        }
    }
    return "pathvariables/view";
}

Наконец, давайте изменим наш шаблон index.html, чтобы создать URL-адреса для каждой записи сведений:

<ul>
    <li th:each="detail : ${item.details}">
        <a th:href="@{/pathvars/item/{itemId}/detail/{dtlId}(itemId = ${item.id}, dtlId = ${dtl.id})}">
            <span th:text="${detail.description}"></span>
        </a>
    </li>
</ul>

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

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

Код примера доступен на GitHub.