[Wicket-ja-user 649] Re: ページのバージョン管理について

Back to archive index

Tsutomu Yano t_yano****@me*****
2012年 3月 18日 (日) 22:42:56 JST


矢野です。

あ、そうか。submitだとページ状態が変わるから、ページバージョンが一つあがるのか、考えてみれば。藤原さんの実際のコードでは、たぶん、onClick()ではなく、onSubmit() ですよね?


試してませんが、論理的には次の手法でうまくいくんじゃないかと思ってるのですがどうでしょうか。

1. ページのonInitliazed()で、インスタンス生成時のpageIdを取得して、フィールドに保存しておく

private int savedPageId;

public void onInitialized() {
    super.onInitialized();
    this.savedPageId = getPageId();
}

2. 前のメールと同じ方法を使うが、ページID取得時には、getPageId()ではなくて、フィールドに保存したsavedPageIdを使う。


お試しください。

---------------------------------------------------
矢野 勉(やの つとむ)
電子メール: t_yano****@me*****
---------------------------------------------------

On 2012/03/18, at 21:39, 藤原高明 wrote:

> 藤原です。
> 
> いろいろとアドバイスいただき、ありがとうございました。
> 矢野さんに教えていただいたロジックを参考に処理を実装してみたのですが、
> getPageId()で取得されてくる数値がURLに表示されているページ番号にプラス1された値になってしまいます。
> 
> public void onClick() {
>    //1.クリック時の処理
>    //2. setResponsePage() 
>    //今のページをexpire登録する
>    ((MySession)Session.get()).recordExpiredPage(getPageId());
> } 
> 
> 
> 用意したボタンは
> <form>
>  <input type="submit" wixket:id="xxx" />
> </form>
> 
> のように作っています。
> onClick 時の処理もDBへの登録処理だけなので、
> ページIDが勝手にインクリメントされてしまう原因がわかりません。
> 
> 
> 
> 2012年3月16日0:17 Tsutomu Yano <t_yano****@me*****>:
> 結局、サンプルを作る時間がないので、実現できているロジックを簡単に説明したいと思います。
> 
> 1. 自前のSessionサブクラスに、expireしたページのIDを記録するSetを用意します。
> 
> Sessionのフィールドに、private Set<Integer> expiredSet = new HashSet<Integer>(); します。
> 
> 2. 自前のsessionサブクラスに、expireしたページを記録するメソッドと、ページがexpireしてるかどうか確認するメソッドを追加します。
> 
> public void recordExpiredPage(int pageId) {
>    expiredSet.add(pageId);
> }
> 
> public void isPageExpired(int pageId) {
>    return expiredSet.contains(pageId);
> }
> 
> 3. バックボタンで戻った時にはexpireしていて欲しいページに、二つの処理を組み込みます。
> 
> 3.1 次のページに行くボタンで、2で作ったメソッドを使って、自分のページをexpire登録します。
> 
> public void onClick() {
>    //まずクリック時処理をする
>    //setResponsePage()する
>    //抜ける前に、今のページをexpire登録する
>    ((MySession)Session.get()).recordExpiredPage(MyPage.this.getPageId());
> }
> 
> 
> 3.2 3.1と同じページクラスで、onConfigure()をオーバーライドして、自分がexpire登録されていたら、PageExpiredExceptionをスローします
> 
> public void onConfigure() {
>    super.onConfigure();
>    if(((MySession)Session.get()).isPageExpired(getPageId())) {
>        throw new PageExpiredException("message");
>    }
> }
> 
> 上記のようにすると、ボタンを押して遷移が決まった段階でそのページがexpire登録され、バックボタンで戻ってきても、onConfigureでPageExpiredExceptionがスローされるようになります。
> 
> 
> 比較的簡単に実装できます。どうでしょうか。
> 
> ---------------------------------------------------
> 矢野 勉(やの つとむ)
> 電子メール: t_yano****@me*****
> ---------------------------------------------------
> 
> On 2012/03/14, at 23:10, 藤原高明 wrote:
> 
> > 世古さん
> >
> > お疲れ様です。藤原です。
> >
> > 私もいろいろ調べてみたのですが、
> > Wicketはページの履歴をセッション上または物理ディスク上に保管しているようですね。(間違っていたらごめんなさい)
> >
> > 単純にページを遷移していくだけなら良いのですが、
> > 更新系のページの場合には履歴の情報をそのまま表示されると困ってしまう場合が多いかと思います。
> > 皆さんはどうやって対応しているのでしょう?
> >
> >
> > 2012年3月14日21:51 Masaya seko <masay****@nifty*****>:
> > 藤原さん
> >
> > お疲れ様です。世古です。
> > 私もあまり分かってないのですが、Wicket1.5の利用者は少なそうですので、私が知っ
> > ている範囲のことをお伝えします。
> >
> >
> > >最新の情報とブラウザの「戻る」を使用して表示される情報に齟齬が生じてしまいま
> > す。
> > これの対策は謎に満ちあふれています。
> > と言いますのも、私が実験した限りでは、Wicketで作成したサイトの場合、経験上、Ch
> > rome/Safari/Firefoxはブラウザの「戻る」を押したときに、ほぼサーバに接続してく
> > れないのです。
> > すなわち、ローカルに存在するキャッシュを優先的に使用します。
> > IEの場合は、サーバに接続したりしなかったりします(条件はよく分かっていません)。
> >
> > 原因が分かっていないので、「経験上」としか申し上げることができないのですが。
> > もっともWicketは関係無く、別の要因の可能性もありえますので、藤原さんの環境では
> > 問題ないかもしれません。
> > しかし、戻るボタンを押した際に、ブラウザがサーバに問い合わせに来ているかは、確
> > 認された方が良いかと思います。
> >
> >
> > 次に履歴の削除について。
> > ページの履歴の破棄自体は一応できますが、ベストな方法は分からなかったです。
> >
> > 例えば、以下のように記述しますと、リクエストのたびに履歴が消えます。
> > このタイミングで、ばっさり消して、副作用がないのかは分からないのですけれども。
> > public class ExampleApplication extends WebApplication {
> >    public void init() {
> >        setRequestCycleProvider(new IRequestCycleProvider(){
> >            public RequestCycle get(final RequestCycleContext context)
> >            {
> >                return new RequestCycle(context){
> >                    @Override
> >                    protected void onEndRequest() {
> >                        Session session = Session.get();
> >                        session.getPageManager().sessionExpired(session.getId(
> > ));
> >                    }
> >                };
> >            }
> >        });
> >    }
> > }
> >
> > 履歴を消した後、ブラウザの戻るを使用した場合の挙動について。
> > 履歴が削除されたページを表示しようとした場合は、ブラウザにセッションタイムアウ
> > トの時のエラーが表示されます。
> > また履歴を消しても、戻り先がホームページ(あと、おそらくブックマーク可能なペー
> > ジも)の場合、ページのインスタンスが新規作成されるため、表面上元のページに戻れ
> > ます。
> >
> >
> > 最後に他の解決策の可能性について。
> > LoadableDetachableModelを使用すれば、ページのレンダリング時に、データを取り直
> > せるかも。
> > (実験してないです。すみません)
> >
> >
> > 以上、なにかの参考になれば。
> >
> > ----- Original Message -----
> > >Date: Tue, 13 Mar 2012 15:29:45 +0900
> > >From: 藤原高明 <t.bas****@gmail*****>
> > >To: wicke****@lists*****
> > >Subject: [Wicket-ja-user 638]
> > >       ページのバージョン管理について
> > >
> > >
> > >藤原です。
> > >いつもお世話になっております。
> > >
> > >ページのバージョン管理についてお聞きしたい事があります。
> > >Wicketが管理しているページの履歴を破棄することは可能でしょうか。
> > >
> > >例としては複数ユーザがDBの同一データにアクセスできる場合を想定しています。
> > >入力フォームで情報を登録し別ページに移動したとします。
> > >その間に別ユーザが情報を変更した場合、
> > >最新の情報とブラウザの「戻る」を使用して表示される情報に齟齬が生じてしまいま
> > す。
> > >
> > >このような状況を回避する方法はあるのでしょうか。
> > >
> > >----- inline -----
> > >_______________________________________________
> > >Wicket-ja-user mailing list
> > >Wicke****@lists*****
> > >http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user
> >
> > _______________________________________________
> > Wicket-ja-user mailing list
> > Wicke****@lists*****
> > http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user
> >
> > _______________________________________________
> > Wicket-ja-user mailing list
> > Wicke****@lists*****
> > http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user
> 
> _______________________________________________
> Wicket-ja-user mailing list
> Wicke****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user
> 
> _______________________________________________
> Wicket-ja-user mailing list
> Wicke****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user




Wicket-ja-user メーリングリストの案内
Back to archive index