- PR -

Teedaでの値の引渡しについて

投稿者投稿内容
machan1
会議室デビュー日: 2008/05/18
投稿数: 11
投稿日時: 2008-05-18 16:58
入力画面で値を入力した後に、
確認ボタンを押し、確認画面に値を引渡した後、
確認画面の完了ボタンを押した場合、
次に表示するはずの完了画面が表示されず、
確認画面が再表示されてしまいます。


【理想の画面フロー】
入力画面→確認画面→完了画面

【現在の画面の動き】
入力画面→確認画面→確認画面


動きをみると、どうも確認画面の
doアクションが呼べてないように思います。


この現象がどうしても解決できません。


適当なサンプルですいませんが、
各画面のHTMLとPageクラスを乗せます。

【入力画面サンプルHTML 一部抜粋】
<form id="form">
<table>
<tr>
<td><label id="userNameLabel"/></td>
<td><input type="text" id="userName"/></td>
</tr>
<tr>
<td><label id="passwordLabel"/></td>
<td><input type="password" id="password"/></td>
</tr>
</table>
<input type="button" id="doLogin" value="login" />
</form>

【入力画面サンプルPageクラス 一部抜粋】
public Class doLogin() {
return LoginConfirmPage.class;
}

【確認画面サンプルHTML 一部抜粋】
<form id="formConfirm">
<table>
<tr>
<td><label id="userNameLabel"/></td>
<td><input type="text" id="userName"/></td>
</tr>
<tr>
<td><label id="passwordLabel"/></td>
<td><input type="password" id="password"/></td>
</tr>
</table>
<input type="button" id="doLoginFinish" value="login" />
</form>


【確認画面サンプルPageクラス 一部抜粋】
public Class doLoginFinish() {
return LoginFinish.class;
}

【完了画面サンプルHTML 一部抜粋】
<body>
<span id="allMessages"/>
完了!!
</body>


【完了画面サンプルPageクラス 一部抜粋】
アクションクラスなし


以上、どなたかご教授願います。


[ メッセージ編集済み 編集者: 未記入 編集日時 2008-05-18 16:59 ]

[ メッセージ編集済み 編集者: 未記入 編集日時 2008-05-18 17:02 ]

[ メッセージ編集済み 編集者: machan1 編集日時 2008-05-18 17:11 ]
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2008-05-18 17:52
一部抜粋では絶対に原因は解りません。

このパターンで考えられるのは・・・
1.Convertor/Validatorで引っかかっている
Pageクラスで親クラスを定義していて、そちらでConvertor/Validatorを定義している
確認画面から完了画面に遷移する場合に引っかかっているがエラーメッセージがでないので嵌る
対処)まずは<span id="allMessages"></span>を埋めておこう

2.formがネストしている
formタグが正しく記述されていないと、正しくsubmitできない
対処) bodyタグの直後にformタグを記述し、それがネストしていないようにする

あと、確認画面のhidden項目が不足しているというのが一番多いパターンです。
これも1で引っかかるはずです。
こちらは暗黙的なConvertorでエラーを起こしている場合もあります。
machan1
会議室デビュー日: 2008/05/18
投稿数: 11
投稿日時: 2008-05-18 18:12


サンプル的に作成したコードですので、
表示される画面はおかしいですが、
求めている画面遷移ができるかどうかのテストの
ために作りました。

いかに、ソース内の全てを記述します。
誤っている箇所をご指摘いただけないでしょうか?


【入力画面サンプルHTML login.html】
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Login</title>
<style>
.onTeedaError {
background-color: #FFCCCC;
}
</style>
</head>
<body>
<span id="allMessages"/>
<form id="form">
<table>
<tr>
<td><label id="userNameLabel"/></td>
<td><input type="text" id="userName"/></td>
</tr>
<tr>
<td><label id="passwordLabel"/></td>
<td><input type="password" id="password"/></td>
</tr>
</table>
<input type="button" id="doLogin" value="login" />
</form>
</body>
</html>


【入力画面サンプルPageクラス LoginPage.java】
package test.web.login;

import org.seasar.teeda.extension.annotation.validator.Required;

public class LoginPage {

@Required
private String userName;
@Required
private String password;

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public Class doLogin() {
return LoginConfirmPage.class;
}

public Class initialize() {
return null;
}

public Class prerender() {
return null;
}

}


【確認画面HTML loginConfirm.html】
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Login</title>
<style>
.onTeedaError {
background-color: #FFCCCC;
}
</style>
</head>
<body>

確認画面

<span id="allMessages"/>
<form id="formConfirm">

<table>
<tr>
<td><label id="userNameLabel"/></td>
<td><input type="text" id="userName"/></td>
</tr>
<tr>
<td><label id="passwordLabel"/></td>
<td><input type="password" id="password"/></td>
</tr>
</table>
<input type="button" id="doLoginFinish" value="login" />

</form>
</body>
</html>


【確認画面サンプルPageクラス】
package test.web.login;

public class LoginConfirmPage {

private String userName;
private String password;

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public Class doLoginFinish() {
return LoginFinishPage.class;
}

public Class initialize() {
return null;
}

public Class prerender() {
return null;
}

}


【完了画面サンプルHTML loginFinish.html】
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Login</title>
<style>
.onTeedaError {
background-color: #FFCCCC;
}
</style>
</head>
<body>
<span id="allMessages"/>
ログイン完了!!
</body>
</html>



【完了画面サンプルPageクラス】
package test.web.login;

public class LoginFinishPage {

public Class initialize() {
return null;
}

public Class prerender() {
return null;
}

}

osho
会議室デビュー日: 2008/05/18
投稿数: 2
投稿日時: 2008-05-18 18:38
単純だけど
<input type="button" id="doLogin" value="login" />

<input type="submit" id="doLogin" value="login" />
にしないとsbumitされないからアクション呼ばれないんじゃないですか?

machan1
会議室デビュー日: 2008/05/18
投稿数: 11
投稿日時: 2008-05-18 18:42
ご回答ありがとうございます。

残念ながら、typeを
buttonからsubmitに変更しましたが、
同じ現象が出てしまいます。
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2008-05-18 21:10
login.html 等はview/login/ に全て置かれていますか?
doLoginFinishをクリックした時、再描画になってしまうならばprerenderが呼ばれるはずです。
そこでBreakPointを張って、userName等に値が入っているか確認されましたか?

あと、Confirm画面のレンダリングされたHTMLソースを貼り付けてください。
元のHTMLが意図した形に変換されているかを調べるのがコツです。
#FireFox+FireBugsが便利

>oshoさん
Teedaではtype="button"が正解です。
レンダリングの時に、doXxxなIDが振られている場合は、submitへ変換されます。
osho
会議室デビュー日: 2008/05/18
投稿数: 2
投稿日時: 2008-05-18 21:40
あと、ぱっと見で気になったのは
<form id="formConfirm">
これですかね。
前にteeda使った時に form のidはFormで終わらないとinput系の動きがおかしくなる
ことがあった気がします。
試しに id="confirmForm"等にしてやられてみてはどうですか?
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2008-05-18 21:52
あー確かに。
基本的にformは <form id="form" > とか<form id="inputForm" > みたいにidを固定にしたほうが良いと思います。

スキルアップ/キャリアアップ(JOB@IT)