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}}">

ссылка: стандартный синтаксис URL Thymeleaf


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})}">