<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>Nick Sieger: Tag rack</title>
  <id>tag:blog.nicksieger.com,2005:Typo</id>
  <generator uri="http://www.typosphere.org" version="4.0">Typo</generator>
  <link rel="self" type="application/atom+xml" href="http://blog.nicksieger.com/xml/atom10/tag/rack/feed.xml"/>
  <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/tag/rack?tag=rack"/>
  <updated>2008-05-08T17:31:49+00:00</updated>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:dbf694f6-1c82-46b8-bffb-ee00a82f8390</id>
    <published>2008-05-08T17:31:00+00:00</published>
    <updated>2008-05-08T17:31:49+00:00</updated>
    <title>Introducing JRuby-Rack</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2008/05/08/introducing-jruby-rack"/>
    <category term="jruby" scheme="http://blog.nicksieger.com/articles/tag/jruby"/>
    <category term="rails" scheme="http://blog.nicksieger.com/articles/tag/rails"/>
    <category term="rack" scheme="http://blog.nicksieger.com/articles/tag/rack"/>
    <category term="merb" scheme="http://blog.nicksieger.com/articles/tag/merb"/>
    <content type="html">&lt;p&gt;Continuing in the spirit of Conference-Driven Development, I&amp;#8217;m happy to announce the first public release of &lt;a href="http://wiki.jruby.org/wiki/JRuby_Rack"&gt;JRuby-Rack&lt;/a&gt;! You can use it to run Rails, Merb, or any Rack-compatible application inside a Java application server.&lt;/p&gt;

&lt;p&gt;Also released today is &lt;a href="http://caldersphere.rubyforge.org/warbler/"&gt;Warbler 0.9.9&lt;/a&gt;, which has been updated to bundle JRuby-Rack.&lt;/p&gt;

&lt;p&gt;In addition to providing as seamless a connection as possible between the servlet environment and Rack, JRuby-Rack (along with Warbler) is also bridging the gap between Ruby and Java web development. Some of the things it does are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Makes the Java servlet context and servlet request available to Ruby through special variables in the Rack environment&lt;/li&gt;
&lt;li&gt;Servlet request attributes from Java are passed through and available in the Rack environment. Request attributes can override Rack variables such as &lt;code&gt;PATH_INFO&lt;/code&gt;, &lt;code&gt;QUERY_STRING&lt;/code&gt; etc.&lt;/li&gt;
&lt;li&gt;Configures Rails deployment options such as page caching directories and session handling automatically and optimally for the servlet environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I&amp;#8217;ve also included the beginnings of some extensions that should help integrate Rails with existing Java web frameworks, servlets, JSPs, and other code. For example, you can invoke a Rails request from within a JSP with a tag:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_xml "&gt;&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="namespace"&gt;jruby-rack&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;&lt;span class="tag"&gt;rails&lt;/span&gt; &lt;span class="attribute"&gt;path&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/projects/activity&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="attribute"&gt;params&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;layout=none&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can set servlet and session attributes and forward to other servlets and JSPs from your Rails controllers:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;DemoController&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ApplicationController&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;index&lt;/span&gt;
    &lt;span class="ident"&gt;servlet_request&lt;/span&gt;&lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;hello&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;world!&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="ident"&gt;session&lt;/span&gt;&lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;rails&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Visible to java!&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="ident"&gt;forward_to&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;/attributes.jsp&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and read them from within the servlet or JSP:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_xml "&gt;&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;dl&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;dt&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;tt&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;servlet_request[&amp;quot;hello&amp;quot;] | request.getAttribute(&amp;quot;hello&amp;quot;)&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;tt&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;dt&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;dd&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&amp;lt;%=&lt;/span&gt; &lt;span class="attribute"&gt;request.getAttribute(&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;hello&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; %&lt;span class="punct"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;dd&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;dt&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;tt&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;session[&amp;quot;rails&amp;quot;] | session.getAttribute(&amp;quot;rails&amp;quot;)&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;tt&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;dt&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;dd&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&amp;lt;%=&lt;/span&gt; &lt;span class="attribute"&gt;session.getAttribute(&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;rails&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; %&lt;span class="punct"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;dd&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;dl&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This is just the beginning of this kind of integration, and I&amp;#8217;m interested where people take it. I think this provides a nifty way to start integrating Rails bits into existing applications or reuse existing Java web application code.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve tagged the release with an 0.9 version number. I believe the bits are ready for serious use, but could use some help pounding out a few more bugs before calling it 1.0. So &lt;code&gt;jruby -S gem install warbler&lt;/code&gt; today, try it out, and bring plenty of feedback to the &lt;a href="http://xircles.codehaus.org/lists/user@jruby.codehaus.org"&gt;JRuby user list&lt;/a&gt;!&lt;/p&gt;</content>
  </entry>
</feed>
