提问者:小点点

如何在胸腺中建立绝对URL?


我想显示在运行时使用参数生成的绝对url。不是为页面创建href,而是使用th: text显示URL。Tymeleaf有什么简单的方法可以做到这一点(无需连接来自#request对象的URL片段,也无需使用MVC工具类)?

尝试1

尝试2

th: text="@{__${#httpServletRequest.request estURI}__}"-生成当前页面的相对URI,不包含协议等

尝试3

th: text="@{__${#httpServletRequest.request estURL}__}"-这次生成包含协议,主机和servlet上下文的当前页面的绝对URL。现在的问题是,当我从不同的页面显示此文本时,我的URL是…myApp/my其他Servlet所以我需要编辑此字符串以将my其他Servlet替换为我想要的URI。

非Tymeleaf尝试1

@Service("urlUtils")
public class UrlUtilsServiceImpl implements UrlUtilsService {
@Override
    public String getAbsoluteUrlTo(final String aPath, final String param, final String value){
        return ServletUriComponentsBuilder
                .fromCurrentContextPath()
                .path(aPath)
                .queryParam(param, value)
                .build().toString();
    }
}

page. html:

th:text="${@urlUtils.getAbsoluteUrlTo('/myServlet', 'myParam', ${dynamicParameter})}"

问题是主机名在到达我的服务器之前可以被别名(见此)。ThymeleafJS解决方案

使用一些java脚本加上胸腺

<p id="myUrl" th:text="@{/myServlet(myParam=${dynamicParameter})}" />
<script type="text/javascript">
    $(document).ready(function () {
        var myUrl= $("#myUrl");
        myUrl.text(window.location.origin + myUrl.text());
        });
</script>

共1个答案

匿名用户

您可以即时连接servlet请求:

th:text="${#httpServletRequest.scheme}+'://'+${#httpServletRequest.serverName}+':'+${#httpServletRequest.serverPort}+@{/myServlet(myParam=${dynamicParameter})}"

或者对于JavaScript:

<script type="text/javascript">
    GLOBAL.serverURI = '[[${#httpServletRequest.scheme}+'://'+${#httpServletRequest.serverName}+':'+${#httpServletRequest.serverPort}+@{/myServlet(myParam=${dynamicParameter})}]]';
</script>