PRGパターン
別にロールプレイングゲームじゃないです。
Webアプリケーションの実装方式のお話。
例えば、
入力画面→確認画面→完了画面
って感じで画面遷移していったとして。
完了画面でF5を押したらどうなるか?
⇒データベースに更新しに行く処理が2回流れて欲しくない。
例えば、
POSTで画面遷移→ブラウザの戻るボタン
ってオペレーションしたらどうなるか?
⇒ページの有効期限切れってなって欲しくない。
んで、このPRGパターン。
1. ブラウザ→POST→サーバ
⇒ブラウザからサーバにPOSTでデータを送って、
サーバ側ではそのデータを元に処理をする。
2. サーバ→REDIRECT→ブラウザ
⇒サーバからは転送先のアドレスと、
302のレスポンスコード(転送だよってのを示す。404だとNot Found。500だとサーバーエラー)を返す。
3. ブラウザ→GET→サーバ
⇒ブラウザからは2.で指定されたアドレスにリクエストする。
で、どうなるかっていうと、、、
上の完了画面でF5を押された〜っていう場合
→3.だけが呼び出されるのでDBに更新に行くような処理(1.のような処理)が
何度も呼び出される心配がない。
上の戻るボタンが押された〜っていう場合
→GETの場合は"有効期限が切れました"ってことにはなりません。
通常GETの場合は、リクエストするURLに XXX=hoge&XXXX=hage って感じで、
リクエストされる情報がURL上に記述されている形になるため。
リクエストパラメーターってのは、、、っていう場合は、
HTTPセッションを使って、そっから取得する感じ。
この辺をフレームワークで隠蔽して、プログラマはあんまり考えなくてもいいように、、、、
うちの会社でも、どこの会社でも、たぶんそんな感じ。
なんで、こんなエントリを書いたかっていうと。
実はリダイレクトの仕掛けってよくわかってなかった。
Strutsのredirect使うと、そういう風に動くから。別に意識してなかった。
サーバー側でヨロシク処理してるのかと思ってた。
システムテストの時に、障害があって、Apacheのログ眺めてたときに。
"あっ、そういうことなんだ"って。
他にも、こういうのいっぱいあるんだろうなぁって。
フレームワークうんぬん語るのもいいけど、
こういうところをちゃんとおさえなきゃなって思います。
Teeda使ってみたいなぁ↓。
http://event.seasarfoundation.org/sc2007spring/viewAttachment.do?_pageName_=Session&_fileName_=sc2007spring_S4_Teeda.pdf