谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

ステートレスへの挑戦

JJUGのパネルディスカッションを受けて、、、というわけじゃないんだけど、
結構前から、ステートレス&ブックマーカブル&Non JavaScript
Webアプリをマジメに作るための方法を考えてます。


そんな考えの中身を、ちょっとだけ。


■Webフレームワークの選択

S2Struts」が結論。

  • S2JSFTeedaみたいなJSFは、どうしてもコンポーネントツリーがセッションに保持されるし。
  • コンポーネントツリーをクライアントに保持することもできるそうだけど、、、ごめん、試したことない。
  • そもそもS2JSFTeedaも、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