如何添加自定义Sling绑定?

时间:2015-01-07 16:00:48

标签: jsp cq5 aem sling

我想用自定义对象扩展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不输出内容分支,但是:

  

您的内容分支是:

我使用调试器来查看调用了我的addBindings()方法,并将正确的值放入bindings地图中。如何在JSP中将其作为${contentBranch}提供?

1 个答案:

答案 0 :(得分:5)

Sling Bindings不会自动作为脚本变量使用。有a plan to change it可以更改它,但在当前版本的Sling中它们不是。

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

但是,<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}