Перейти к основному содержимому

Переменные пути Spring с Thymeleaf

· 3 мин. чтения

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 .