我实现了一个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和它的行为的其他信息吗?
显然这是MarkupBuilder
和sling.include
一起工作的方式。在源代码中可以找到工作示例。