<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE document
	PUBLIC "-//Apache Software Foundation//DTD XDOC 1.0//EN"
	"http://maven.apache.org/dtd/xdoc_1_0.dtd">
<document>
	<properties>
		<title>Extension - 概念 - ライフサイクル</title>
	</properties>
	<body>
		<section name="ライフサイクル">
			<ul>
				<li>
					<a href="#概要">概要</a>
				</li>
				<li>
					<a href="#ライフサイクルメソッド">ライフサイクルメソッド</a>
					<ul>
						<li>
							<a href="#initializeメソッド">
								initialize()メソッド
							</a>
						</li>
						<li>
							<a href="#doメソッド">do～()メソッド</a>
						</li>
						<li>
							<a href="#prerenderメソッド">prerender()メソッド</a>
						</li>
					</ul>
				</li>
				<li>
					<a href="#リクエストパターン">リクエストパターン</a>
				</li>
				<li>
					<a href="#リクエストパターンとライフサイクルメソッド">
						リクエストパターンとライフサイクルメソッド
					</a>
					<ul>
						<li>
							<a href="#初期表示">初期表示</a>
						</li>
						<li>
							<a href="#ポストバック_自画面表示">ポストバック (自画面表示)</a>
						</li>
						<li>
							<a href="#ポストバック_リダイレクト">ポストバック (リダイレクト)</a>
						</li>
						<li>
							<a href="#リダイレクト表示">リダイレクト表示</a>
						</li>
					</ul>
				</li>
				<li>
					<a href="#画面遷移">画面遷移</a>
				</li>
				<li>
					<a href="#JSFライフサイクルとの関係">JSFライフサイクルとの関係</a>
				</li>
			</ul>
		</section>

		<section name="概要">
			<p>
				Teeda Extensionは， ブラウザからのリクエストに応じてページクラスのメソッドを呼び出します．
				このメソッドをライフサイクルメソッドと呼びます．
			</p>
			<p>ライフサイクルメソッドには次のものがあります．</p>
			<ul>
				<li>
					<code>initialize()</code>
				</li>
				<li>
					<code>do～()</code>
				</li>
				<li>
					<code>prerender()</code>
				</li>
			</ul>
		</section>

		<section name="ライフサイクルメソッド">
			<subsection name="initializeメソッド">
				<p>
					<code>initialize()</code>
					メソッドは， 画面が最初に表示されるときや， 他の画面から遷移 (REDIRECT)
					してきたときに呼び出されるメソッドです．
				</p>
				<p>
					<code>initialize()</code>
					メソッドは次の規約に従います．
				</p>
				<dl>
					<dt>可視性</dt>
					<dd>
						<code>public</code>
					</dd>
					<dt>メソッド名</dt>
					<dd>
						<code>initialize</code>
					</dd>
					<dt>引数</dt>
					<dd>なし</dd>
					<dt>戻り値型</dt>
					<dd>
						<code>Class</code>
						，
						<code>String</code>
						または
						<code>void</code>
						のいずれか
					</dd>
				</dl>
				<source><![CDATA[
public Class initialize() {
    ...
}
]]></source>
				<p>
					<code>initialize()</code>
					メソッドは，
					<a href="page.html#ポストバック">ポストバック</a>
					では呼び出されません．
				</p>
			</subsection>

			<subsection name="do～()メソッド">
				<p>
					<code>do～()</code>
					メソッドは， フォームがサブミットされた場合 (
					<a href="page.html#ポストバック">ポストバック</a>
					) に呼び出されるメソッドです．
				</p>
				<p>
					<code>do～()</code>
					メソッドは次の規約に従います．
				</p>
				<dl>
					<dt>可視性</dt>
					<dd>
						<code>public</code>
					</dd>
					<dt>メソッド名</dt>
					<dd>
						<code>do</code>
						で始まる
					</dd>
					<dt>引数</dt>
					<dd>なし</dd>
					<dt>戻り値型</dt>
					<dd>
						<code>Class</code>
						，
						<code>String</code>
						または
						<code>void</code>
						のいずれか
					</dd>
				</dl>
				<source><![CDATA[
public Class doUpdate() {
    ...
}
]]></source>
				<p>
					<code>do～()</code>
					メソッドは， サブミットボタンに対応付けられ， 対応するボタンが押された場合のみ呼び出されます (
					<a href="">詳細</a>
					)．
				</p>
				<source><![CDATA[
<input type="submit" id="doUpdate" value="更新" />
]]></source>
				<p>
					<code>do～()</code>
					メソッドは， ポストバックでない場合や， バリデーションでエラーがあった場合は呼び出されません．
				</p>
			</subsection>

			<subsection name="prerender()メソッド">
				<p>
					<code>prerender()</code>
					メソッドは， 画面が描画される直前に呼び出されるメソッドです．
				</p>
				<p>
					<code>prerender()</code>
					メソッドは次の規約に従います．
				</p>
				<dl>
					<dt>可視性</dt>
					<dd>
						<code>public</code>
					</dd>
					<dt>メソッド名</dt>
					<dd>
						<code>prerender</code>
					</dd>
					<dt>引数</dt>
					<dd>なし</dd>
					<dt>戻り値型</dt>
					<dd>
						<code>Class</code>
						，
						<code>String</code>
						または
						<code>void</code>
						のいずれか
					</dd>
				</dl>
				<source><![CDATA[
public Class prerender() {
    ...
}
]]></source>
				<p>
					<code>prerender()</code>
					メソッドは， 画面遷移 (リダイレクト) する場合は呼び出されません．
				</p>
			</subsection>
		</section>

		<section name="リクエストパターン">
			<p>
				Teeda Extensionでは， ブラウザから受け取ったリクエストの基本的な処理パターンが4つあります．
			</p>
			<img src="../../images/extension/concept/lifecycle1.png"
				width="616" height="637" alt="リクエストパターン" />
			<dl>
				<dt>初期表示</dt>
				<dd>ブックマークやリンクがクリックされたことによるリクエストです．</dd>
				<dt>ポストバック (自画面表示)</dt>
				<dd>
					表示している画面のフォームがサブミットされたことによるリクエストです．
					画面遷移せずに同じ画面を表示します．
				</dd>
				<dt>ポストバック (リダイレクト)</dt>
				<dd>
					表示している画面のフォームがサブミットされたことによるリクエストです．
					do～()メソッドの戻り値で指定された画面に遷移 (リダイレクト) します．
				</dd>
				<dt>リダイレクト表示</dt>
				<dd>リダイレクトによるリクエストです．</dd>
			</dl>
		</section>

		<section name="リクエストパターンとライフサイクルメソッド">
			<p>
				<a href="#リクエストパターン">リクエストパターン</a>
				ごとに， どのライフサイクルメソッドが呼び出されるかを説明します．
			</p>

			<subsection name="初期表示">
				<p>
					初期表示では，
					<code>initialize()</code>
					および
					<code>prerender()</code>
					メソッドが呼び出されます．
				</p>
				<img src="../../images/extension/concept/lifecycle2.png"
					width="466" height="278" alt="初期表示" />
			</subsection>

			<subsection name="ポストバック (自画面表示)">
				<p>
					ポストバック (自画面表示) では，
					<code>do～()</code>
					メソッドおよび
					<code>prerender()</code>
					メソッドが呼び出されます．
				</p>
				<img src="../../images/extension/concept/lifecycle3.png"
					width="466" height="259" alt="ポストバック (自画面表示)" />
				<p>
					バリデーションでエラーがあった場合は
					<code>prerender()</code>
					メソッドだけが呼び出されます．
				</p>
			</subsection>

			<subsection name="ポストバック (リダイレクト)">
				<p>
					ポストバック (リダイレクト) では，
					<code>do～()</code>
					メソッドのみが呼び出されます．
					<code>do～()</code>
					メソッドの戻り値で指定された画面へリダイレクトします．
				</p>
				<img src="../../images/extension/concept/lifecycle4.png"
					width="466" height="231" alt="ポストバック (リダイレクト)" />
				<p>
					バリデーションでエラーがあった場合は
					<a href="#ポストバック_自画面表示">ポストバック(自画面表示)</a>
					になります．
				</p>
			</subsection>

			<subsection name="リダイレクト表示">
				<p>
					リダイレクト表示では，
					<code>initialize()</code>
					および
					<code>prerender()</code>
					メソッドが呼び出されます．
				</p>
				<img src="../../images/extension/concept/lifecycle5.png"
					width="466" height="259" alt="リダイレクト表示" />
			</subsection>
		</section>

		<section name="画面遷移">
			<p>
				ライフサイクルメソッドは，戻り値型を
				<code>Class</code>
				または
				<code>String</code>
				型にすることができます (間違いにくさやリファクタリングのしやすさから
				<code>Class</code>
				型を推奨します)．
			</p>
			<source><![CDATA[
public class FooPage {
    ...
    public Class doSubmit() {
        ...
        return NextPage.class;
    }
}
]]></source>
			<p>
				次画面のページクラスまたはそのコンポーネント名を戻り値とすることで， その画面に遷移 (リダイレクト) します．
			</p>
			<p>
				戻り値が
				<code>null</code>
				だと画面遷移 (リダイレクト) しないで直接自画面を表示します．
			</p>
			<p>
				戻り値をそのページクラス自身 (またはそのコンポーネント名) にすると，
				リダイレクトして同じページを表示します． この場合は遷移先が現在の画面と同じというだけで，
				画面遷移として扱われます．
			</p>
			<source><![CDATA[
public class FooPage {
    ...
    public Class doSubmit() {
        ...
        return FooPage.class;
    }
}
]]></source>
			<p>
				画面遷移 (リダイレクト) しない場合は戻り値の型を
				<code>void</code>
				にすることもできます．
			</p>
			<source><![CDATA[
public class FooPage {
    ...
    public void initialize() {
        ...
    }
}
]]></source>
		</section>

		<section name="JSFライフサイクルとの関係">
			<p>
				JSFのライフサイクルと，
				ページクラスのライフサイクルメソッドおよびsetter/getterメソッド呼び出しの関係は，
				以下のようになります．
			</p>
			<img src="../../images/extension/concept/lifecycle6.png"
				width="609" height="530" alt="JSFライフサイクルとの関係" />
		</section>
	</body>
</document>
