きれいなURL

SAStrutsCubbyのようにきれいなURLを実現したい。
URLとコントローラクラスとのマッピングはこんな感じ。
コントローラクラスは XxxActionという命名規約にする。

/ -> IndexAction#index
/member -> MemberAction#index
/member/ -> MemberAction#index
/member/new -> MemberAction#new
/member/show/1 -> MemberAction#show?id=1
/member/show/1/2 -> MemberAction#show?id=1&hoge=2
/member/learn/show -> MemberAction#show?username=learn

でもこれだと、コントローラクラスはすべて同一パッケージに置くことになるが、クラスでいっぱいにならないだろうか?
パッケージ分割に対応させようとすると、URLとどうやってマッピングしようか?


案1.configファイルにパッケージ名として扱いたいパスを記述し、URL解析時に該当すればそちらを優先する
設定ファイル書くの面倒なんでボツ。


案2.存在するパッケージを探索してURLパスと一致する場合はパッケージとみなす
パッケージ追加時に既存のActionクラス名と重複し、実行クラスが変わってしまい思わぬ障害につながる恐れがあるかも。
でも、一般的にパッケージ使用と直下にクラスちりばめるのが混在することはほとんどないのでは?
デフォルトの動作をパッケージ探索にして、設定で探索OFF(全Actionクラスを同一パッケージに置く)にもできるようにするか、、、


と考えると、改めてURLとActionクラスのマッピングはこうなる。

/ -> IndexAction#index
/member -> MemberAction#index or member.IndexAction#index
/member/ -> MemberAction#index or member.IndexAction#index
/member/new -> MemberAction#new or member.NewAction#index
/member/show/1 -> MemberAction#show?id=1 or member.ShowAction#index?id=1
/member/show/1/2 -> MemberAction#show?id=1&hoge=2 or member.ShowAction#index?id=1&hoge=2
/member/learn/show -> MemberAction#show?username=learn or member.ShowAction#index?username=learn
/item/search/xxx-> ItemAction#search?name=xxx
/item/search/search/xxx -> item.SearchAction#search?name=xxx

/item/search/search/xxx とかなんか気持ち悪い。
パッケージを分割すれば、基本的に1ページ1アクション、しなければ基本的に1機能?1アクションとなるため、
分割しない場合でもクラスがいっぱいになることはほとんどないのでは?
と考え直す。
結局、パッケージ分割はサポートせず、アクションクラスは全て同一パッケージ(actionパッケージ)に置く規約にしようと思う。