妄想の世界の話。

テンプレートエンジンは、幾つかの方法で、パフォーマンスアップ出来ると考えるます。

  • デプロイ前のコンパイルプロセスを置く
    • JSPは記法が余りにアレなのだけど、動作モデルは、今でも優れていると思うなり。
  • テンプレートに対応するモデルオブジェクトを、確定する。
    • EL的なモノを全て、コンパイル時に通常のメソッド呼出しに変換出来たりするんじゃないかなぁ。

んで、こんな感じのモノを妄想する感じ。

  • モデルオブジェクト
package com.examples;
import java.util.ArrayList;
import java.util.List;
public class Hoge {
	private int a;
	private String b;
	private List<Moge> moges = new ArrayList<Moge>();
	public static class Moge {
		private String c;
		public String getC() {
			return c;
		}
		public void setC(String c) {
			this.c = c;
		}
	}
	public int getA() {
		return a;
	}
	public void setA(int a) {
		this.a = a;
	}
	public String getB() {
		return b;
	}
	public void setB(String b) {
		this.b = b;
	}
	public List<Moge> getMoges() {
		return moges;
	}
	public void setMoges(List<Moge> moges) {
		this.moges = moges;
	}
	public String getScript() {
		return null;
	}
	public void setScript(String s) {

	}
}
  • テンプレート
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns:h="com.examples.Hoge" xmlns:i="com.examples.Hoge.Moge"><body>
<form>
<label h:output="hoge.a">300</label>
<label h:output="hoge.b">bb</label>
<div h:loopValue="moge" h:loop="hoge.moges">
<label h:output="moge.c">CCC</label>
<input type="submit" value="Aaaa" h:onclick="hoge.script"/>
</div>
</form></body></html>

namespace宣言で、モデルオブジェクトを指定するってアイディアは、id:shot6さんから貰うました。

  • :outputだと、タグのValueを置き換える感じ。
  • :loopValueとか、:loopは、記述されているタグを実行後にはレンダリングしない。
  • :onclickみたいに、HTMLに元々ある属性なら、その属性をレンダリングする。


DreamWeaverに属性を独自namespaceの属性を消されたりする様なら、そっちのプラグインも作る勢いで。

package com.examples;
import java.io.IOException;
import java.io.OutputStream;
import com.examples.Hoge.Moge;
public class HogeTemplate_generated implements Render<Hoge> {
	private static final byte[] LITE_01 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<html><body>\r\n<form>".getBytes();
	private static final byte[] LITE_02 = "<label >".getBytes();
	private static final byte[] LITE_03 = "</label>".getBytes();
	private static final byte[] LITE_04 = "<input type=\"submit\" value=\"Aaaa\" onclick=\"".getBytes();
	private static final byte[] LITE_05 = "\"/>".getBytes();
	private static final byte[] LITE_99 = "\r\n</form></body></html>".getBytes();

	public void render(Hoge t, OutputStream out) throws IOException {
		out.write(LITE_01);
		out.write(LITE_02);
		out.write(t.getA());
		out.write(LITE_03);

		out.write(LITE_02);
		out.write(t.getB().getBytes());
		out.write(LITE_03);

		for (Moge moge : t.getMoges()) {
			out.write(LITE_02);
			out.write(moge.getC().getBytes());
			out.write(LITE_03);
		}
		out.write(LITE_04);
		out.write(t.getScript().getBytes());
		out.write(LITE_05);

		out.write(LITE_99);
	}
}

幾つかポイントがあるます。

  • テンプレートクラスは、状態を一切持たない。つまり、インスタンスはSingleton。
  • テンプレートの時には、XMLとしてパースするものの、
    テンプレートクラスとして実行される時には、フラットな構造として処理する。
    • 正直、Xercesがぁぁ…Xercesがぁぁ…とか悶絶するのは嫌です。
      少々遅くても許されるコンパイルプロセスの時のみ、XMLパーサを使うます。


みたいな感じかなぁ…。どうでっしゃろ。