如何添加自定义Sling绑定?

Tom*_*wek 4 jsp sling aem

我想用自定义对象扩展Sling绑定,因此它将在所有JSP文件中可用而无需额外的努力.我正在实现BindingsValuesProviderOSGi服务,就像这样(它不是一个真正的代码,但足够类似):

@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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

但是,上面的JSP不输出内容分支,但是:

您的内容分支是:

我使用调试器来查看addBindings()调用我的方法并将正确的值放入bindingsmap中.如何${contentBranch}在JSP中使用它?

Tom*_*wek 5

Sling Bindings不会自动作为脚本变量使用.有计划改变它以改变它,但在当前版本的Sling中它们不是.

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

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

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

或者,考虑编写自定义defineObjects标记.

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

Your content branch is: ${contentBranch}
Run Code Online (Sandbox Code Playgroud)