ushidayの日記

主に「IBMi」のメモに・・・

9章、10章が終わった

ようやく、Grails徹底入門の9章と10章が終わりました。ちゃんと理解しているかどうかは、怪しいですけど、とにかく終わりました。最近余り、時間が取れなくて、進むペースがイマイチです。

内容的には、プラグインに関する事だったのですが、「Grailsの凄さは、プラグインにあるんだろうなぁ」と素人的に、垣間見たそんな内容でした。何となくですが、以前「9〜11章をぜひ先に読んで」って言われたのが、解った気がします。以下は、終わってみての感想ですが、何せ素人なので間違った表現が多いと思いますが、ご勘弁を。

grails.spring.BeanBuilder”は、XMLファイルでなく、GroovyのDSL?(この表現は不安です)で、ビーン定義出来てしまう事。これは、自分みたいな人間には、直感的で解り易いです。BeanBuilderを使っていて、特に意識はしないですが、クロージャーを引数にして、XMLと最終的に同等にしてくれているんだろうなぁ。便利だなぁと思いました。
自分は、”Spring”その物を使った経験が無いので、比較してどうだ?という思いは無いですが、”BeanBuilder”解りやすくて、いいんでない。と思いました。

”doWithSpring”は、プラグイン定義ファイル(〜GrailsPlugin.groovy)上に存在するクロージャですが、”BeanBuilder”をさらに意識せず使えて、ナイスな感じがしました。”doWithSpring”で、ビーンを定義するだけで、ApplicationContext上にロードされて、簡単にコントローラなどに、インジェクション出来てしまいます。
例えばこんな感じです。

    def doWithSpring = {
        // TODO Implement runtime spring config (optional)
    	//メール送信用ビーン定義(p348)
    	mailSender(org.springframework.mail.javamail.JavaMailSenderImpl){
    		host = "smtp.xxxxx.xxxxx"	//smtpサーバー
    		port = 587			//サーバーポート
    	}
    	//メールメッセージ用ビーン定義(p348)
    	simpleMailMessage(org.springframework.mail.SimpleMailMessage){
    		from = "xxxxx@xxxxxxx.com"	//送信元
    	}
    }

”doWithDynamicMethod”は、プラグイン定義ファイル上に存在するクロージャで、動的にメソッドを、コントローラなどのArtefactに追加できます。”doWithSpring”でロードしたビーンはコントローラで、簡単にインジェクションする事が可能です。
例えばこんな感じ

---------コントローラ----------
import org.springframework.mail.SimpleMailMessage
class HomeController {
	//ビーンのインジェクション
	def mailSender 
	def simpleMailMessage
	
	//メールテストアクション(p349)
	def simpletest = {
		
	def message = new SimpleMailMessage(simpleMailMessage)
	message.to = ["xxxxxx@xxxxxxxx.co.jp"]
	message.subject = "メール送信テスト"
	message.text = "メッセージ"
	try{
		//メール送信
		mailSender.send(message)
		render (text:"メールを送信しました")
	}catch(Exception e){
		e.printStackTrace()
		render (text:"送信エラー。スタックを調べて下さい。")
	}

	}

}

しかし、コントローラ共通の機能だったら、毎回ビーンをインジェクションしたり、関連するライブラリをインポートしたり、するのは手間なんで、そんな時”doWithDynamicMethod”で、以下の様に、動的に共通機能を実装できてしまいます。

---------プラグイン定義ファイル----------	                                      
def doWithDynamicMethods = { ctx ->
    //コントローラの参照
    application.controllerClasses.each{ controllerClass ->
    	// metaClass参照
    	def mc = controllerClass.metaClass
    	registerControllerProps(mc,ctx)
    }
}

//メール送信の実装
def registerControllerProps(mc,ctx){
		
	// sendEmailメッソドの追加
	mc.sendEmail = {params ->

	// SimpleMailMessageのコンストラクタに
	// コンテキストから取得したsimpleMailMessageビーンをセット
	def message = new org.springframework.mail.SimpleMailMessage(ctx.simpleMailMessage)
	if(params.from) message.from = params.from
	message.to = params.to
	message.subject = params.subject
	message.text = params.text
	try{
	// ビーンmailSenderをコンテキストから参照
	def sender = ctx.mailSender
	if(params.encoding) sender.defaultEncoding=params.encoding
	sender.send(message)
	}catch(Exception e){
	e.printStackTrace()
	}finally{
	return ""
	}

	}
	
}

---------コントローラ----------
class HomeController {
	
	def mailtest= {
		def message = "メッセージ"
		//メール送信(〜GrailsPlugin.groovyのdoWithDynamicMethodで実装)
		sendEmail(
			to:["xxxxxxx@xxxxxxxxx.co.jp"]
			,subject:"sendEmailのテスト"
			,text:message
			,encoding:"iso-2022-jp")
		
		render(text:"メールを送信しました sendEmail")
	}

}

上記とは別に、動的に追加した、メソッドにはリロード処理が必要になってきます。

これらプラグインのパワーを、早く使いこなせる様になりたいです。