Подтвердить что ты не робот

Тимелеаф построит URL с переменной

У меня есть следующий код, устанавливающий переменную в моем контроллере:

model.set("type", type);

В представлении тимелеафа я хочу построить форму с URL-адресом действия:

/mycontroller/{type}

Любые идеи, как достичь этого? Я не читал документацию тимелеафа.

4b9b3361

Ответ 1

Как user482745 предлагает в комментариях (теперь удалено), конкатенация строк, которую я ранее предлагал

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

не удастся выполнить некоторые веб-контексты.

Thymeleaf использует LinkExpression, который разрешает выражение @{..}. Внутри это использует HttpServletResponse#encodeURL(String). Его javadoc состояния

Для надежного отслеживания сеанса все URL-адреса, испускаемые сервлетом, должны быть пропустите этот метод. В противном случае переписывание URL-адресов не может использоваться с браузеры, которые не поддерживают файлы cookie.

В веб-приложениях, где отслеживание сеанса выполняется через URL-адрес, эта часть будет добавлена ​​к строке, испускаемой для @{..}, до добавления ${..}. Вы не хотите этого.

Вместо этого используйте переменные пути, как указано в документации

Вы также можете включить параметры в виде переменных пути аналогично нормальным параметрам, но указывая местозаполнитель внутри ваш URL-адрес:

<a th:href="@{/order/{id}/details(id=3,action='show_all')}">

Итак, ваш пример будет выглядеть как

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

Ответ 3

Вам нужна строка конкатенации внутри @{}.

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

@{} используется для перезаписи URL. Часть перезаписи URL-адресов отслеживает сеанс. Первый URL-адрес пользовательского запроса, сервер приложений добавляет URL-адрес ;jsessionid=somehexvalue и генерирует cookie с jsessionid. Когда клиент отправляет cookie во время следующего сервера запросов, клиент поддерживает файлы cookie. Если сервер знает, что файлы cookie поддержки клиентов, сервер не будет содержать addind jsessionid в URL.

Мой предпочтительный путь - это буквальная подстановка синтаксисом конвейера (|).

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

Синтаксис переменной пути Thymeleaf

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

Ссылка: Синтаксис URL-адресов Тимелеафа

Ответ 4

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

login.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>

Ответ 5

Что вам нужно:

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