Thymeleaf上下文URL处理 - 如何将语言代码添加到上下文相关的URL(Spring + Thymeleaf)

时间:2017-07-11 12:52:58

标签: java spring url filter thymeleaf

我已经编写了请求过滤器和区域设置解析器,用于从URL获取语言代码。 (例如:DOMAIN / en /,DOMAIN / cs /)

但是,我不知道如何以编程方式更改Thymeleaf用于其上下文相关URL(@ {/ css / main.css})的上下文路径。

例如,如果页面上带有地址" DOMAIN / en / test /"正在关注代码

isSelected

指向

<a th:href="@{/test2/}">TEST 2</a>

而不是

DOMAIN/test2/ 

我认为创建一些在转到Thymeleaf模板之前编辑URL的过滤器会很好,但我不知道如何。

你有任何想法如何解决它?

2 个答案:

答案 0 :(得分:0)

一种解决方案是将URL放在消息资源文件中:

<a th:href="@{#{orders.details.localized_url}(id=${order.id})}">

如:http://www.thymeleaf.org/doc/articles/standardurlsyntax.html

中所述

或者返回适当的模板视图,例如:

    @RequestMapping("/localized/**")
    public String getTemplateView(HttpServletRequest request) {
        String path = request.getRequestURI();
        //path = /localized/en/mypage
        return mypage_en.html;// or relative location in the configured folder
    }

我更喜欢第一个

答案 1 :(得分:0)

我找到了符合我期望的解决方案。

我只想在上下文路径(example.com/CONTEXT_PATH/CONTROLLER - &gt; example.com/CONTEXT_PATH/LANGUAGE_CODE/CONTROLLER)之后为Thymeleaf模板插入语言代码,所以我仍然可以使用Thymeleaf的网址表达式@ {/ controller}。

我有url过滤器,它会删除语言代码并将其添加到请求的属性中,因此我刚刚编辑了响应的encodeURL方法,它可以按我的意愿运行:

getServletContext().getRequestDispatcher(newUrl).forward(request, new HttpServletResponseWrapper(response) {
    @Override
    public String encodeURL(String url) {
        String contextPath = getServletContext().getContextPath();
        if (url.startsWith(contextPath))
            url = new StringBuilder(url).insert(contextPath.length(), "/" + getLocale().getLanguage()).toString();
        return super.encodeURL(url);
    }
});

无论如何,谢谢你的回答! :)