Java 如何为Groovy编程改进ApacheWicket?
我现在正在使用Groovy语言与ApacheWicket合作。我想知道是否有机会为Groovy编程改进ApacheWicket 我在想什么。我希望能够编写如下代码:Java 如何为Groovy编程改进ApacheWicket?,java,groovy,wicket,Java,Groovy,Wicket,我现在正在使用Groovy语言与ApacheWicket合作。我想知道是否有机会为Groovy编程改进ApacheWicket 我在想什么。我希望能够编写如下代码: new AjaxLink("ajaxLink", {link, target -> /* some Closure body */ }) @Override void onInitialize() { ajaxLink('link') { label('label') click { AjaxReque
new AjaxLink("ajaxLink", {link, target -> /* some Closure body */ })
@Override
void onInitialize() {
ajaxLink('link') {
label('label')
click { AjaxRequestTarget t, AjaxLink link -> // or even without these params
}
}
}
但是没有像这样的装饰
class GroovyWicketAjaxLink extends AjaxLink {
def clickClosure;
GroovyWicketAjaxLink(wicketId, onClickClosure) {
super(wicketId)
this.clickClosure = onClickClosure
}
void onClick(AjaxRequestTarget target) {
clickClosure.call([this, target]);
}
}
也许有某种方法可以创建某种类型的
DefaultWicketGroovyMethods
,并提供与DefaultGroovyMethods
完全相同的支持?我认为您应该启动一个名为Gricket的开源项目,这是一个适用于Wicket的Groovy DSL,您可以编写以下内容:
code = { // i wrote this in a closure, but you can write it in a separate file
ajaxLink id: "link", onClick: { ->
// write the link
}
}
它将被解析为脚本,missingMethod
调用被解析为apache wicket类的实例化:
class GricketParser {
def components = []
def methodMissing(String method, args) {
def clazz = "org.apache.wicket.ajax.markup.html." + method.capitalize() as Class
def component = clazz.newInstance()
args[0].each { key, value -> component[key] = value }
}
}
code.delegate = new GricketParser()
code()
您还可以在String
类之上应用元编程,而不是解析脚本
更新:
似乎是在2008年,关于groovy对匿名类的支持存在一些问题。新的
WicketBuilder的时间到了
?:-) 我认为您应该启动一个名为Gricket的开源项目,这是Wicket的一个Groovy DSL,您可以在其中编写以下内容:
code = { // i wrote this in a closure, but you can write it in a separate file
ajaxLink id: "link", onClick: { ->
// write the link
}
}
它将被解析为脚本,missingMethod
调用被解析为apache wicket类的实例化:
class GricketParser {
def components = []
def methodMissing(String method, args) {
def clazz = "org.apache.wicket.ajax.markup.html." + method.capitalize() as Class
def component = clazz.newInstance()
args[0].each { key, value -> component[key] = value }
}
}
code.delegate = new GricketParser()
code()
您还可以在String
类之上应用元编程,而不是解析脚本
更新:
似乎是在2008年,关于groovy对匿名类的支持存在一些问题。新的
WicketBuilder的时间到了
?:-) 最后,我创建了您要求的项目。我使用了ExtensionModule groovy特性,所以您只需要从github导入一个dsl项目并开始使用它。
带标签的AjaxLink的语法如下所示:
new AjaxLink("ajaxLink", {link, target -> /* some Closure body */ })
@Override
void onInitialize() {
ajaxLink('link') {
label('label')
click { AjaxRequestTarget t, AjaxLink link -> // or even without these params
}
}
}
您可以像您想象的那样链接组件:)使用Wicket感受groovy freedom。WicketDSL类中的所有方法都包括@DelegatesTo和@ClosureParams注释,所以您可以感受到对DSL的强大IDE支持。此外,使用此DSL编写的所有代码都支持@CompileStatic groovy注释。这将大大提高性能。
在此处签出两个github分支:
请随时与我联系。最后,我创建了您要求的项目。我使用了ExtensionModule groovy特性,所以您只需要从github导入一个dsl项目并开始使用它。 带标签的AjaxLink的语法如下所示:
new AjaxLink("ajaxLink", {link, target -> /* some Closure body */ })
@Override
void onInitialize() {
ajaxLink('link') {
label('label')
click { AjaxRequestTarget t, AjaxLink link -> // or even without these params
}
}
}
您可以像您想象的那样链接组件:)使用Wicket感受groovy freedom。WicketDSL类中的所有方法都包括@DelegatesTo和@ClosureParams注释,所以您可以感受到对DSL的强大IDE支持。此外,使用此DSL编写的所有代码都支持@CompileStatic groovy注释。这将大大提高性能。
在此处签出两个github分支:
请随时与我联系。我认为同时使用Wicket和Groovy存在一些基本问题-如果您不想编写大量支持代码,我不确定使用这种组合是否是一个好主意。Wicket肯定在一种非常具体的做事方式上投入了大量资金。(例如,API主要面向使用继承框架组件的模式等)实际上,Groovy现在显然有匿名内部类,这是我上次检查时的基本问题。(其余部分仍然适用,它是一个非常Java风格的OO框架。)我相信将Wicket和Groovy结合使用会有一些基本问题——如果您不想编写大量支持代码,我不确定将两者结合使用是否是一个好主意。Wicket肯定在一种非常具体的做事方式上投入了大量资金。(例如,API主要面向使用继承框架组件的模式等)实际上,Groovy现在显然有匿名内部类,这是我上次检查时的基本问题。(其余部分仍然适用,它在很大程度上是一个Java风格的OO框架。)