2

私はMarkupBuilderを使用して、次のようにtaglibからHTMLをレンダリングしています(わかりやすくするために削除されています)。

def formContainer = new MarkupBuilder(out)
formConainer.form() {
   input() { }
   input() { }
}

ここで、form()内のどこかで、ユーザーが指定したいくつかの要素を取り込みたいと仮定します。そのため、ファイルシステム上のファイルには、次のようなものがあります(ここでも簡略化されています)...

select() {
  option()
  option()
}

私の質問は、そのselectを文字列として読んだ場合、taglibがそれをGroovyとして解析し、MarkupBuilderインスタンスの一部にする方法はありますか?

def formContainer = new MarkupBuilder(out)
formConainer.form() {
   input() { }
   input() { }

   // I want the select to render here
}
4

1 に答える 1

1

これを行うための1つの方法は次のとおりです。

String externalMarkup = '''
select() {
  option()
  option()
}
'''
def out = new StringWriter()

def formContainer = new groovy.xml.MarkupBuilder( out )
formContainer.form() {
   input()
   input()

   // Wrap the string in { -> ... } to make it a closure, and evaluate it
   def extern = new GroovyShell().evaluate( "{ it-> ${externalMarkup} }" )
   // Set the delegate of this closure to the MarkupWriter
   extern.delegate = formContainer
   // Then execute the closure
   extern()
}
println out.toString()

しかし、これは私にはもろく感じます...

より良い方法は、GroovyTemplateEngineを使用して、フォーマットされた完全なマークアップに値を挿入することです。

于 2011-10-12T08:59:15.460 に答える