JJUGのパネルディスカッションを受けて、、、というわけじゃないんだけど、
結構前から、ステートレス&ブックマーカブル&Non JavaScriptな
Webアプリをマジメに作るための方法を考えてます。
そんな考えの中身を、ちょっとだけ。
■Webフレームワークの選択
「S2Struts」が結論。
- S2JSF
、TeedaみたいなJSF勢は、どうしてもコンポーネントツリーがセッションに保持されるし。 - コンポーネントツリーをクライアントに保持することもできるそうだけど、、、ごめん、試したことない。
- そもそもS2JSFもTeedaも、JavaScriptほぼ必須だし。
- 確か、S2JSFは内部でセッションを結構使ってたはずだし。
- S2WicketやS2Clickは、ごめん、ちゃんと調べてない。
そんな感じで、無難にS2Strutsを選びました。
(2007/11/10修正。Teedaはセッションでコンポーネントツリーを保持しません)
■認証方式
「APサーバに任せる」が結論。
- Interceptorでやると、空実装でもInitActionが必須になるし、そもそもHTML以外のリソースに認証掛かんないし。
- ServletFilterで自前で実装しても良いけど、ほら、もう面倒だし。
■ユーザ情報の保持
「セッションにキャッシュする」が結論。
いきなり何セッション使ってんだよ、って言われそうだけど。
- セッションにユーザ情報を探しに行って、見つからなかったら、その時に検索してセッションに詰める。そんなServletFilterを作る。
- ユーザ情報を検索する時の主キーは、もちろん、APサーバから取得したUserName。
- セッションの利用をゼロにしたいなら、毎回検索しても良い。今のところ、そこまでのこだわりはない。
■買い物カゴみたいな情報の保持
「全部hiddenで」が結論。
- DTOをシリアライズして、hiddenに詰め込むConverterを作っても良い。まだ作ってないけど。
- hidden書き換えとか色々言われてるけど、「画面から入力できる情報 = hiddenに入れる情報」になるようカッチリ作る。
- だから、専用のActionFormは必須。
- ActionFormがEntityを継承したり、ActionFormにEntityを属性として持たせたりしない。書き換えられちゃうし。
- hiddenが本当にボトルネックになるようだったら、DBへの登録をリアルに検討する。まだ考えたことないけど。
■その他、操作情報
たとえば掲示板システムで、自分がいまどの掲示板を見ているかっていう、xxxId=hogeみたいな情報。
これも「セッションにキャッシュする」が結論。
- 理由や内容は、ユーザ情報の保持と同じ。
- 主キーはURLかhiddenに埋め込む。
- とは言え、手でURLやhiddenを書くのは面倒だから、自前でHttpServletResponseWrapperを書いて、encodeURLメソッドをoverrideしてURLに主キーを自動で埋め込むようにした。
- 手で埋め込むべきか、ResponceWrapperのどちらが賢いかは、今でも悩みどころ。
こんな感じで、ステートレス&ブックマーカブル&Non JavaScriptを実現できています。
もっと良い案とかあったら、教えてください m(_ _)m