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 .