一般情况下,是不建议在xwiki页面创建一个Groovy类,通常更好的方式是用Java创建代码,然后通过Script Services在XWiki页面调用。
然而,在少数情况下是需要的,如当在一个wiki页面创建一个Groovy类,在其他wiki页面复用。
XWiki语法2.0
- 创建一个页面,例如Groovy.HelloWorldClass包含: 此页面必须由具有编程权限的用户保存。 {{groovy}} class HelloWorld { String say() { return "Hello World" } } {{/groovy}}
- 在其他wiki页面使用这个Groovy class,假定Main.HelloWorldFromGroovy: 此页面必须由具有编程权限的用户保存。 {{include document="Groovy.HelloWorldClass"/}}
{{groovy}}
println new HelloWorld().say()
{{/groovy}}
现在,当你查看Main.HelloWorldFromVelocity页面时,你会看到:Hello World
- 请注意,这种方式是无法在Velocity调用HelloWorld类,你需要使用一个Groovy宏来查看。
- 几个变量如xwiki,doc,xcontext已经绑定到Groovy的执行上下文,并且可以使用。有关详细信息,请参阅脚本页面。
XWiki语法1.0
你需要使用XWiki.parseGroovyFromPage API方法。这种方法允许你从Velocity和Groovy脚本实例化一个Groovy类。
- 创建一个新的页面,例如Groovy.HelloWorldClass包含:
- 此页面必须由具有编程权限的用户保存。
- 当创建一个页面,通过parseGroovyFromString以确保你闭合groovy标识符。
/* Groovy Class #* */
class HelloWorldClass
{
def xwiki
def context
void setObjects(xwiki, context)
{
代码语言:txt复制 setXWiki(xwiki)
代码语言:txt复制 setContext(context)
}
void setXWiki(xwiki)
{
代码语言:txt复制 this.xwiki = xwiki
}
void setContext(context)
{
代码语言:txt复制 this.context = context
}
String say()
{
代码语言:txt复制 return "Hello World"
}
}
/* *# */
代码语言:txt复制- 注意,可以把一个Velocity注释放在Groovy注释里,这样代码不会被Velocity解析。
- 正如你所看到的,我们可以在这个类里获取和存储XWiki和Context对象,以便能够使用它们
用Velocity实例化和使用你的类
- 创建一个新的页面,例如Main.HelloWorldFromVelocity包含: #set(groovyObject = xwiki.parseGroovyFromPage("Groovy.HelloWorldClass")) groovyObject.setObjects( xwiki, context) groovyObject.say()
用Groovy实例化和使用你的类
- 创建一个新页面,例如Main.HelloWorldFromGroovy包含: 此页面必须由具有编程权限的用户保存。 <% groovyObject = xwiki.parseGroovyFromPage("Groovy.HelloWorldClass") groovyObject.setObjects(xwiki, context) print groovyObject.say() %>