こんばんは。nabedgeこと渡辺です。 この記事はJava Advent Calendar 2013の8日目です。
さて、私が作っているMixer2というテンプレートエンジンですが、 秋口に秀逸な pull request をいただいたので、ありがたくマージしてversion1.2.17をリリースしました。
本当は先週リリースした1.2.14で既にマージ済みだったのですが、 JavaDocに書いたサンプルコードのとおりに書くと動かない(笑)というヤバいのがあったのでリリースしなおしました。 そのJavaDocを書いたのはプルリクをくれた人ではなく私です。 さらに言うと、リリース作業で凡ミスして1.2.15と1.2.16を欠番にしてしまったのも私です。 ^^;)
そんなことはさておき、何が新しくなったのかというとSpringMVCとMixer2を連携させるためのViewとViewResolverです。 とりあえずフルーツショップサンプルアプリケーションの商品配送先住所の入力画面用のコントローラで説明してみます。
@RequestMapping(value = "/shipping") public String shipping(Model model, @RequestParam(value = "redirected", required = false) boolean redirected, @Valid Shipping shipping, Errors errors) { model.addAttribute("shipping", shipping); model.addAttribute("redirected", redirected); model.addAttribute("errors", errors); return "checkout/shipping"; // 以前のMixer2ではここで return "shippingView" のように、 // springコンテナ上にDI済みのviewクラスの名称を // 与える必要があったが、新しいMixer2では // テンプレートファイルのパスでよい。 // そしてテンプレートファイルのパスは // Viewクラスのパッケージ名/クラス名とそのまま紐づくルール。 }
コントローラの戻り値はテンプレートファイルのパスそのものです。 つまり戻り値の書き方はInternalResourceViewResolver + JSPを使う場合と同じでいいところがポイントです。
次に、配送先住所の入力画面のViewクラスを見てみましょう。
// Viewクラスに@ComponentのようなDIアノテーションは不要。 // 新しいViewResolverが代わりにやってくれる。 public class ItemView extends AbstractMixer2XhtmlView { @Autowired protected FooBar fooBar; // もちろんSpringコンテナから任意の // オブジェクトをDIで受け取れる @Override protected Html renderHtml(Html html, Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws TagTypeUnmatchException { // Html html = mixer2Engine.loadHtmlTemplate(filePath); // のようなコードは不要。 // 新しくなったAbstractMixer2XhtmlViewが、 // コントローラのメソッドの戻り値で指定された // パスを使ってあらかじめテンプレートをロードして // Htmlオブジェクトに格納済み。 @SuppressWarnings("unchecked") List<Category> categoryList = (List<Category>) model.get("categoryList"); Item item = (Item) model.get("item"); // embed item box replaceItemBox(html, item); // 途中は省略 return html; }
ここでSpringの設定のほうを見てみます。
Mixer2XhtmlViewResolverのprefix,suffix,basePackageのプロパティがポイントです。
つまり、コントローラのメソッドの戻り値が "foo" の場合、
org.mixer2.sample.web.view.FooView がビュークラスで、
クラスパス上の m2mockup/m2template/foo.html がテンプレートファイルです。
コントローラのメソッドの戻り値が "foo/bar" の場合、
org.mixer2.sample.web.view.foo.BarView がビュークラスで、
m2mockup/m2template/foo/bar.html がテンプレートファイルということになります。
もちろんビュークラスはAbstractMixer2XhtmlViewを継承していなければなりません。 なお、複数のテンプレートを組み合わせてhtmlを生成したい場合は、ビュークラス内で getMixer2Engine()でいつでもエンジンを使えますので、好きなテンプレートをいくらでもロード可能です。
クレバーなプルリクをくださったkazuki43zooさんに感謝!
Java Advent Calendar 2013、 次はJavaFXの大御所、skrbさんです。
No comments:
Post a Comment