Hatena::ブログ(Diary)

おおたに6号機blog このページをアンテナに追加 RSSフィード

2008-02-18(月)

[]Teedaチュートリアル4-2 19:15 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>&nbsp;+&nbsp;</span></td></tr>
	<tr><td><span id="arg2" /></td></tr>
	<tr><td><span>&nbsp;=&nbsp;</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メソッドの

戻り値によって、Teedaが適切に判断してくれます。

戻り値は下記の型を取ることが出来ます。

説明
Class指定したPageクラスに紐付くhtmlに遷移する
StringJSFのナビゲーション(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の基本は全く変わりません。

Teedaに処理してほしいタグidを採番するだけです。

<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クラスの特定メソッドの呼び出しは発生しないことです(ライフサイクルメソッドは別)。

例えばaタグの場合は、href属性をみて遷移先を決めます。

では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の画面遷移の方法を学びました。

せとあずさせとあずさ 2008/02/18 18:40 参照元を文末に書かれてますが、携帯で見たときに引用文と本文の区別が全くつかないので他の方の日記のように引用のブロックごとに参照元をのせるようにしてくださいませんでしょうか。よろしくお願いしますm(_ _)m

shot6shot6 2008/02/18 19:16 りょうかいでーす

shot6shot6 2008/02/18 19:20 やめてみました。

せとあずさせとあずさ 2008/02/21 17:12 ありがとうございます。

JackyJacky 2008/07/09 15:10 谢 谢 !

papi2papi2 2008/09/17 09:11 <a id=”jumpAddResult” href=”addResult.html?fixed_arg1=123&fixed_arg2=223”>計算結果画面へ遷移する</a>
なぜにfixed_arg1=123&fixed_arg2=223 ??
この場合はarg1=123&arg2=223なのでは?

shot6shot6 2008/09/17 09:52 おっと。ありがとうございます。修正してみました。

papi2papi2 2008/09/18 11:45 ???
http://teeda.seasar.org/ja/extension/reverse/link.html
のリンクの解説をみるとfixed_はTeedaExtensionが解釈してfixed_をとっぱらい固定指定した値をセットするはず。
そして、これがない場合は動的に値をセットしてくれるという仕様のはず。
が、こちらで実際やってみるとfixed_がとりはらわれることはないし、fixed_を指定しない場合はそのままの値がセットされる。
謎だ。

shot6shot6 2008/09/18 11:56 Teedaが解釈するリンクでは、fixed_は取り外されます。
Teedaが扱うリンクとはgoではじまるやつなので、それ以外ではダメですね。

papi2papi2 2008/09/18 12:47 >Teedaに処理してほしいタグにidを採番するだけです。
><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の値がセットされるのを確認しました。

tom^2tom^2 2009/01/23 11:07 "arg1=123&arg2=223" のアンパサンドの箇所ですが
teedaCustomize.dicon に
<component class="org.seasar.teeda.extension.html.impl.TeedaXMLReaderFactory$STRICT"/>
の指定があると "arg1=123&arg2=223" としないと SAXParseException になりました。 DEFAULT の場合は & でいけました。

あと go メソッドだと引数が arg1=&arg2= のように中身無しに書き換えられてしまいました。

トラックバック - http://d.hatena.ne.jp/shot6/20080218/1203329702