ライブラリ/フレームワークごとのURL書き換え その2:Djangoの場合
Djangoの場合を調べてみた。Djangoは使ったこと無いんだけど。
URLconfに一元管理で定義。基本パターンでは、正規表現マッチしたパラメータがメソッドの引数になるところ。
urlpatterns = patterns('', (r'^articles/2003/$', 'news.views.special_case_2003'), (r'^articles/(\d{4})/$', 'news.views.year_archive'), (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'), (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'), )
正規表現で名前付きグループをつかうとそのままパラメータに変換できます。Javaの場合(JSR311やCubby)正規表現で名前付きグループは使えないので、正規表現にDSLっぽいことをやっているってことになります。名前付きグループはC#にもあるけど明示的で私は結構好きです。
urlpatterns = patterns('', (r'^articles/2003/$', 'news.views.special_case_2003'), (r'^articles/(?P<year>\d{4})/$', 'news.views.year_archive'), (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.month_archive'), (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/$', 'news.views.article_detail'), )
あと、完結に書けたり繰り返し出てくるところをまとめたりできて強力な感じ。
参考
">Django オンラインドキュメント和訳:URL ディスパッチャ
ライブラリ/フレームワークごとのURL書き換え その3:Catalystの場合
なんか楽しくなってきたのでCatalystも見てみる。
Catalystは各アクションのメソッドにアトリビュート(Javaでいうアノテーション)で定義します。Cubbyにめちゃめちゃ近い、どっかでCatalystの記事を見て影響を受けていたのかも。URL-to-action dispatchだそうです。パラメータの取得は正規表現のグループ番号で取得する方式です。
package MyApp::C::Quux; # http://localhost:3000/foo/bar/yada だけにマッチ sub baz : Path('foo/bar/yada') { } # http://localhost:3000/bar にのみマッチ sub bar : Global { } # http://localhost:3000/item23/order189 にマッチ sub bar : Regex('^item(\d+)/order(\d+)$') { my ( $self, $c ) = @_; my $item_number = $c->request->snippets->[0]; my $order_number = $c->request->snippets->[1]; # ... }
参考
Super Agile Struts開発記その5 - BeanUtilsその6 - JSTL連動
で、今はどうしようとしているかというと、JavaBeansをMapでラップしようとしています。でも、単純にラップするだけだとうまく行かないのです。JavaBeansがネストしているときは、ネストしたJavaBeansもラップしないといけないから。後、Collectionや配列でその要素がJavaBeansの場合も、ラップしてあげないといけない。
すごい地味だけどこれはすごい。今まで知らなかったけど、JSTLでMapはJavaScriptのMapと同じようにプロパティでも添え字でもアクセスできるんですね。
${map["name"]} ${map.name}
つまり上の2つは同じ意味。この方法使えば確かにpublicフィールドをプロパティのように見せかけることできますね。Cubbyではここは無理だとあきらめていて、アクションのアクセサはPropertyInterTypeで作ってね、Beanはアクセサ作ってねっていう方針だったけど、これできるならCubbyでもちょっと対応したくなってきますね。