- - PR -
Teedaでの画面遷移の仕方と値の渡し方
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-05-14 12:27
Teedaでいろいろと勉強中で、ようやく基本の部分が理解できつつあるので
調子に乗ってたら、画面遷移のやり方がうまくいかず悩んでます。というか 正確にはこれでいいのか迷ってます。ご享受ください。 今やっているのは、aaa.html から bbb.html に遷移させようとおもっている のですが、<a id="goBbb"/>などと記述できのは、二つのページがともに同じ サブアプリケーションのみの場合ということがわかりました。 実は aaa/aaa.html から bbb/bbb.html に遷移させるようなケースを 作りたいと考えてまして、その際aaa.htmlのボタンを <input type="button" id="doLoginCheck"/> のようにし、LoginCheck() メソッドに public Class doLoginCheck() throws IOException { loginUser = new LoginUserDto(); (← すいません、ここは適当にしてます) if (loginUser != null) { try { response.sendRedirect("/myProj/view/bbb/bbb.html"); facesContext.responseComplete(); } catch (IOException e) { e.printStackTrace(); } } else throw new AppFacesException("errors.invalid.login"); return null; } ネットで調べ、なんだかんだで記述したらうまくいくのですが、この記述は はたして正しいのか、こんなことをしなくても別のサブアプリケーションに 遷移する方法があるのではないか、がんばってる最中です。 でもくじけそうだったので、やむなく質問しました。 そもそも画面遷移だけなら、すでにうまくいったのでめでたしめでたしなのですが、 お気づきかもしれませんが、ログインした情報をDTOに格納し、他のページなどで そのデータを利用したいのです。 セッションを利用するために、Dtoクラスの前に @Component(instance = InstanceType.SESSION) public class LoginUserDto { ・・・ とするだけで、自動的にセッションスコープになると書いてたような記述を みかけたので、おおっ!やっぱりサクサク〜 っておもってたら、 bbb.html の ページクラスで、 public class bbbPage { public String userName; public LoginUserDto loginUser; public boolean isLogin() { if (loginUser != null) { userName = loginUser.memberName; return true; } else return false; } } のような書き方しても、loginUserはNullのままで、やっぱりか〜と 行き詰ってます。 駄文で申し訳ありません。どなたかアドバイスお願いします。 [ メッセージ編集済み 編集者: ゆうきん 編集日時 2008-05-14 12:28 ] |
|
投稿日時: 2008-05-15 11:43
1.ページ遷移に関して
goで別のサブアプリケーションに遷移するには、 /view/aaa/index.html の場合、goAaa_index でOK doで処理後に遷移するならば、 return "/view/aaa/index.html"; または return aaa.IndexPage.class; ついでに書けば提示したソースは正常系と異常系の記述が一般的に逆なので読みにくいですよ。 2.セッションスコープのDto 基本的にS2で管理されているコンポーネントを使う場合はDIします。 @Binding public LoginUserDto loginUser; で実現できるかと。 S2で管理されているコンポーネント以外から使う場合はSessionから取得するか、S2Containorから取得すると良いと思います。 |
|
投稿日時: 2008-05-15 12:15
回答ありがとうございます!
ただ、サブアプリケーションの遷移なのですが、どうもうまくいきませんでしたT_T じつはサブアプリケーションの名前が/view/Aaa/Index.html のように一文字目が大文字になっているんです。 というより正確には、DatabaseViewビューを使って、 接続先のDBに存在するテーブルを元に、右クリックしてDoltengを使って自動生成 してもらったものがすべて一文字目大文字だったんです。 なので、一応別プロジェクトを用意して検証してみたのですが、それでもうまく いきませんでした。ソースをみたのですが、hrefの属性値が””(空文字列)で 生成されてる模様です。 あと、@Bindingの件ですが、おおっ!とおもい、さっそく試してみたのですが、 こちらもやはり期待どおりの動きをしてくれませんでした、 ちゃんとプロパティの前に@Bingingあのテーションを記述したはずなのですが、 デバッグ実行してみても、loginUserはNullのままでした。 ちなみにまだ勉強不足なのかもしれないのですが、多くのSeasar使いの方たちを含め 何をもとに習得されたのでしょうか?ルールみたいなものなども、一通り目を 通したつもりなのですが、サブアプリケーションの表現を 「"go" + <サブアプリケーション名> + "_" + <HTMLファイル名>」 などの表現やreturnの指示表現は見たことがありませんでしたもので。。。 できる限り自分でももがいてみたい気持ちはあるのですが、どうやら勉強の仕方が まずいみたいで、悩んでいます。 質問と関係なくてすいませんでした。もうちょっと頑張ってみます。 |
|
投稿日時: 2008-05-16 23:45
@Binding
の件ですが、うまくいきました。 原因は、 public LoginUserDto loginUserDto; を気分で public LoginUserDto loginUser; にしていたせいでした。どうやらフィールド名(プロパティ名か) を型と同じにしなければいけないルールがあったことに気づきました。 わたなべさま、ご迷惑掛けてすいませんでした。 (みてるかどうかわかりませんが、、、) ただ、、、一回目の画面遷移ではうまくloginUserDtoプロパティにバインド されたのですが、更新ボタンを押したり、再度aaa/Index.htmlから実行すると なぜだかClassNotFoundExceptionが発生し、にっちもさっちも行かない状態に なりました。セッションに対して根本的に認識が間違っているのでしょうか? それとも@Componentに対する認識が間違ってるのでしょうか?ますます @Component(instance=InstanceType.SESSION) の意味がわからなくなってきました。 あと、ページ遷移に関して goで別のサブアプリケーションに遷移する件は >/view/aaa/index.html の場合、goAaa_index でOK とあったのですが、やはりだめでした。 >doで処理後に遷移するならば、 >reurn "/view/aaa/index.html"; >または >return aaa.IndexPage.class; もどちらともやはりだめでしたT_T aaa.IndexPage.class の aaaの部分が赤の波線が出て、コンパイルすら通りません でした。気持ち的にはこのように記述したかったのですが、だめだたので もうひとつの方法をためしたら、今度は public Class doLoginCheck() の戻り値と型が違うと怒られたので、String型にし、さらにうまくいかなかったので あ〜だこ〜だとして結局 return "../aaa/Index"; でうまくいきました。なんかすっきりしませんが、なんだかうまくいきました。 スクリプト言語でアプリケーション開発している心境ですT_T return "../aaa/Index.html"; とすると、なにやら勝手にDoltengさんが拡張子も付けてくれる仕様らしく このようになりました。 セッション管理も満足にできないので、やはりStrutsでの開発に戻そうかと なやんでます。たださくさく感と短納期開発が手に入ると意気込んでいただけに ちょっと迷ってます。とりあえずもうちょっとがんばって勉強してみます。 では現状報告まで。 [ メッセージ編集済み 編集者: うちは 編集日時 2008-05-16 23:51 ] |
|
投稿日時: 2008-05-19 11:51
なんか自分のブログみたいになっているような気がしますが、これで
だれかのお役にたてれば?と思い、一応また現状報告します。 >なぜだかClassNotFoundExceptionが発生し、にっちもさっちも行かない状態に >なりました。セッションに対して根本的に認識が間違っているのでしょうか? ClassNotFoundExceptionの件ですが、DtoクラスをSerializableを実装したら でなくなりました。ネットでSmartデプロイを変更すればいいとか書いてあったのですが env.txtの書き方もよくわからなかったので、とりあえず永続化しちゃえと思い 書いてみたらうまくいきました!! 下にサンプルコードを載せておきます。 @Component(instance = InstanceType.SESSION) public class LoginUserDto implements Serializable { public String userName; public String password; } あとは、サブアプリケーション外に画面遷移する方法だけです。 >reurn "/view/aaa/index.html"; >または >return aaa.IndexPage.class; 上のやり方は、メソッドの戻り値をClassからString型に変更しなければいけない ですし、そもそも拡張子がいらないし、、、 あと下のほうの aaa.IndexPage.class の方法も、型が解決できません エラーが発生し、Eclipseさんがコンパイルを通してくれないですし。 基本的には、ユースケースひとつに対してサブアプリケーションはひとつで完結 するように開発するのはイメージできるのですが、レイアウトを使用して トップページのメニューからリンクやボタンを押したら他のサブアプリケーションに ジャンプするなんてのは、、、あまりやっちゃいけないのかな、、、みんな どうしているのか知りたいT_T あとどこみて勉強しているのか、、、最近きづいたのですが、公式のサイトのある ページを見るために、他のブログなどに貼られているリンクからじゃないと たどりつかないというレアなサイトがあることにきづきました。。。そんなはずは ないのだろうけど、どこみても公式サイトないからではいけそうにありません。 ネットで調べる力がない人はとことん損するな〜と思わされました。 [ メッセージ編集済み 編集者: うちは 編集日時 2008-05-19 11:53 ] |
|
投稿日時: 2008-05-19 12:58
>ClassNotFoundExceptionとSerializable
永続化に関係する仕様です。 というか、マニュアルに書いてあると思いますし、Sessionに保持するオブジェクトは永続化可能とするというのはServletのお約束でしょう。 >ClassからString型に変更 prerender/initialize/doXxx などのメソッドの戻り値は「void」または「String」または「Class」の何れかであれば構いません。 これもマニュアルを読めば書いてあります。 >どこみて勉強しているのか サンプルを読むのが一番早いです。 それからチュートリアルくらいは読みましょう。 >他のサブアプリケーションにジャンプするなんてのは、、、あまりやっちゃいけないのかな 普通に行います。 まあ、当然ながら登録画面と確認画面が別のサブアプリケーションみたいな遷移はやってはならないですけど。 |
1