Info | ||
---|---|---|
| ||
Version 2.0.46 of the org.apache.sling.scripting.core bundle provides an OSGi console plugin that dynamically retrieves the actual scripting variable names and types, at /system/console/scriptingvariables |
Sling's scripting variables and script languages
Table of Contents |
---|
Common scripting variables
...
Since JSPs already have a few Java-objects pre-defined, things have to be named differently here. And you will have to explicitly require the variables to be defined with a custom tag <sling:defineObjects />
. Your jsp should start with:
Code Block |
---|
<%@ page session="false" %>
<%@ page import="javax.jcr.*,
org.apache.sling.api.resource.Resource"
%>
<%@ taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling/1.0" %>
<sling:defineObjects />
|
...
For example, to specify that the Logger
object should be available as a scripting variable named logger
(instead of log
):
Code Block |
---|
<sling:defineObject logName="logger"/>
|
...
Instead of sling.include("/path/to/resource")
you can use the sling taglib for that:
Code Block |
---|
<sling:include path="/path/to/resource" />
|
...
Here's a few of the objects and methods available in an ESP file:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<html>
<head><title>Sling ESP reference documentation</title>
</head>
<body>
<h2>Sling ESP documentation (work in progress)</h2>
<p>Have a look at this file's source or at Sling's ScriptableNodeTest.java</p><br/>
<%= 'tags: use \<%= %\> to evaluate, \<% %\> otherwise.' %>
<% 'e.g. this will not be printed'; %><br/>
<%
// create a new node under currentNode
var n = currentNode.addNode('n');
prt('path of n: ' + n.getPath());
// create new node and specify node type
var n2 = n.addNode('n2', 'nt:folder');
// set and get property
n.setProperty('thename', 'thevalue');
prt('get prop thename: ' + n['thename'] ); // thevalue
prt('another way: ' + n.thename ); // thevalue
prt('get type of n2: ' + n2['jcr:primaryType'] ); // nt:folder
prt('test type of n2: ' + n2.isNodeType('nt:folder') ); // true
// iterate over properties
var props = n.getProperties();
for(i in props) {
prt('getProperties(): ' + props[i].name + ': ' + props[i].value.string);
}
// getNodes()
n.addNode('abcd');
n.addNode('abcdef')
n.addNode('abcdefgh');
prt('get all nodes: ' +n.getNodes().length ); // 4, incl n2
prt('get abcd: ' +n.getNodes('abcd').length ); // 1, abcd
prt('get abcde*: ' +n.getNodes('abcde*').length ); // 2, abcdef and abdefgh
// remove()
n.getNode('abcd').remove();
prt('removed abcd node ' + n.hasNode('abcd')); // false
// get the root node (3 ways)
prt( currentNode.getAncestor(0));
prt( currentNode.session.getRootNode());
prt( currentNode.getSession().getRootNode());
// include the rendered result of another node (see Sling in 15 minutes)
// sling.include("/content/header", "forceResourceType=wiki.page,replaceSelectors=edit,replaceSuffix=validation");
function prt(s) { out.print(s+'<br/><br/>'); }
%>
</body>
</html>
|
...
An enhanced version of the GET.groovy script from http://sling.apache.org/site/groovy-support.html that shows all the variables and a little of what's groovy about Groovy.
Code Block |
---|
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
log.info "Groovin' on ${resource}"
def mb = new groovy.xml.MarkupBuilder(out)
mb.html {
// Shouldn't javax.jcr.Property.getString() take care of this for us?
def formatMultipleValues = { prop ->
if (prop.definition.isMultiple()) {
prop.values.string.join('; ')
} else {
prop.string
}
}
def tableForMap = { cap, map ->
table {
caption { h2 cap }
tr { th 'property' ; th 'value' }
map.each { key, value -> tr { td key ; td value } }
}
}
meta {
title 'Groovy Scripting Sample for Sling'
}
body {
h1 "Hello World !"
p "This is Groovy Speaking"
p "You requested the Resource ${resource} (yes, this is a GString)"
// If we get called on a system file, then there won't be a currentNode binding.
if (this.binding.variables.containsKey('currentNode')) {
table {
caption { h2 'Current Node Properties' }
tr { th 'property' ; th 'value' }
currentNode.properties.each { prop -> tr { td prop.name ; td formatMultipleValues(prop) } }
}
}
tableForMap 'Resource Properties', resource.properties
tableForMap 'Script Bindings', this.binding.variables
tableForMap 'Request Properties', request.properties
}
}
|
...