Получить полный текущий URL-адрес тимелеафа со всеми параметрами

Я использую тимелеф с весенним МВК. Я хочу добавить языковой параметр для изменения локали. Я сделал это так:

<a th:href="@{${currentUrl}(lang='es_ES')}" th:if="__${#locale}__ != 'es_ES'" >Sp</a>
<a th:href="@{${currentUrl}(lang='en_US')}" th:if="__${#locale}__ != 'en_US'" >Eng</a>

Но в некоторых представлениях у меня есть параметры в URL-адресе. Как я могу добавить параметры? Я знаю, как добавить, когда встречаю конкретный параметр:

<a th:href="@{${currentUrl}(fooParam = ${fooValue}, lang='es_ES')}" th:if="__${#locale}__ != 'es_ES'" >Sp</a>

Но я не знаю ни номера, ни названия всех параметров во всех представлениях. Как я могу получить все параметры текущего URL?


person oscar    schedule 21.12.2015    source источник


Ответы (1)


Вы можете попробовать создать служебную службу для создания части параметров вашего URL-адреса. Служебный метод будет получать входные данные из списка и строить строку через StringBuffer. Результатом будет строка, записанная так, как если бы вы написали параметр вручную. Теперь вы можете использовать синтаксис Pre-Parser, встроенный в тимелеаф, чтобы вызвать утилиту и создать окончательный URL-адрес. Вот пример:

Коммунальное обслуживание

@Service("thymeleafUtilsService")
public class ThymeleafUtilsService
{

    public String buildMultiParamPartUrl(List<String> paramNames)
    {
        StringBuffer sb = new StringBuffer(0);

        for ( String paramName : paramNames )
        {
            if ( sb.length() >= 0 )
            {
                sb.append(",");
            }
            sb.append(paramName).append("=${").append(paramName).append("}");
        }

        return sb.toString();
    }

}

Контроллер для тестирования

@Controller("multiParamLinkController")
@RequestMapping(value = "/multiParamLink")
public class MultiParamLinkController
{

    @RequestMapping(value =
    { "/",
      "" }, method = RequestMethod.GET)
    public String testMultiParamsGenerator(Model model)
    {
        List<String> paramNames = new ArrayList<>();
        paramNames.add("fooValue");
        paramNames.add("barValue");
        paramNames.add("lang");

        model.addAttribute("fooValue", "foo");
        model.addAttribute("barValue", "bar");
        model.addAttribute("lang", "US_us");

        model.addAttribute("paramNames", paramNames);

        return "multiParamLink/multiParamLink.html";
    }

}

HtmlTemplate для теста:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
</head>
<body>
  <a th:href="@{${currentUrl}(__${@thymeleafUtilsService.buildMultiParamPartUrl(paramNames)}__)}">myLink</a>
  <h1>Result</h1>
  <pre th:inline="text">[[@{${currentUrl}(__${@thymeleafUtilsService.buildMultiParamPartUrl(paramNames)}__)}]]</pre>
</body>
</html>

вот что вы получите в примере:

введите здесь описание изображения

Теперь вы можете настроить этот пример в соответствии с вашим кодом, например, проанализировать карту вместо списка или строки ...

person ElPysCampeador    schedule 29.12.2015
comment
Спасибо, но я решил проблему с помощью специального декоратора для языковых меню. Я также делаю URL-адрес с настраиваемыми параметрами в классе Java. Ваше решение проще моего. - person oscar; 06.01.2016