Rails と Java EE の連携 - Rails からサーブレットを呼び出す

Posted by arungupta on April 04, 2008 at 08:04 AM

GlassFish に Rails アプリケーションを配備する利点の一つは、 Railsと Java EE アプリケーションを同一のコンテナ上で連携させられるということでしょう。
スクリーンキャスト#web9は、 GlassFish への Rails アプリケーションの配備がいかに容易に行えるかをご紹介しています。

このブログでは、JRuby-on-Rails (jRoR) と Java EE の融合について、少し踏み込んで考えてみたいと思います。
jRoRアプリケーション上でJava EE のサーブレットを呼び出す方法について触れ、RailsのViewからとても簡単にサーブレットを呼び出せることを示します。

なお、GlassFishへのjRoRアプリケーションの配備には WAR ベースモード を利用します。

くわしい手順はこちら:

1. インストール済みの JRuby1.1 RC3 ( Rails を含む)に、必要な gem をインストール:

~/testbed/jruby-1.1RC3>bin/jruby -S gem install activerecord-jdbc-adapter

JRuby limited openssl loaded. gem install jruby-openssl for full support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
Successfully installed activerecord-jdbc-adapter-0.8
1 gem installed
Installing ri documentation for activerecord-jdbc-adapter-0.8...
Installing RDoc documentation for activerecord-jdbc-adapter-0.8...

2. Rails アプリケーションを作成:

~/testbed/jruby-1.1RC3/samples/rails>../../bin/jruby -S rails railsee1
create  
create  app/controllers
create  app/helpers
create  app/models
create  app/views/layouts
create  config/environments
create  config/initializers
create  db
create  doc
create  lib
create  lib/tasks
create  log
create  public/images
create  public/javascripts
create  public/stylesheets
create  script/performance
create  script/process
create  test/fixtures
create  test/functional
create  test/integration
create  test/mocks/development
create  test/mocks/test
create  test/unit
create  vendor
create  vendor/plugins
create  tmp/sessions
create  tmp/sockets
create  tmp/cache
create  tmp/pids
create  Rakefile
create  README
create  app/controllers/application.rb
create  app/helpers/application_helper.rb
create  test/test_helper.rb
create  config/database.yml
create  config/routes.rb
create  public/.htaccess
create  config/initializers/inflections.rb
create  config/initializers/mime_types.rb
create  config/boot.rb
create  config/environment.rb
create  config/environments/production.rb
create  config/environments/development.rb
create  config/environments/test.rb
create  script/about
create  script/console
create  script/destroy
create  script/generate
create  script/performance/benchmarker
create  script/performance/profiler
create  script/performance/request
create  script/process/reaper
create  script/process/spawner
create  script/process/inspector
create  script/runner
create  script/server
create  script/plugin
create  public/dispatch.rb
create  public/dispatch.cgi
create  public/dispatch.fcgi
create  public/404.html
create  public/422.html
create  public/500.html
create  public/index.html
create  public/favicon.ico
create  public/robots.txt
create  public/images/rails.png
create  public/javascripts/prototype.js
create  public/javascripts/effects.js
create  public/javascripts/dragdrop.js
create  public/javascripts/controls.js
create  public/javascripts/application.js
create  doc/README_FOR_APP
create  log/server.log
create  log/production.log
create  log/development.log
create  log/test.log

3. アプリケーションに Goldspike プラグインをインストール:

~/testbed/jruby-1.1RC3/samples/rails/railsee1>../../../bin/jruby script/plugin install 
  svn://rubyforge.org/var/svn/jruby-extras/trunk/rails-integration/plugins/goldspike
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/test
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/test/war_config_test_config.rb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/test/test_java_library.rb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/test/test_maven_library.rb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/test/test_create_war.rb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/Rakefile
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/init.rb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/tasks
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/tasks/war.rake
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/lib
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/lib/util.rb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/lib/war_config.rb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/lib/run.rb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/lib/java_library.rb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/lib/packer.rb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/lib/create_war.rb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/install.rb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/generators
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/generators/goldspike
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/generators/goldspike/goldspike_generator.rb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/generators/goldspike/templates
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/generators/goldspike/templates/web.xml.erb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/generators/goldspike/templates/war.rb
A/Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1/vendor/plugins/goldspike/README
Exported revision 960.
 existsconfig
 createconfig/war.rb
 createWEB-INF
 createWEB-INF/web.xml.erb

パッケージングに Warbler を使用し、GoldSpike を使ってディスパッチを行う方法もあります。

4. サーブレットのコードを含む Java のライブラリを作成:

  • 1) NetBeans IDE を使って、"HelloServlet" という名前の "Javaクラスライブラリ" プロジェクトを作成してください。
  • 2) プロジェクトを右クリックして "新規" ⇒ "サーブレット..." をクリックします。クラス名に "HelloServlet" 、パッケージ名には "server" と入力してください(下図参照)

Cannot resolve external resource into attachment.

  • 3) プロジェクトを右クリックして "プロパティー" をクリックし、"カテゴリ" で "ライブラリ" を選択します。続いて "コンパイル" タブをクリックし、GlassFish v2 UR1 の "lib"ディレクトリ内にある "javaee.jar"を追加してください。
  • 4) さらに、 "processRequest" メソッド内の "try" ブロックを以下のように書き換えましょう:
String name = request.getParameter("name");
if (name == null || name.equals(""))
  name = "Duke";
out.println("<h1>Servlet HelloServlet at " + request.getContextPath () + " says Hello " + name + "!</h1>");
  • 5) プロジェクトを右クリックし、 "生成物を削除して構築" をクリック

5. Railsアプリをサーブレット用に設定

  • 1) Rails アプリケーションのディレクトリにある "WEB-INF/web.xml.erb" に以下の設定を追加します:
<servlet>
      <servlet-name>hello</servlet-name>
      <servlet-class>server.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
</servlet-mapping>
  • 2) "WEB-INF/lib" ディレクトリを作成し、NetBeans プロジェクトの "dist" ディレクトリから "HelloServlet.jar" をコピー。

6. WARファイルの作成と配備

  • 1) 以下のようにしてWARファイルを作成してください:
~/testbed/jruby-1.1RC3/samples/rails/railsee1>../../../bin/jruby -S rake war:standalone:create
(in /Users/arungupta/testbed/jruby-1.1RC3/samples/rails/railsee1)
info: Assembling web application
info: Packing needed Java libraries ...
info: adding Java library jruby-complete-1.1RC3
info: adding Java library goldspike-1.6
info: adding Java library activation-1.1
info: adding Java library commons-pool-1.3
info: adding Java library bcprov-jdk14-124
info: Packing needed Ruby gems ...
info: adding Ruby gem rails version 2.0.2
info: adding Ruby gem rake version 0.8.1
info: adding Ruby gem activesupport version 2.0.2
info: adding Ruby gem activerecord version 2.0.2
info: adding Ruby gem actionpack version 2.0.2
info: adding Ruby gem actionmailer version 2.0.2
info: adding Ruby gem activeresource version 2.0.2
info: adding Ruby gem activerecord-jdbc-adapter
version 0.8
info: Packing needed files ...
info: Creating web archive
~/testbed/jruby-1.1RC3/samples/rails/railsee1 >~/testbed/glassfish/v2ur1/glassfish/bin/asadmin deploy railsee1.war
Command deploy executed successfully.

7. これで、"http://localhost:8080/railsee1/hello" というURLにてサーブレットにアクセスすることができます。
デフォルトの状態ではブラウザに次のように表示されます:

Cannot resolve external resource into attachment.

ちなみに、 "http://localhost:8080/railsee1/hello?name=Arun" のように URL にパラメータを指定すると次のように表示されます:

Cannot resolve external resource into attachment.

さて、これで GlassFish v2 UR1 上の Rails アプリケーションに Java EE のサーブレットが追加されました。
今度はRailsアプリケーションにコントローラとビューを追加して、そこからサーブレットを呼び出してみましょう。

まさに Rails と Java EE の完全なる統合です。

8. 以下のように新規コントローラとビューを作成します:

~/testbed/jruby-1.1RC3/samples/rails/railsee1>
../../../bin/jrubyscript/generate controller home index
JRuby limited openssl loaded. gem install jruby-openssl for full support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
 existsapp/controllers/
 existsapp/helpers/
 createapp/views/home
 existstest/functional/
 createapp/controllers/home_controller.rb
 createtest/functional/home_controller_test.rb
 createapp/helpers/home_helper.rb
 createapp/views/home/index.html.erb

9. 作成されたコントローラ( "app/controllers/home_controller.rb" )を次のように変更:

class HomeController < ApplicationController

include Java

  def index
        url = java.net.URL.new("http://localhost:8080/railsee1/hello");
        conn = url.open_connection;
        reader = java.io.BufferedReader.new(java.io.InputStreamReader.new(conn.get_input_stream));
        @servlet_output = "";
        input_line = reader.read_line;
        while input_line != nil
                @servlet_output << input_line;
                input_line = reader.read_line;
        end
        reader.close;
  end
end

10. 作成されたビュー( "app/views/home/index.rhtml.erb" )を次のように変更:

<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>
<%= @servlet_output %>

11. 上記 # 6 の手順に従って WAR ファイルを再作成 & 再配備。
"http://localhost:8080/railsee1/home/index" にアクセスすると、以下のような画面が表示されます:

Cannot resolve external resource into attachment.

以上、 GlassFish 上に配備した Rails アプリケーション から Java EE 5 サーブレットを呼び出す手順をご紹介しました。
JRuby-on-Rails と GlassFish により、Rails アプリケーションの開発効率を活かしつつ Java EE アプリケーションに蓄積されたビジネス・ナレッジを活用することが可能となります。


日本語翻訳: Kana

原文