こんばんは。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