<?xml version="1.0" encoding="Shift_JIS"?>
<document>

  <properties>
    <author email="jon@latchkey.com">Jon S. Stevens</author>
    <title>You make the decision - Generation?</title>
    <translator>熊坂祐二</translator>
    <original>ymtd/ymtd-generation</original>
  </properties>

<body>

<section name="生成?">

<p>
JSPが宣伝している利点として、それが現存の.jspページを取り出し、
速度と効率のために、それをコンパイルしてServletにすることがあげあれます。
これが意味することは、最初に.jspページを解析して、結果として
乱雑に、より低レベルになったあとで、javacや、あなたの好きなJava
コンパイラ(たとえば: Jikes)によってServletが .class ファイルにコンパイル
され、それからServletエンジンにロードされます。
ふぅ、これ全てを説明するだけで頭痛がしてくるけど、あなたはどう?
</p>

<p>
ポイントは、JSPを使うのは、今や多段階プロセスということです。
JSPの著者は、あなたがそれに気がつきさえしないような方法において、
舞台裏にこのプロセスやり方を隠すうまい仕事をしました。
人は、単に彼らの大好きなエディタで.jspページを編集して、
ページを彼らのブラウザを使用して呼び出すことで、
それからそれを.classファイルに変換するプロセスを開始します。
</p>

<p>
.jspテンプレートから生成されるものには、いくつかの基本的な問題があります。
まずは、そのクラス名です。
突然生成されるかもしれないので、クラスローダーの問題に対処するために、
エンジンはユニークな名前を生成する必要があります。
したがって、人が.jspページを修正するどの時も、新しいファイルは、
一時的なディレクトリにおいてディスクの上で作成されます。
残念なことに、誰かがそれをクリーンナップしようとするまで、
このディレクトリは結局サイズが増えつづけることになります。
エンジンは、多分、それから、それが間違ったファイルを実際に削除する
かもしれないのを除いて、あなたのためにこれをすることが出来る
かもしれません。
</p>

<p>
ポイントは、編集-&gt;変換-&gt;コンパイル-&gt;ロード-&gt;実行という全部のプロセスは、
本当に不必要でとくに、悪い設計です。
一方、Velocityは単にテンプレートをロードし、一度だけ、それらを解析します、
それから何度も再利用されるようにメモリで、
テンプレートの抽象的な構文木（AST）表現を格納します。
プロセスは、単に編集-&gt;解析-&gt;実行です。
結局、利点は非常により速いことと、それもjavacコンパイラと一時的な
ディレクトリをうろつくようにする必要がありません。
Velocityで、テンプレートを変更するとき、
現存の蓄積されたテンプレートは単に新たに解析された
バージョンと置換されます。
</p>

<p>
テンプレートのためのVelocityの方法への別の利点は
実際のテンプレート・データがどこにでも格納することができることです。
それには、データベースまたはリモートURIを含まれます。
可変なテンプレート・ローダーを使用することによって、
あなたが欲しいものは何でもすることができるテンプレート・ローダーを作成することが可能です。
</p>

<p>
Turbineなしでさえ、Velocityはエラーの処置にいくつかの方法を提供します。
StrutsとTurbineのようなフレームワークがすぐ手近にやって来るものは、
エラーを正しく扱う方法を提供しています。
しかし、StrutsがJSP上に基礎をおかれるという事実のために、
それは問題の量がJSPと関連した同じものを受け継ぎます。
次の章は、これに関するより多くの詳細に入ります。
</p>

<p>
下で示される設計の中の1つの決定的な問題は、
JSPページが例外のものを捕えるだけであるということです。
JSPページが OutOfMemoryError のような別の例外を投げる場合どうだろう？
この問題は、OutOfMemoryError が Throwable (例外でない) に基礎をおかれるということです。
したがって、JSPページだけでこの例外を捕えることは、ずっと難しいです。
</p>

<p>
NASA(数10億ドル設備を天国に飛ばします)で、
我々の友人によって提供されるこの素晴らしい
<a href="./images/jsp-nasa-crash.gif" target="newWindow">例</a>は、
JSPがよりよくエラーの取り扱いを必要とする理由の完全な例です。
</p>

<p>
絶えず、出力ストリームに書くことはあまり効率的でないので、
バッファリングはまた、別の大きな問題です。
</p>

<source><![CDATA[
<%@ page buffer="12kb" %>
<%@ page autoFlush="true" %>
]]></source>

<p>
これらは、ページをautoFlushするために出力された12kbをバッファリングするようにJSPに伝える例です。
Struts+JSPは、JSPテンプレートを通してVIEW部分を提供することによってMVCモデルを実装しました。
それらのタグがふさわしいように、あなたはMVCモデルのどんな部分を考えますか？
あなたはそれを推測しました。そして、彼らがいる部分が使われませんでした。
</p>

<p>
この問題を扱うことへのVelocityの方法は、
開発者を許すことによって翻訳エンジンにストリームをパスすることです。
翻訳の間、投げられる例外があるならば、例外を捕捉して扱うことができます。
緩衝することは、また、パーサーに正しくバッファされたストリームをパスすることによって取り扱われます。
再び、エラーがあるならば、別のストリームは簡単に出力の代用にされることができます。
</p>

<p>
これは、Tomcat 3.3m2により生成された中間コードの例です。
</p>

<source><![CDATA[
package jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class helloworld_1 extends org.apache.jasper.runtime.HttpJspBase {

    static {
    }
    public helloworld_1( ) {
    }

    private static boolean _jspx_inited = false;

    public final void _jspx_init() throws org.apache.jasper.JasperException {
    }

    public void _jspService(HttpServletRequest request, HttpServletResponse  response)
        throws java.io.IOException, ServletException {

        JspFactory _jspxFactory = null;
        PageContext pageContext = null;
        HttpSession session = null;
        ServletContext application = null;
        ServletConfig config = null;
        JspWriter out = null;
        Object page = this;
        String  _value = null;
        try {

            if (_jspx_inited == false) {
                _jspx_init();
                _jspx_inited = true;
            }
            _jspxFactory = JspFactory.getDefaultFactory();
            response.setContentType("text/html;charset=8859_1");
            pageContext = _jspxFactory.getPageContext(this, request, response,
			"", true, 8192, true);

            application = pageContext.getServletContext();
            config = pageContext.getServletConfig();
            session = pageContext.getSession();
            out = pageContext.getOut();

            out.write("<html>\r\n<head><title>Hello</title></head>\r\n<body>\r\n<h1>\r\n");
            if (request.getParameter("name") == null) 
              out.write("\r\n          Hello World\r\n");
            else 
              out.write("\r\n          Hello, ");
            request.getParameter("name"); 
              out.write("\r\n</h1>\r\n</body></html>\r\n");

        } catch (Exception ex) {
            if (out != null && out.getBufferSize() != 0)
                out.clearBuffer();
            if (pageContext != null) pageContext.handlePageException(ex);
        } finally {
            if (out instanceof org.apache.jasper.runtime.JspWriterImpl) { 
                ((org.apache.jasper.runtime.JspWriterImpl)out).flushBuffer();
            }
            if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);
        }
    }
}
]]></source>

<p>
あなたが判断してください。
</p>
<p>
<strong>[ <a href="ymtd-saying-hello.html">Saying Hello</a> &lt;- 前 | 
    次 -&gt; <a href="./ymtd-error-handling.html">エラーの扱い</a> ]
</strong></p>

</section>

</body>
</document>
