play1のrender
メソッドは巧みに隠されていますが、Result
クラスを継承したランタイム例外を投げるようになっています。
こうした実装により、コントローラ処理での終わり方を意識することなく、バッサリ終わらせるような記述ができ、本来のコーディングに集中できるようになっています。
ということで私はrender
メソッドで例外が投げられることは知っていたので、これを捕捉すればテンプレート処理した結果を簡単に見られると思っていましたが、どうもそう簡単にはいかないようで。。
try {
render();
} catch (RenderTemplate result) {
Logger.info("html=%s", result.getContent());
throw result;
}
このようなコードを書いてみたのですが、例外が捕捉されることはありませんでした。(ページはちゃんと表示される)
play1ではapp配下を自前でコンパイルしています。その際に便利になるようにコードに少しだけ変更を加えています。それを担っているのが play.classloading.enhancers.Enhancer
を継承したクラス群です。
今回は play.classloading.enhancers.ControllersEnhancer
クラスが働いて、play.mvc.results.Result
や play.Invoker.Suspend
を継承したクラスがキャッチされると即再スローするコードを埋め込んでいるようでした。
ユーザのコードが実行される前に再スローしてしまうために捕捉に失敗しているように見えていた、と。
そんなわけで例外オブジェクトが投げられる直前の処理を抜き出せば、テンプレート処理した結果を文字列でゲットできました。
Template template = TemplateLoader.load(template("Application/index.html"));
String html = template.render(renderArgs.data);
Logger.info("html=%s", html);
省略していますが、テンプレート内で params
や session
などのオブジェクトを参照している場合は、renderArgs.data
にそれらも追加する必要があります。
詳しくは play.mvc.Controller.renderTemplate(String, Map)
の実装を見てみてください。