从 Freemarker 中的相对链接获取绝对链接

Posted

技术标签:

【中文标题】从 Freemarker 中的相对链接获取绝对链接【英文标题】:Get an absolute link from a relative one in Freemarker 【发布时间】:2014-12-27 17:56:46 【问题描述】:

我正在使用 Magnolia - CMS 创建一个网站。现在我正在实现一个博客页面。在每个博客页面上,都有几个分享按钮。现在我正忙于实现 twittershare 按钮。在这里,我将使用推特卡。为此,我需要在元标记中提供图像的 URL。主要问题:我像这样检索我的图像:$damfn.getAssetLink(content.blogImage)。这只会返回我的资源的相对路径。有没有一种快速的方法(在 freemarker 中),可以将 tis 转换为绝对链接?

非常感谢!

【问题讨论】:

哪个版本的 Magnolia?查看最新的 DAM,它应该会返回绝对 URI,因此您需要添加的只是域名和协议。 我使用的是 4.5 版 如果仍然打开,那么您应该在图像的(相对)URL 前添加$ctx.contextPath 添加上下文路径仍然不能使其成为绝对链接 不。这是真的。 context path 仅添加应用程序部署的上下文路径。 (在我的情况下,它主要是ROOT,所以它什么都不做。 【参考方案1】:

通常您在 magnolia.properties 中定义 magnolia.default.base.url

然后你可以用Components.getComponent(ServerConfiguration.class).getDefaultBaseUrl()检索它

现在您必须将服务安装到 freemarker 中。您可以通过在启动时将安装程序任务添加到渲染器中来做到这一点。你在你的模块版本处理程序中这样做。在那里你覆盖getStartupTasks(...),像这样:

@Override
protected List<Task> getStartupTasks(InstallContext installContext) 
    final List<Task> tasks = new ArrayList<>();
    tasks.add(new InstallRendererContextAttributeTask("rendering", "freemarker", "serverConf", ServerConfiguration.class.getName()));
    tasks.add(new InstallRendererContextAttributeTask("site", "site", "serverConf", ServerConfiguration.class.getName()));
    return tasks;

现在你可以调用freemarker了:

"$serverConf.defaultBaseUrl/$ctx.contextPath/$damfn.getAssetLink(content.blogImage)"

检查是否需要斜线并确保在您的 magnolia 配置中正确设置 defaultBaseUrl ("/server/...")

编辑:通过在 freemarker $Request 中调用当前请求应该更容易,所以它可能类似于 "$Request.domain/$ctx.contextPath/$damfn.getAssetLink(content.blogImage )" 无需将 serverConfiguration 注入渲染器

【讨论】:

以上是关于从 Freemarker 中的相对链接获取绝对链接的主要内容,如果未能解决你的问题,请参考以下文章

java 加载动态链接库怎么使用相对路径

JavaWeb项目获取绝对路径basePath

JS 获得链接的绝对地址

绝对超链接执行相对

相对路径与绝对路径特殊例子解析

强制 PHP 作曲家创建本地存储库的相对而非绝对符号链接