- PR -

Teedaでの画面遷移の仕方と値の渡し方

1
投稿者投稿内容
うちは
会議室デビュー日: 2008/05/14
投稿数: 4
投稿日時: 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 ]
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 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/14
投稿数: 4
投稿日時: 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/14
投稿数: 4
投稿日時: 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/14
投稿数: 4
投稿日時: 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 ]
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2008-05-19 12:58
>ClassNotFoundExceptionとSerializable
永続化に関係する仕様です。
というか、マニュアルに書いてあると思いますし、Sessionに保持するオブジェクトは永続化可能とするというのはServletのお約束でしょう。

>ClassからString型に変更
prerender/initialize/doXxx などのメソッドの戻り値は「void」または「String」または「Class」の何れかであれば構いません。
これもマニュアルを読めば書いてあります。

>どこみて勉強しているのか
サンプルを読むのが一番早いです。
それからチュートリアルくらいは読みましょう。

>他のサブアプリケーションにジャンプするなんてのは、、、あまりやっちゃいけないのかな
普通に行います。
まあ、当然ながら登録画面と確認画面が別のサブアプリケーションみたいな遷移はやってはならないですけど。
1

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