これは Mayaa Advent Calendar 2015 の5日目です。昨日は「MayaaでWebサイトのビューを実装するときに押さえておくべき基本テクニック2 – m:idの実装における注意点」でした。
ふう、今日で5日目ですか。25日書き続けるのが不安になってきました。でも、おかげさまで、いつもよりも多くの方に読んでいただいているようです。出来る限り途切れさせないように頑張ります。
今日は何を書きましょうかね。困ったときは過去記事の焼き直し...全く同じでも仕方がないですが、ここに書いていることでまだ書いていないことを今日は書きます。
いしがみメソッド3. m:idを減らすテクニック
mayaaファイルはxmlなので、サイズが大きくなると、XMLエディタが重くなったりします。なので、なるべくなら、m:idは減らしたいと思ってきます。
1.m:idをパラメータ対応にする
m:idを減らすテクニックとして、同じようなメソッドをパラメータ化すればまとめられることが良く有ります。
そんな時は、こんな関数を作りましょう。
function $p(name, defaultValue) {
var attr = originalNode.getAttribute(
Packages.org.seasar.mayaa.impl.engine.specification.SpecificationUtil.createQName(name)
);
if (attr != null) return attr.value;
attr = originalNode.getAttribute(
Packages.org.seasar.mayaa.impl.engine.specification.SpecificationUtil.createQName(originalNode.getDefaultNamespaceURI(), name)
);
return defaultValue;
}
使い方はこんな感じです。例えば
一昨日書いたforプロセッサーの件は
<m:for m:id="LOOP_ITEM" init="${var loopItemIndex = 0;}" test="${loopItemIndex > items.size() && loopItemIndex > toInt($p('max'), 999999)}" max="999999">
<m:echo>
<m:doBody />
</m:echo>
</m:for>
事前に次の関数をload関数で読み込む外部jsファイルなどで読み込んでおいたとします。
function toInt(s, default) {
try {
return java.lang.Integer.parseInt(s);
} catch (e) {
return default;
}
}
使うときはこんな感じに出来ます。
<div m:id="LOOP_ITEM" m:max="10">
...
</div>
このようにすることで、最初の10件のみを表示することができます。
この他にも、m:ifプロセッサーに対して常に条件を逆にするパラメータを作って、逆条件のためのm:id発行を減らすこともできます。(僕はそのためにプロセッサーを作ったりします。プロセッサーの独自作成については、後日説明します。)
PathAdjusterを効果的に使う
PathAdjusterは、画像などの相対パスを自動調整して、サーバー実行時に絶対パスに変換する機能です。本来はjpgなどの画像やjsファイルなどに使うものですが、独自のロジックを追加して、リンク先のURLをいい具合に変換すると、単なるリンクではわざわざm:idを発行しなくても良くなることが有ります。
公式マニュアル - 5-9. パス自動調整の設定 を参照してパス自動調整機能をカスタマイズしましょう。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE provider
PUBLIC "-//The Seasar Foundation//DTD Mayaa Provider 1.0//EN"
"http://mayaa.seasar.org/dtd/mayaa-provider_1_0.dtd">
<provider>
<pathAdjuster class="jp.example.MyPathAdjuster">
<parameter name="enabled" value="true"/>
<parameter name="force" value="false"/><!-- since 1.1.13 -->
</pathAdjuster>
</provider>
そして、jp.example.MyPathAdjuster を作成しておきます。
package jp.example;
import org.seasar.mayaa.impl.builder.PathAdjusterImpl;
public class MyPathAdjuster extends PathAdjusterImpl {
@Override
public String adjustRelativePath(String base, String path) {
if (path.endsWith(".html")) {
return MyConst.SITE_ROOT_URL + "/" + path;
}
return super(base, path);
}
}
実際のシステムでは色々なパス階層があると思うので、色々工夫してかけると思います。
参考PathAdjuster のカスタマイズ - marcie001のメモ
以前はPathAdjusterは、この他に、画像のタイムスタンプを出力してキャッシュに使うこともできます。。。などと以前は言っていましたが、ファイルのタイムスタンプをリアルタイムに検索するのも少なからず負荷がかかりますし、最近はcloudfrontなどのCDNを使うことも多かったりします。画像自体別サーバーに置くかもしれません。その辺り、サービスの規模や正確に合わせてください。そんな時も、PathAdjusterがプログラマブルであることが役に立つと思います。
まとめ
今回は、m:idを減らすテクニックを紹介しました。ただし、減らし過ぎにも注意してください。あくまで、デザイナーへの使いやすさを前提にしてください。
あまりやり過ぎると、結局混乱を招いてしまいます。こういう暗黙なことをやるときは、事前に説明しておきましょう。