如何添加自定义 Sling 绑定?

How to add a custom Sling binding?

我想用自定义对象扩展 Sling 绑定,这样它就可以在所有 JSP 文件中使用,而无需额外的努力。我正在实现 BindingsValuesProvider OSGi service,像这样(这不是实际代码,但足够相似):

@Component
@Service
public class ContentBranchBindingProvider implements BindingsValuesProvider {

    @Override
    public void addBindings(Bindings bindings) {
        final Resource resource = (Resource) bindings.get("resource");
        final String[] splitPath = StringUtils.split(resource.getPath(), '/');
        bindings.put("contentBranch", splitPath[1]);
    }
}

我希望 contentBranch 绑定可以在 JSP 中作为脚本变量使用:

<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@include file="/libs/foundation/global.jsp"%>
Your content branch is: ${contentBranch}

但是上面的JSP没有输出内容分支而是:

Your content branch is:

我使用调试器看到我的 addBindings() 方法被调用并将正确的值放入 bindings 映射中。我该怎么做才能在 JSP 中以 ${contentBranch} 的形式提供它?

Sling 绑定不会自动用作脚本变量。有 a plan to change it 可以更改它,但在当前版本的 Sling 中没有。

Sling 使用 <sling:defineObjects/> 将其自己的绑定复制到页面上下文,因此将它们公开为脚本变量,但它不适用于 contentBranch.[=21= 等自定义值]

但是,<sling:defineObjects/> 定义的脚本变量之一是 bindings,因此您可以像这样访问新值:

<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@include file="/libs/foundation/global.jsp"%>
Your content branch is: ${bindings.contentBranch}

或者,考虑编写 a custom defineObjects 标签。

此外,Sling 绑定可作为 Sightly 中的脚本值使用,无需任何额外工作:

Your content branch is: ${contentBranch}