Thymeleaf/Spring MVC - How do you nest variables/expressions in a Link expression?

trusktr picture trusktr · Feb 27, 2014 · Viewed 8.9k times · Source

For example, my controller method in Spring does this:

model.addAttribute("view_name", "foobar")

And I'm trying to do this in my Thymeleaf template:

<link th:href="@{/resources/libs/css/${view_name}.css}" rel="stylesheet" />

But the rendered result is this:

<link href="/app/resources/libs/css/${view_name}.css" rel="stylesheet" />

So it's not replacing the ${view_name} like I'm expecting.

What am I doing wrong? In general, how do you nest expressions like that in Thymeleaf?

Answer

Tom Verelst picture Tom Verelst · Feb 27, 2014

Since you are not starting the url rewrite with an expression (e.g. ${...}, #{...}, |...|, __...__, 'quoted string', ...), Thymeleaf will consider the whole expression as a String and not execute any of the inner expressions.

The following example would work because it starts with an expression.

@{${attribute}}

For your example you have the following possibilities

Literal substition (preferred method)

You can do literal substitions in a String with the pipeline syntax (|).

<link th:href="@{|/resources/libs/css/${view_name}.css|}" rel="stylesheet" />

String concatenation

<link th:href="@{'/resources/libs/css/' + ${view_name} + '.css'}" rel="stylesheet" />