さて, メタオブジェクトの迷宮からようやく戻ってきた. 残りは wicket を動かすための手続きを grails のコードとして書いているだけだ. WicketGrailsPlugin.groovy に戻ろう.def doWithSpring = {
def applicationClass = application.allClasses.find { Application.class.isAssignableFrom(it) }
if(applicationClass) {
applicationBean(applicationClass)
}
}application
が GrailsApplication
だということが分かった. そうするとここには「この Grails アプリケーションが持つ (ロードした) すべてのクラスの中で wicket.Application
クラスと (ほぼ) 同じクラスがあれば, それを applicationBean
としてインスタンス化する (ここで Spring Bean Builder を使っている)」と書いてあることになる. その「wicket.Application
クラスと (ほぼ) 同じクラス」というのが, grails-app/controllers/WebApplication.groovy
なわけだ.def doWithWebDescriptor = { xml ->
def servlets = xml.servlet[0]
servlets + {
servlet {
'servlet-name'('wicket')
'servlet-class'('wicket.protocol.http.WicketServlet')
'init-param' {
'param-name'('applicationFactoryClassName')
'param-value'('wicket.spring.SpringWebApplicationFactory')
}
'load-on-startup'(1)
}
}
def mappings = xml.'servlet-mapping'[0]
mappings + {
'servlet-mapping' {
'servlet-name'('wicket')
'url-pattern'('/app/*')
}
}
}doWithWebDescriptor
は (アプリケーション起動時に Grails によって動的に作られる) web-app/WEB-INF/web.xml
に関するクロージャ. web.xml の作成時に呼び出され, web.xml に以下を付け加える.<servlet>
<servlet-name>wicket</servlet-name>
<servlet-class>wicket.protocol.http.WicketServlet</servlet-class>
<init-param>
<param-name>applicationFactoryClassName</param-name>
<param-value>wicket.spring.SpringWebApplicationFactory</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>wicket</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
こんなくそ XML を書かずに済んでいるのは Groovy の Markup Builder のおかげだ.
で, この plugin がやっているのはこれだけ. つまり普通の J2EE アプリケーションで Wicket を使うときにやる設定の手続きを WicketGrailsPlugin.groovy
に書いているのだ. 後は grails の枠組み (特に GORM) がすべてそのまま使えている.
よくできました.