11/6日本Javaユーザーグループによる「クロス・コミュニティ・カンファレンス 2007 falll」に参加してきました。Seasarひがさん、Rails高井さんとともに 「Webアプリケーション開発の今後を占う」という題名でポジショントークとパネルを行いました。よういちろうさんがuStreamで録画してくれたので見てください。ちょっと、音声がぶつぶつですが、だいたい聞き取れると思います。ポジショントークの資料はこちら。
RailsでSpring
ポジショントークで紹介したのがRailsとSpringを統合してみた、というやつです。コードはここに。
まずJavaアプリケーションですがjava\src\java\mainに入っています。クラスBusinessLogicImplは、メッセージを返却するだけのメソッドshowMessageが実装されています。
package jp.java_users.ccc2007.impl;
import jp.java_users.ccc2007.BusinessLogic;
public class BusinessLogicImpl implements BusinessLogic {
private String message;
public void setMessage(String message) {
this.message = message;
}
public String showMessage() {
return message;
}
メッセージはSpringにinjectしてもらう想定。java\src\java\resourcesのapplicationContext.xmlを見てください。
<bean id="mybl" class="jp.java_users.ccc2007.impl.BusinessLogicImpl" >
<property name="message" value="Hello Spring" />
</bean>
Springの起動はweb.xmlを利用しますがconfigに入っています。applicatioinContextはクラスパス経由で呼び出されます。これらはJARファイルにしてlib\spring-rails-0.0.1にいれてあります。
さて、Railsアプリケーションはすごく単純なものでconfig\routes.rbにあるように、なんでもCccで受けます。
map.connect '', :controller => "ccc", :action => 'index'
コントローラーはapp\controllers\CccController.rbです。
class CccController < ApplicationController
include Java
import org.springframework.web.context.support.WebApplicationContextUtils
def index
app_context = WebApplicationContextUtils.getWebApplicationContext($servlet_context)
@mybl = app_context.getBean 'mybl'
@message = "Hello World"
end
end
これはJRubyを前提に、いきなりSpringのWebApplicationContextUtilsを使うように書いてあります。が、もっとラッピングしてかっこよくすることは可能だと思います。Railsがよくわからないから手抜き。
で、テンプレートがviews\ccc\index.rhtml。
<%= @message %><br />
<%= @mybl.showMessage %><br />
こんだけですね。
さて、このRailsのアプリケーションをWARファイルで動かします。これに利用したのがWarblerです。RailsをServletコンテナで動かすというのではGoldSpikeが有名だと思いますが、WarblerはGoldSpikeを使いやすくするためのツールです。詳しくはInfoQの「Warbler:RailsのJava EE WARファイル向けパッケージングツールの機能強化」と作者の「Warbler, A Little Birdie To Introduce Your Rails App To Java」をどうぞ。
使い方は簡単(詳しくはWarblerのページで)。
1.web.xmlをcxonfigにおく(元ネタは1回Warblerを実行したときにできるtmp/war/WEB-INF/web.xmlを利用)
2.必要なJARファイルをlibにおく
3.jruby %JRUBY_HOME%\bin\warbleを実行
これだけでwarファイルを作ってくれます。すごい便利。
パネル
さてパネルですが、なかなか面白かったです。yoshiori、おつかれ!
個人的な発見はSpringの立場が一番柔軟で可能性や多様性を認めるという点です。RailsやSeasaerほうが、ある意味で頑な。もちろん柔軟性がある=良いという単純な図式ではありません。柔軟性を得るために暗黙的な規約を排除し、なるべく明示的な設定を行おうという姿勢になるわけですね。そう、Springは「柔軟でありたい」ということについては、ものすごい頑なです。
Webアプリケーションの今後についても「コンテキストを読んで勝ちパターンにしたがってやんなさい」 by 高井さんという意味では3者とも同じ意見。ただ、解き方が違うわけです。
僕はエンジニアの持つ特性や才能を活かすには個々人の作業にあった道具(言語やフレームワーク)が必要だと思っています。だから、複数の言語やフレームワークが1つのアプリケーションの中で使われるのは当たり前のことです。そして、それらの統合するためのインフラとしてはSpringが最も使いやすいと考えています。
