Sling Scripting, Groovy and sling.include



我实现了一个Groovy/Sling版本。该应用程序功能齐全(除了搜索功能,搜索功能将很快实现)。源节点在这里可用。

在Groovy的脚本/视图模块化项目即将结束时,我现在面临的问题。我实现了一个工作良好的BindingsValuesProvider

package io.github.floriansalihovic.petclinic.scripting;
import groovy.xml.*;
import org.apache.felix.scr.annotations.*;
import org.apache.sling.scripting.api.*;
import org.slf4j.*;
import javax.script.*;
import java.io.*;
@Component
@Service
public class MarkupBuilderBindingsValuesProvider implements BindingsValuesProvider {
    private final static Logger logger = LoggerFactory.getLogger(MarkupBuilderBindingsValuesProvider.class);
    @Override
    public void addBindings(Bindings bindings) {
        final PrintWriter out = (PrintWriter) bindings.get("out");
        if (null == out) {
            logger.error("Expected print writer is not available.");
        } else {
            logger.info("Providing binding markupBuilder:{}.", MarkupBuilder.class.getName());
            bindings.put("markupBuilder", new MarkupBuilder(out));
        }
    }
}

我可以直接在脚本中使用"markupBuilder"。在实现组件/apps/petclinic/components/footer, /apps/petclinic/components/header/apps/petclinic/components/navigation以及/apps/petclinic/components/pages中的几个页面组件之后,使用MarkupBuilder实现视图非常容易,并且以预期的方式工作。

markupBuilder.html {}

在使用组件时,我必须以一种意想不到的方式使用它们。

sling.include(resource, 'petclinic/components/header')
sling.include(resource, 'petclinic/components/navigation')
markupBuilder.html {
  body {
    // ... adding the specific pages content    
  }
}
sling.include(resource, 'petclinic/components/footer')

我本以为我会在闭包中使用sling.include with。但这绝对不是这种情况,因为这样使用它会在包含的脚本周围包裹一个html元素。

我认为包含将"只是"作为一个路由,但显然它做的更多一点,或者标记构建器做的比预期的更多(将包含的组件包装在一个额外的HTML标签中)。

有关于如何使用Groovy和它的行为的其他信息吗?

显然这是MarkupBuildersling.include一起工作的方式。在源代码中可以找到工作示例。

最新更新