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サポートを作成する方法があるのではないDefaultGroovyMethodsでしょうか?

4

2 に答える 2

1

Wicket 用の Groovy DSL であるGricketというオープンソース プロジェクトを開始する必要があると思います。

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 ウィケット クラスのインスタンス化として解決されます。

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 アノテーションが含まれているため、DSL に対する優れた IDE サポートを感じることができます。また、@CompileStatic groovy アノテーションは、この DSL で記述されたすべてのコードでサポートされています。パフォーマンスが大幅に向上するはずです。ここで 2 つの github ブランチをチェックアウトしてください: https://github.com/eugene-kamenev/wicket-groovy-DSLお 気軽にお問い合わせください。

于 2014-07-17T10:50:52.213 に答える