Tags: mixer2 SpringMVC java

今月、Mixer2は実は2回リリースしてます。1.2.33と1.2.34。 1.2.33では一部のメソッドをprivateからprotectedにしたことで拡張、改造がしやすくなりました。 1.2.34ではSpringMVC用のAbstractなViewクラスを少し変更しています(下位互換性はありますのでご安心ください)。また、XMLStringUtilというユーティリティクラスを追加しています。

まずXMLStringUtil。これはXHTML(XML)として有効な文字列かどうかを判別したり、無効な文字列を任意の文字(デフォルトだと空白ひとつ)で置換することができます。 XMLで使用できる文字列はw3c.org上で厳密に決められています。簡単に言うと、いわゆるUTF-8の範囲内の文字と、あとは改行、空白、タブ等のごく限られた制御コードのみということです。 XHTMLはXMLのサブセットですから右に同じということになり、Mixer2が使用しているJavaのJAXB実装もこれに厳密に従っています。そのため、妙な制御コード、たとえば改ページ制御コードがxhtmlテンプレート上に含まれていたり、あるいはそれをorg.mixer2.jaxb.xhtml.*配下のタグ型の内部にうっかり仕込もうとすると、saveToStringする段階で例外が発生してしまうことがあります。 XMLStringUtilはその防波堤となるユーティリティです。

次に、SpringMVC用の抽象ビュークラスに新たにmodifyHtmlStringHookというメソッドを追加しました。 このメソッドは、Mixer2がhtmlオブジェクトをsaveToString()して文字列化したあとに呼ばれ、その後すぐhttp responseするようになっています。

デフォルトのままだとスルーパスするだけ(何もしない)ですが、Viewの実装クラス内でこのメソッドをオーバーライドすると、httpレスポンスされる直前のhtml文字列(Html型のインスタンスではなく)を直接操作できます。これによって、Mixer2ではできないこと、たとえばhtmlコメント等の埋め込みが可能です。 たとえば、HTML5未対応なIE8以下を擬似的にhtml5対応させるために、html5.jsを使うことがあると思います。 しかし、公式サイトを見ての通り、これは

<!--[if lt IE 9]><script src="dist/html5shiv.js"></script><![endif]-->
のように、IE特有のコンディショナルコメントとして埋め込む必要があります。Mixer2はhtmlコメントを埋め込むことができない(あっても無視してしまう)ので、Mixer2付属のSpringMVC用のビュー/ビューリゾルバでは使用できませんでした。1.2.34以降では、modifyHtmlStringHook() をオーバーライドして、例えば</head>タグのあたりをString#replace()メソッド等を使って狙い撃ちにすれば、上記のコンディショナルコメントを追加することができます。

まだ公式マニュアルには実はどちらもまともに書いていません。そのうちちゃんと書かねば。