1

我现在正在使用 Groovy 语言使用 Apache Wicket。我想知道是否有机会为 Groovy 编程改进 Apache Wicket?

我在想什么。我希望有能力编写这样的代码:

new AjaxLink("ajaxLink", {link, target -> /* some Closure body */ })

但是没有创建像这样的装饰器

class GroovyWicketAjaxLink extends AjaxLink {
    def clickClosure;

    GroovyWicketAjaxLink(wicketId, onClickClosure) {
        super(wicketId)
        this.clickClosure = onClickClosure
    }

    void onClick(AjaxRequestTarget target) {
        clickClosure.call([this, target]);
    }
}

也许有某种方法可以创建某种DefaultWicketGroovyMethods与支持完全一样的 for DefaultGroovyMethods

4

2 回答 2

1

我认为您应该启动一个名为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 年提出的,在对匿名类的常规支持方面存在一些问题。是时候换一个新的了WicketBuilder?:-)

于 2013-02-14T11:17:46.940 回答
0

最后,我创建了您要求的项目。我使用了 ExtensionModule groovy 功能​​,所以你只需要从 github 导入一个 dsl 项目并开始使用它。带有标签的 AjaxLink 的语法如下所示:

@Override
void onInitialize() {
 ajaxLink('link') {
     label('label')
     click { AjaxRequestTarget t, AjaxLink link -> // or even without these params

     }
  }
}

您可以像在脑海中想象的那样链接组件 :) 使用 Wicket 感受美妙的自由。WicketDSL 类中的所有方法都包含@DelegatesTo 和@ClosureParams 注解,因此您可以感受到IDE 对DSL 的出色支持。此外,使用此 DSL 编写的所有代码都支持 @CompileStatic groovy 注释。它应该会大大提高性能。在此处查看两个 github 分支: https ://github.com/eugene-kamenev/wicket-groovy-DSL 并随时与我联系。

于 2014-07-17T10:50:52.213 回答