【问题标题】:Get full current url thymeleaf with all parameters获取包含所有参数的完整当前 url thymeleaf
【发布时间】:2016-03-27 10:47:44
【问题描述】:

我正在使用带有 spring mvc 的 thymeleaf。我想添加一个语言参数来更改语言环境。我是这样做的:

<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的所有参数?

【问题讨论】:

    标签: java html spring-mvc thymeleaf


    【解决方案1】:

    您可以尝试创建一个实用服务来构建 URL 的参数部分。该实用程序方法将从 List 中获取输入并通过 StringBuffer 构建一个 String。结果将是一个字符串,就像您手动编写参数时一样。现在您可以使用 thymeleaf 中内置的 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>
    

    这就是您通过示例得到的结果:

    您现在可以自定义此示例以适合您的代码,例如解析 Map 而不是 List 或 String...

    【讨论】:

    • 谢谢,但我用语言菜单的自定义装饰器解决了我的问题。我也在 java 类中创建了一个带有自定义参数的 url。你的解决方案比我的简单。
    猜你喜欢
    • 2011-04-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2018-01-09
    • 1970-01-01
    • 2014-12-14
    • 2023-03-17
    相关资源
    最近更新 更多