Railsのerbレイアウトの中にJSPの本文を埋め込む

文字列バッファに出力するようにしたHttpServletResponseを作って
RequestDispatcherのincludeでJSPのページを取ってくればいい。


railsのControllerで以下のように書く(前提:JRuby-Rack環境)

    writer = java.io.StringWriter.new
    req = request.env['java.servlet_request']
    resp = javax.servlet.http.HttpServletResponse.impl do |method|
      case method
      when :getWriter
        java.io.PrintWriter.new(writer)
      else
        logger.warn "method:#{method} called"
      end
    end

    $servlet_context.getRequestDispatcher("/sample.jsp").include(req, resp)
    render :inline => writer, :layout => true

JSPの中でforwardをしなければHttpServletResponse内のcase文さえ不要かも・・・

JRuby Tips

JRubyの現在のランタイムを取得する

JRuby.runtime

JRubyの公式ページには一切書かれてなかったんだけど・・・

JRuby-Rack

Tomcat上でRailsアプリを動かす場合など...

  • ServletContextの取得
$servlet_context

または

request.env['java.servlet_context']
  • ServletRequestの取得
request.env['java.servlet_request']

公式ページ見てもあまり詳しく書いていないのはなんでなんでしょうねぇ
もっとドキュメントを充実してほしいです

Redmine 0.9.4をTomcat 6で実行する方法

JRuby 1.5.0が出たのでうまくいくか試してみた
(以前やった方法>http://anond.hatelabo.jp/20100422043007)

環境は以下のとおり

JDK, Tomcat, JRubyはインストール済み

MySQLのインストール
yum install mysql-server
MySQLの起動
/etc/init.d/mysqld start
MySQLの設定

rootパスワードなどを設定する

mysql_secure_installation
Rubyモジュールのインストール

RubyGemsでモジュールをインストールする

jruby -S gem install rails
jruby -S gem install warbler
jruby -S gem install activerecord-jdbcmysql-adapter
MySQLRedmineデータベースを作成
mysql -u root -p
mysql> create database redmine character set utf8;
mysql> grant all privileges on redmine.* to 'redmine'@'localhost' identified by 'redmine';
mysql> exit

(ここでは、パスワードをredmineしているが自由に)

RedmineのDB設定

(任意の場所にRedmineを解凍して、解凍先のディレクトリに移動した後)

cp config/database.yml.example config/database.yml
vi config/database.yml

database.yml

production:
  adapter: jdbcmysql
  database: redmine
  host: localhost
  username: redmine
  password: redmine
  encoding: utf8
DBへのデータ投入
jruby -S rake generate_session_store
jruby -S rake db:migrate RAILS_ENV=production
jruby -S rake load_default_data RAILS_ENV=production
起動確認

script/serverで起動し、http://localhost:3000 にアクセスして正常に動作するか確認する

jruby script/server -e production
production.rbの修正

Tomcatで動かしたときにログ出力するための設定をする

vi config/environments/production.rb
config.logger = Logger.new(config.log_path)
config.logger.level = Logger::INFO
warblerの設定

warble.rbを生成

jruby -S warble config RAILS_ENV=production

warble.rbを修正

vi config/warble.rb
  config.dirs = %w(app config lib log vendor tmp extra files lang)
  config.gems << "activerecord-jdbcmysql-adapter"
  config.gems["rails"] = "2.3.5"
  config.gems["rack"] = "1.0.1"
  config.webxml.rails.env = "production"
  config.includes = FileList["vendor/gems/*/.specification"]

warファイルを作成

jruby -S warble RAILS_ENV=production

できたwarファイルをTomcatに配置して、Tomcatを起動する

mv redmine-0.9.4.war /usr/local/tomcat/webapps/redmine.war
/usr/local/tomcat/bin/startup.sh

http://localhost:8080/redmine/ にアクセスしてインストールできたか確認して完了!