Java 如何为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

我现在正在使用Groovy语言与ApacheWicket合作。我想知道是否有机会为Groovy编程改进ApacheWicket

我在想什么。我希望能够编写如下代码:

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框架。)