1

Tomcatを組み込んだJavaSwingアプリケーションがあります。組み込みTomcatはプログラムで構成されます。xmlはありません。TomcatもGroovyサーブレットを使用して構成されます。

StandardWrapper gspWrapper = new StandardWrapper();
gspWrapper.setName("groovy");
gspWrapper.setServletName("groovy");
gspWrapper.setServletClass(GroovyServlet.class.getName());
gspWrapper.addInitParameter("fork", "false");
gspWrapper.setLoadOnStartup(2);

Rubyサポート(jRuby 1.7)も欲しいです。したがって、Groovyサポートと同じ方法で構成したいと思います。

StandardWrapper rubyWrapper = new StandardWrapper();
rubyWrapper.setName("rb");
rubyWrapper.setServletName("rb");
rubyWrapper.setServletClass(JRubyServlet.class.getName());
rubyWrapper.addInitParameter("fork", "false");
rubyWrapper.setLoadOnStartup(2);

JRubyServletクラスを作成しようとしましたが、スクリプトを実行して出力を応答に書き込む方法がわかりません。これが私の現在のコードです:

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jruby.Ruby;
import org.jruby.javasupport.JavaEmbedUtils;

public class JRubyServlet extends HttpServlet {

    private static final long serialVersionUID = -6913887886084787803L;
    private Ruby ruby;

  @Override public void init(ServletConfig config) throws ServletException {
      super.init(config);
      ruby = JavaEmbedUtils.initialize(new ArrayList<String> ());
  }

  @Override public void destroy() {
      JavaEmbedUtils.terminate(ruby);
      super.destroy();
  }

  @Override protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
      //How do you execute the script here?
  }

  @Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
      doGet(req, res);
  }
}
4

1 に答える 1

3

これを例のように使用してこれを行う方法をJavaEmbedUtils次に示します。

src/main/ruby/ruby_servlet.rb最初に、JRuby(ここでは)で記述されたサーブレットを作成できます。次に例を示します。

require 'java'

java_import 'javax.servlet.http.HttpServlet'

class RubyServlet < HttpServlet
  def init(config)
    puts "Configuring RubyServlet..."
  end

  def service(request, response)
    response.content_type = "text/html"
    out = response.writer

    out.println("Hi from JRuby.")
  end
end

次に、を使用してJRubyServletこのJRubyスクリプトを呼び出すことができます。

public class JRubyServlet extends HttpServlet {

    private static final long serialVersionUID = -6913887886084787803L;
    private Ruby ruby;
    private Servlet rubyServlet;

  @Override public void init(ServletConfig config) throws ServletException {
      super.init(config);
      // Add location of the script to load path
      ruby = JavaEmbedUtils.initialize(asList("src/main/ruby"));

      // Instantiate ruby servlet, and store it into instance variable rubyServlet
      rubyServlet = (Servlet)JavaEmbedUtils.rubyToJava(ruby.evalScriptlet("require 'ruby_servlet'; RubyServlet.new"));
      rubyServlet.init(config);
  }

  @Override public void destroy() {
      JavaEmbedUtils.terminate(ruby);
      super.destroy();
  }

  @Override protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

      // Call JRuby servlet's service method!
      rubyServlet.service(req, res);
  }

  @Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
      doGet(req, res);
  }

https://github.com/jruby/jruby/wiki/RedBridgeもご覧ください; JRuby Embedを使用すると、並行性モデルなどを制御する方法が提供されます。

于 2012-09-10T11:21:17.077 に答える