1. Introduction
In this short tutorial, we're going to learn how to use Thymeleaf to create URLs using Spring path variables.
We use path variables when we want to pass a value as part of the URL. In a Spring controller, we access these values using the @PathVariable annotation.
2. Using Path Variables
First, let's set up our example by creating a simple Item class:
public class Item { private int id; private String name; // Constructor and standard getters and setters }
Now, let's take create our controller:
@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"; } }
In our index.html template, let's loop through our items and create links calling the singlePathVariable method:
<div th:each="item : ${items}"> <a th:href="@{/pathvars/single/{id}(id = ${item.id})}"> <span th:text="${item.name}"></span> </a> </div>
The code we just created makes URLs like this:
http://localhost:8080/pathvars/single/1
This is standard Thymeleaf syntax for using expressions in URLs.
We can also use concatenation to achieve the same result:
<div th:each="item : ${items}"> <a th:href="@{'/pathvars/single/' + ${item.id}}"> <span th:text="${item.name}"></span> </a> </div>
3. Using Multiple Path Variables
Now that we've covered the basics of creating a path variable URL in Thymeleaf, let's quickly cover using multiple.
First, we'll create a Detail class and modify our Item class to have a list of them:
public class Detail { private int id; private String description; // constructor and standard getters and setters }
Next, let's add a list of Detail to Item:
private List<Detail> details;
Now, let's update our controller to add a method using multiple @PathVariable annotations:
@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"; }
Finally, let's modify our index.html template to create URLs for each detail record:
<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. Conclusion
In this quick tutorial, we learned how to use Thymeleaf to create URLs with path variables. We started by creating a simple URL with only one. Later, we expanded on our example to use multiple path variables.
The example code is available over on GitHub.