Thymeleaf построить URL с переменной
у меня есть следующий код, устанавливающий переменную в моем контроллере:
model.set("type", type);
в представлении thymeleaf я хочу построить форму с url действия:
/mycontroller/{type}
есть идеи, как этого достичь? Я прочитал документацию thymeleaf без везения.
5 ответов
As user482745 предлагает в комментариях (теперь удалено), конкатенация строк, которую я ранее предлагал
<form th:action="@{/mycontroller/} + ${type}">
потерпит неудачу в некоторых веб-контекстах.
Thymeleaf использует LinkExpression
разрешает @{..}
выражение. Внутренне, это использует HttpServletResponse#encodeURL(String)
. Его javadoc государств
для надежного отслеживания сеанса все URL-адреса, испускаемые сервлетом, должны быть выполните этот метод. В противном случае URL переписывание не может использоваться с браузеры, которые не поддерживают куки.
в веб-приложениях, где отслеживание сеанса выполняется через URL-адрес, эта часть будет добавлена к строке, испускаемой для @{..}
до ${..}
добавляется. Ты не хочешь этого.
вместо этого используйте переменные пути, как предложено в документация
вы также можете включить параметры в виде переменных пути аналогично нормальному параметры, но указание заполнителя внутри путь вашего URL:
<a th:href="@{/order/{id}/details(id=3,action='show_all')}">
таким образом, ваш пример будет выглядеть как
<form th:action="@{/mycontroller/{path}(path=${type})}"> //adding ending curly brace
Если вы не хотите использовать конкатенацию строк (предложение Сотириоса), вы можете использовать предварительная обработка выражений на URL ссылка:
<form th:action="@{/mycontroller/__${type}__}">
вам нужно объединить строку внутри @{}.
<form th:action="@{'/mycontroller/' + ${type}}">
@{} используется для перезаписи URL. Часть перезаписи URL-адресов отслеживает сеанс. Первый раз URL запроса пользователя, сервер приложений добавляет в url ;jsessionid=somehexvalue
и генерирует cookie с jsessionid. Когда клиент отправляет cookie во время следующего запроса, сервер знает, что клиент поддерживает cookies. Если сервер знает, что куки поддержки клиента, сервер не будет держать addind jsessionid в URL.
мой предпочтительный способ-буквальная подстановка с синтаксис конвейера (|).
<form th:action="@{|/mycontroller/${type}|}">
синтаксис переменной пути Thymeleaf -
<form th:action="@{/mycontroller/{pathParam}(pathParam=${type}}">
Exception evaluating SpringEL expression: "businessId" (login:50)
у меня такая же проблема и решить с помощью конкатинации строк, как показано ниже.
LoginController.java
@RequestMapping(value = "/login/{businessId}", method = RequestMethod.GET)
public ModelAndView get(HttpServletRequest request, @PathVariable String businessId) {
ModelAndView modelAndView = new ModelAndView("login");
modelAndView.addObject("businessId", businessId);
return modelAndView;
}
логин.HTML-код
<form role="form" th:action="@{/login} + '/'+ ${businessId}" th:method="post">
<fieldset>
<div class="form-group">
<input class="form-control" placeholder="E-mail" name="userName"
type="email"></input>
</div>
<div class="form-group">
<input class="form-control" placeholder="Password"
name="password" type="password" value=""></input>
</div>
<div class="checkbox">
<label> <input name="remember" type="checkbox"
value="Remember Me"></input>Remember Me
</label>
</div>
<!-- Change this to a button or input when using this as a form -->
<button id="login" class="btn btn-lg btn-success btn-block" type="submit">Login</button>
</fieldset>
</form>
что вам нужно, это:
<a th:href="@{/mycontroller/{type}(type=${type})}">
документы:
большая помощь здесь: http://www.thymeleaf.org/doc/articles/standardurlsyntax.html. Что я использовал оттуда:
вы также можете включить параметры в виде переменных пути аналогично обычным параметрам, но с указанием заполнителя внутри путь вашего URL:
<a th:href="@{/order/{id}/details(id=3,action='show_all')}">
... Что подробнее: выражение URL, например:
<a th:href="@{/order/details(id=${order.id})}">