An introduction to frontend development with Spring Boot

An introduction to frontend development with Spring Boot

I've been building my web frontends with Spring Boot for a few years. But I recently heard that some Spring Boot developers still create their web frontend with something else than Spring ?!

But creating a web frontend without leaving your favourite Java Framework is easy!

We go to everyone's 2nd favorite place online: start.spring.io and create a new project.
We will not choose a template language as you can sadly not find the best template language there!

Instead, we go to jte.gg and add the latest spring-boot-starter as a dependency to our project.

implementation("gg.jte:jte-spring-boot-starter-3:3.1.9")
implementation("gg.jte:jte:3.1.9")

We start with a WebController and define our Data model.
We have a Link record which has a displayValue and a hrefValue field.
We also have a SpringResources record which has a topics HashMap field.

@Controller
public class WebController {
  public record Link(String displayValue, String hrefValue) {}

  public record SpringResources(HashMap<String, List<Link>> topics) {}
}

Then we create a JTE template in a new file located in src/main/jte/spring.jte
As JTE is compiled to Java we start by importing the SpringResources record.
JTE expects a parameter of type SpringResources in the model

@import com.bootiful.frontend.web.WebController.SpringResources
@param SpringResources springResources

We use the @for syntax to loop through the hashMap entrySet and show a heading for each key.

@import com.bootiful.frontend.web.WebController.SpringResources
@param SpringResources springResources

@for(var resource: springResources.topics().entrySet())
    <h2>
        ${resource.getKey()}
    </h2>
@endfor

Then we create an <ul> tag for each topic. Then for each link object in the list, we create a <li> tag and a <a> tag with the href set to the hrefValue, and render the displayValue inside the tag.

@import com.bootiful.frontend.web.WebController.SpringResources
@param SpringResources springResources

@for(var resource: springResources.topics().entrySet())
    <h2>
        ${resource.getKey()}
    </h2>
    <ul>
        @for(var link: resource.getValue())
            <li>
                <a href="${link.hrefValue()}">${link.displayValue()}</a>
            </li>
        @endfor
    </ul>
@endfor

Now we add a Controller Endpoint where we add a new SpringResource object to the Model as springResources attribute.
Then we return a spring string which is a reference to the spring.jte template.

@Controller
public class WebController {
  ...
  @GetMapping("/")
  public String index(Model model) {
    model.addAttribute("springResources", new SpringResources(new HashMap<>(
        Map.of("Spring",List.of(
            new Link("Spring","https://spring.io"),
            new Link("Spring Academy","https://spring.academy")
        ))
    )));
    return "spring";
  }
}

If we now navigate to http://localhost:8080/ you can see that our template is rendered correctly:

You can find the source code for this tutorial here: github.com/tschuehly/bootiful-frontend

If you want to learn more about HTMX + Spring Boot check out my series Web development without the JavaScript headache with Spring + HTMX.

My side business PhotoQuest is also built with HTMX + JTE