Thymeleaf construct URL with variable

As user482745 suggests in the comments (now deleted), the string concatenation I previously suggested

<form th:action="@{/mycontroller/} + ${type}">

will fail in some web contexts.

Thymeleaf uses LinkExpression that resolves the @{..} expression. Internally, this uses HttpServletResponse#encodeURL(String). Its javadoc states

For robust session tracking, all URLs emitted by a servlet should be
run through this method. Otherwise, URL rewriting cannot be used with
browsers which do not support cookies.

In web applications where the session tracking is done through the URL, that part will be appended to the string emitted for @{..} before the ${..} is appended. You don’t want this.

Instead, use path variables as suggested in the documentation

You can also include parameters in the form of path variables
similarly to normal parameters but specifying a placeholder inside
your URL’s path:

<a th:href="https://stackoverflow.com/questions/14938344/@{/order/{id}/details(id=3,action="show_all')}">

So your example would look like

<form th:action="@{/mycontroller/{path}(path=${type})}"> //adding ending curly brace

Leave a Comment