2008-02-18(月)
■[Teeda]Teedaチュートリアル4-2

このチュートリアル4-2では画面遷移の仕方について学びます。
4-1での作成したhtmlとPageとして、addInput.html/AddInputPage.javaがあります。
これらは入力画面とそのPageなので次に出力画面・そのPageクラスを作成します。
addResult.htmlは下記のようになります。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <form id="Form"> <table> <tr><td><span id="arg1" /></td></tr> <tr><td><span> + </span></td></tr> <tr><td><span id="arg2" /></td></tr> <tr><td><span> = </span></td></tr> <tr><td><span id="result" /></td></tr> </table> </form> </body></html>
それにAddResultPage.javaは下記のようになります。
package examples.teeda.web.add;
public class AddResultPage {
public String arg1;
public String arg2;
public String result;
public Class initialize() {
return null;
}
public Class prerender() {
return null;
}
}
これで足し算画面の入力・出力ともに作成できました。
(入力値検証(Validation)などは後で説明するのでこのチャプターでは省略します)
では次のステップとしてaddInput.htmlからaddResult.htmlへ遷移させてみます。
ボタンによる画面遷移は4-1で作成したdoメソッドの中で行います。具体的にはdoメソッドの
戻り値は下記の型を取ることが出来ます。
| 型 | 説明 |
|---|---|
| Class型 | 指定したPageクラスに紐付くhtmlに遷移する |
| String型 | JSFのナビゲーション(outcome)を指定する |
| Void型 | 遷移せずに同一画面に戻る |
TeedaではClass型で戻り値を返すことを推奨しています。
ではAddInputPageに計算ロジックと共に埋めてみます。
AddResultPageと対応関係にあるaddResult.htmlに遷移したいので、
AddResultPage.classと記述します。下記のようになります。
package examples.teeda.web.add;
public class AddInputPage {
public Integer arg1;
public Integer arg2;
public Integer result;
public Class doCalculate() {
return AddResultPage.class;
}
public Class initialize() {
return null;
}
public Class prerender() {
return null;
}
}
実際の計算ロジックはAddResultPageに埋め込みます。
initialize()というメソッド内に書いていますが、初期化のためのメソッドくらいに
今は覚えておいて頂いてかまいません。後ほどライフサイクルメソッドのところで詳細に説明します。
package examples.teeda.web.add;
public class AddResultPage {
public Integer arg1;
public Integer arg2;
public Integer result;
public Class initialize() {
result = new Integer(arg1.intValue() + arg2.intValue());
return null;
}
public Class prerender() {
return null;
}
}
これで最も基本的な画面遷移の機能は抑えました。
ではもう少し詳細について抑えていきましょう。
既に説明した画面遷移の基本パターンは、submitボタンの場合でした。
ではaタグでの遷移の場合はどうなるのでしょうか?
aタグでは下記のような形式で書きます。繰り返しになりますが、Teedaの基本は全く変わりません。
<a id="goAddResult" href="addResult.html?arg1=123&arg2=223">計算結果画面へ遷移する</a>
idの部分に注目してみてみてください。goXxxという形式になっているのがわかると思います。
そうdoと同じようにgoという遷移のやり方です(以下goメソッドと呼びます)。
goメソッドは、リンクのようなPageクラスのメソッド呼び出しを行わないで遷移を行う場合に使います。
aタグで説明しましたが、もちろんボタンでも使うことが出来ます。
これと同じようにjumpメソッドというのもあります。下記のように書きます。
<a id="jumpAddResult" href="addResult.html?arg1=123&arg2=223">計算結果画面へ遷移する</a>
go/jumpの共通点はPageクラスの特定メソッドの呼び出しは発生しないことです(ライフサイクルメソッドは別)。
ではgoメソッドとjumpメソッドの違う部分は何でしょうか?
それはgoメソッドは後述する入力値検証が発生するのに大して、jumpメソッドは入力値検証をしません。
これが違いになります。goメソッドを使う場合は入力値をきちんと検証して次の画面に遷移する場合に使い、
jumpメソッドは入力値の検証など必要なくただ単純に遷移する場合に使います。
では改めてdo/go/jumpメソッドをまとめてみます。
| Teeda遷移メソッド名 | 入力値検証 | Pageクラスのメソッド呼び出し | 仕様用途 |
|---|---|---|---|
| do | する | 呼び出す | 入力値のPOSTなどサーバ側の状態を変える場合 |
| go | する | 呼び出さない | サーバ側の状態は変えずに次の画面へ値を渡したい場合 |
| jump | しない | 呼び出さない | サーバ側の状態は変えず、かつ戻るボタンのような単純遷移の場合 |
・ここまでのまとめ
・Teedaの画面遷移としてはdo/go/jumpメソッドがある
・doメソッドはPageクラスの特定のメソッドを呼び出し、戻す型によって違いがある
・go/jumpメソッドは、リンクなどサーバ側の状態を変えずに遷移させる場合に主に使用する。
・goとjumpメソッドの違いは、goメソッドは入力値検証が入り、jumpメソッドは入力値検証がない
4-2では、Teedaの画面遷移の方法を学びました。
- 17 http://reader.livedoor.com/reader/
- 10 http://d.hatena.ne.jp/gothedistance/20080218/1203272531
- 10 http://d.hatena.ne.jp/masataka_k/
- 10 http://d.hatena.ne.jp/yone098/20080216/1203171130
- 8 http://www.google.co.jp/reader/view/
- 8 http://www.google.com/reader/view/
- 7 http://d.hatena.ne.jp/keyword/BlazeDS
- 7 http://d.hatena.ne.jp/yone098/
- 6 http://a.hatena.ne.jp/s2committer/?gid=297329
- 6 http://d.hatena.ne.jp/kuwalab/

なぜにfixed_arg1=123&fixed_arg2=223 ??
この場合はarg1=123&arg2=223なのでは?
http://teeda.seasar.org/ja/extension/reverse/link.html
のリンクの解説をみるとfixed_はTeedaExtensionが解釈してfixed_をとっぱらい固定指定した値をセットするはず。
そして、これがない場合は動的に値をセットしてくれるという仕様のはず。
が、こちらで実際やってみるとfixed_がとりはらわれることはないし、fixed_を指定しない場合はそのままの値がセットされる。
謎だ。
Teedaが扱うリンクとはgoではじまるやつなので、それ以外ではダメですね。
><a id=”goAddResult” href=”addResult.html?arg1=123&arg2=223”>計算結果画面へ遷移する</a>
とあり、リンクの説明でもgoXXXXをだだセットするだけというから、add.htmlだけ変更してエラーがでておかしいおかしいとおもっていたが、これはaddResultのgoAddResultを呼び出しているわけですよね。
だからaddResult.javaにgoAddResultクラスを追加することで解決しました。
そしてこの場合はテキストボックスに値を入れてもarg1,arg2は空のまま遷移します。
だからadd.htmlに
<input type=”submit” value=”submit” />
を追加し、テキストボックスに値を入れた後submitボタンを押してリンクで遷移させるとarg1,arg2の値がセットされるのを確認しました。
teedaCustomize.dicon に
<component class="org.seasar.teeda.extension.html.impl.TeedaXMLReaderFactory$STRICT"/>
の指定があると "arg1=123&arg2=223" としないと SAXParseException になりました。 DEFAULT の場合は & でいけました。
あと go メソッドだと引数が arg1=&arg2= のように中身無しに書き換えられてしまいました。