blob: c15b05f0089024473ddf50e5e79108fdfccb6a82 [file] [log] [blame]
<html><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Setting up Tomcat with OpenEJB --
Leveraging J2EE JNDI principles</title><link href="default.css" rel="stylesheet"><link href="/images/favicon.ico" rel="SHORTCUT ICON"></head><body marginwidth="0" marginheight="0" leftmargin="0" bottommargin="0" topmargin="0" vlink="#6763a9" link="#6763a9" bgcolor="#ffffff"><a name="top"></a><table height="400" width="712" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#7270c2" align="left" valign="top" width="20"><img border="0" height="1" width="1" src="images/dotTrans.gif"></td><td bgcolor="#7270c2" align="left" valign="top" width="95"><img border="0" height="1" width="1" src="images/dotTrans.gif"></td><td align="left" valign="top" width="7"><img height="1" width="1" border="0" src="images/dotTrans.gif"></td><td align="left" valign="top" width="40"><img border="0" height="6" width="40" src="images/dotTrans.gif"></td><td bgcolor="#5A5CB8" align="left" valign="top" width="430"><img border="0" height="6" width="430" src="images/top_2.gif"></td><td bgcolor="#E24717" align="left" valign="top" width="120"><img src="images/top_3.gif" width="120" height="6" border="0"></td></tr><tr><td align="left" valign="top" bgcolor="#7270c2" width="20"><img height="1" width="1" border="0" src="images/dotTrans.gif"></td><td align="left" valign="top" bgcolor="#7270c2" width="95"><img height="1" width="1" border="0" src="images/dotTrans.gif"></td><td align="left" valign="top" bgcolor="#ffffff" width="7"></td><td align="left" valign="top" width="40"><img border="0" height="1" width="1" src="images/dotTrans.gif"></td><td align="left" valign="middle" width="430"><a href="faq.html"><span class="menuTopOff">[ f a q ]</span></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://wiki.codehaus.org/openejb"><span class="menuTopOff">[ w i k i ]</span></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://archive.openejb.codehaus.org/user/"><span class="menuTopOff">[ l i s t s ]</span></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://cvs.openejb.org/"><span class="menuTopOff">[ c v s ]</span></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://jira.codehaus.org/secure/BrowseProject.jspa?id=10401"><span class="menuTopOff">[ b u g s ]</span></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img border="0" height="2" width="1" src="images/dotTrans.gif"></td><td align="left" valign="top" height="20" width="120">&nbsp;</td></tr><tr><td align="left" valign="top" bgcolor="#7270c2" width="20"><img border="0" height="3" width="20" src="images/dotTrans.gif"></td><td align="left" valign="top" bgcolor="#7270c2" width="95"><img border="0" height="3" width="105" src="images/line_sm.gif"></td><td align="left" valign="top" bgcolor="#a9a5de" width="7"><img border="0" height="3" width="7" src="images/line_sm.gif"></td><td align="left" valign="top" width="40"><img border="0" height="3" width="40" src="images/line_light.gif"></td><td align="left" valign="top" width="430"><img border="0" height="3" width="430" src="images/line_light.gif"></td><td align="left" valign="top" width="120"><img height="1" width="1" border="0" src="images/dotTrans.gif"></td></tr><tr><td align="left" valign="top" bgcolor="#7270c2"><img border="0" height="10" width="20" src="images/dotTrans.gif"></td><td align="left" valign="top" bgcolor="#7270c2" width="95"><img border="0" height="2" width="1" src="images/dotTrans.gif"><br><table cellspacing="0" cellpadding="0" border="0"><tr><td align="left" valign="top"><span class="subMenuOn">Main</span></td></tr><tr><td align="left" valign="top"><a href="index.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Welcome!</span></a></td></tr><tr><td align="left" valign="top"><a href="download.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Download</span></a></td></tr><tr><td align="left" valign="top"><a href="lists.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Mailing Lists</span></a></td></tr><tr><td align="left" valign="top"><a href="cvs.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Source Code</span></a></td></tr><tr><td align="left" valign="top"><a href="contributors.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
The Team</span></a></td></tr><tr><td align="left" valign="top"><a href="status.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Status</span></a></td></tr></table><table cellspacing="0" cellpadding="0" border="0"><tr><td align="left" valign="top"><span class="subMenuOn">Users</span></td></tr><tr><td align="left" valign="top"><a href="quickstart.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Quickstart</span></a></td></tr><tr><td align="left" valign="top"><a href="hello-world.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Hello World!</span></a></td></tr><tr><td align="left" valign="top"><a href="cmp_entity_postgresql.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
CMP Example</span></a></td></tr><tr><td align="left" valign="top"><a href="cmp_guide.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
CMP Guide</span></a></td></tr><tr><td align="left" valign="top"><a href="deploy.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Deploy</span></a></td></tr><tr><td align="left" valign="top"><a href="start-command.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Startup</span></a></td></tr><tr><td align="left" valign="top"><a href="validate.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Validation</span></a></td></tr><tr><td align="left" valign="top"><a href="config_containers.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Configuration</span></a></td></tr><tr><td align="left" valign="top"><a href="properties.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Properties</span></a></td></tr></table><table cellspacing="0" cellpadding="0" border="0"><tr><td align="left" valign="top"><span class="subMenuOn">Servers</span></td></tr><tr><td align="left" valign="top"><a href="embedded.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Local Server</span></a></td></tr><tr><td align="left" valign="top"><a href="remote-server.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Remote Server</span></a></td></tr><tr><td align="left" valign="top"><a href="tomcat.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Tomcat</span></a></td></tr><tr><td align="left" valign="top"><a href="geronimo.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Geronimo</span></a></td></tr></table><table cellspacing="0" cellpadding="0" border="0"><tr><td align="left" valign="top"><span class="subMenuOn">Integrators</span></td></tr><tr><td align="left" valign="top"><a href="whyopenejb.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Why OpenEJB</span></a></td></tr><tr><td align="left" valign="top"><a href="containersystem.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Overview</span></a></td></tr><tr><td align="left" valign="top"><a href="design_openejb.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Design</span></a></td></tr><tr><td align="left" valign="top"><a href="OpenEJB_presentaion.ppt"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Presentation</span></a></td></tr></table><img border="0" height="15" width="1" src="images/dotTrans.gif"><br><img border="0" height="3" width="105" src="images/line_sm.gif"><br><A href="http://codehaus.org"><IMG alt="The Codehaus" border="0" height="17" width="88" src="http://www.openejb.org/codehaus-smaller.png"></A></td><td align="left" valign="top" bgcolor="#a9a5de" width="7">&nbsp;</td><td align="left" valign="top" width="40">&nbsp;</td><td valign="top" width="430" rowspan="4"><table width="430" cellspacing="0" cellpadding="0" border="0" rows="2" cols="1"><tr><td align="left" valign="top"><br><img width="200" vspace="0" src="./images/logo_ejb2.gif" hspace="0" height="55" border="0"><br><img src="images/dotTrans.gif" hspace="0" height="7" border="0"><br><span class="pageTitle">Setting up Tomcat with OpenEJB</span><br><span class="pageSubTitle">Leveraging J2EE JNDI principles</span><br><img src="images/dotTrans.gif" hspace="0" height="1" border="0"></td></tr></table><p></p><p></p><br><span class="toc"><a href="#abstract">Abstract</a><br></span><span class="toc"><a href="#intro">Before we start</a><br></span><span class="toc"><a href="#ejb-ref">Referencing EJBs in web application</a><br></span><span class="toc"><a href="#install">Installing OpenEJB's EJB factory in Tomcat</a><br></span><span class="toc"><a href="#example">Example application</a><br></span><br><a name="abstract"><h2>Abstract</h2></a>
<p><span class="bodyBlack">
Java 2 Enterprise Edition (J2EE) provides several technologies that lets build
J2EE-compliant applications that can be run in any J2EE-compliant application server.
One of the several technologies is Java Naming and Directory Interface (JNDI).
JNDI is a technology that provides a unified access
to different naming and directory services. Regardless of the underlaying service,
if it supports JNDI a client doesn't have to know what exactly application it's to talk to
other than it adheres to JNDI concepts and interfaces.
</span></p>
<p><span class="bodyBlack">
OpenEJB and Tomcat can complement each other in fullfiling J2EE principles. OpenEJB is
an EJB container whereas Tomcat is a servlet container. Although they serve different
clients, both products use JNDI extensively. Obviously, either container provides different JNDI "views"
of its managed components. The question pertaining to the integration is how to tie
the different naming systems so that when a client requests an object from Tomcat naming space,
Tomcat will know that it needs to pass the request along to OpenEJB naming space.
That's what the object factory is to solve out.
</span></p>
<p><span class="bodyBlack">
While reading JNDI specification you can come across the interface:
<a href="http://java.sun.com/j2se/1.4.1/docs/api/javax/naming/spi/ObjectFactory.html">
javax.naming.spi.ObjectFactory</a>. The javadoc of the interface reads:
</span></p>
<hr noshadow="" size="1"><span class="bodyGrey">
This interface represents a factory for creating an object.
<br>
<br>
The JNDI framework allows for object implementations to be loaded in dynamically via object factories.
For example, when looking up a printer bound in the name space,
if the print service binds printer names to References, the printer Reference
could be used to create a printer object, so that the caller of lookup can
directly operate on the printer object after the lookup.
<hr noshadow="" size="1"></span>
<p><span class="bodyBlack">
Theorically, it seems to be possible to create a web application that makes use of EJBs,
deploy these EJBs in OpenEJB, and the web application in Tomcat, set up an object factory
and finally boot it up. The following sections are to outline what exactly the steps are in OpenEJB and Tomcat
with description of why they are required at all.
</span></p>
<a name="intro"><h2>Before we start</h2></a>
<p><span class="bodyBlack">
Before we start, ensure that OpenEJB and Tomcat are in appropriate releases.
</span></p>
<table bgcolor="#7270c2" width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#7270c2"><span class="note-caption">&nbsp;NOTE</span></td></tr><tr><td bgcolor="#7270c2"><table bgcolor="#7270c2" width="100%" cellspacing="2" cellpadding="7" border="0"><tr><td bgcolor="#FFFFFF"><span class="note">
What follows should be doable on any Tomcat 4.x or 5.x release. The author
tested it under Jakarta Tomcat 4.1.18 and 5.0.27 (the most recent public release at
that time).
</span></td></tr></table></td></tr></table>
<br>
<table bgcolor="#7270c2" width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#7270c2"><span class="note-caption">&nbsp;NOTE</span></td></tr><tr><td bgcolor="#7270c2"><table bgcolor="#7270c2" width="100%" cellspacing="2" cellpadding="7" border="0"><tr><td bgcolor="#FFFFFF"><span class="note">
It's assumed that Tomcat and OpenEJB are already installed and running properly
as a separate products.
</span></td></tr></table></td></tr></table>
<a name="ejb-ref"><h2>Referencing EJBs in web application</h2></a>
<p><span class="bodyBlack">J2EE 1.3 specification says (page 57):</span></p>
<p><span class="bodyBlack">
<hr noshadow="" size="1"><span class="bodyGrey">
The Application Component Provider must declare all the EJB references
using the ejb-ref elements of the deployment descriptor. This allows the consumer
of the application component's jar file (the Application Assembler or Deployer) to
discover all the EJB references used by the application component.
<hr noshadow="" size="1"></span>
</span></p>
<p><span class="bodyBlack">
It means that each time a web application needs to reference a bean, the bean has to be declared in
the web application's deployment descriptor (
<i>/WEB-INF/web.xml</i> file). The element which does so
is
<i>ejb-ref</i>.
Although most containers don't enforce that approach, it's always better to describe dependencies in
a standard, J2EE-compliant way, in the deployment descriptor of the corresponding components.
</span></p>
<table bgcolor="#7270c2" width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#7270c2"><span class="note-caption">&nbsp;NOTE</span></td></tr><tr><td bgcolor="#7270c2"><table bgcolor="#7270c2" width="100%" cellspacing="2" cellpadding="7" border="0"><tr><td bgcolor="#FFFFFF"><span class="note">
Tomcat won't refuse to activate the components even if they reference EJBs with no declaration in
the deployment descriptors.
</span></td></tr></table></td></tr></table>
<p><span class="bodyBlack">
Our example's web application declares the referenced bean in the deployment descriptor
(
<i>/WEB-INF/web.xml</i>) as follows:
</span></p>
<table width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#e0e0e0"><span class="code-block"><pre>
&lt;ejb-ref&gt;
&lt;description&gt;
EJB Reference to the bean deployed to OpenEJB
&lt;/description&gt;
&lt;ejb-ref-name&gt;ejb/hello&lt;/ejb-ref-name&gt;
&lt;ejb-ref-type&gt;Session&lt;/ejb-ref-type&gt;
&lt;home&gt;org.acme.HelloHome&lt;/home&gt;
&lt;remote&gt;org.acme.Hello&lt;/remote&gt;
&lt;/ejb-ref&gt;</pre></span></td></tr></table>
<p><span class="bodyBlack">
Here goes a JSP that uses the ejb-ref-name to get a reference to the declared bean.
</span></p>
<p><span class="bodyBlack">
<table width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#c0c0c0"><i><span class="code-title">openejb.jsp</span></i></td></tr><tr><td bgcolor="#e0e0e0"><span class="code-block"><pre>
&lt;%@ page import="org.acme.HelloObject,
org.acme.HelloHome,
javax.naming.InitialContext,
javax.naming.Context"%&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;OpenEJB -- EJB for Tomcat&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;%
Context initCtx = new InitialContext();
Object object = initCtx.lookup("java:comp/env/ejb/hello");
HelloHome helloHome = (HelloHome)
javax.rmi.PortableRemoteObject.narrow(object, HelloHome.class);
HelloObject bean = helloHome.create();
%&gt;
&lt;%= bean.sayHello() %&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></span></td></tr></table>
</span></p>
<p><span class="bodyBlack">
As it's shown in the sample JSP above, there is no direct reference to the EJB container to be used.
The application component provider doesn't have to know what container the EJB is to be deployed to.
What it does have to ascertain is that the name the JSP uses is actually an ejb reference. Moreover, the reference
should be the one to HelloHome home interface or otherwise the application will fail.
</span></p>
<a name="install"><h2>Installing OpenEJB's EJB factory in Tomcat</h2></a>
<table bgcolor="#7270c2" width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#7270c2"><span class="note-caption">&nbsp;NOTE</span></td></tr><tr><td bgcolor="#7270c2"><table bgcolor="#7270c2" width="100%" cellspacing="2" cellpadding="7" border="0"><tr><td bgcolor="#FFFFFF"><span class="note">
<b>CATALINA_HOME</b> environment variable points to the directory where Jakarta Tomcat 4.x has
been installed.
</span></td></tr></table></td></tr></table>
<p><span class="bodyBlack">The J2EE 1.3 specification says (page 56):</span></p>
<p><span class="bodyBlack">
<hr noshadow="" size="1"><span class="bodyGrey">
The Deployer binds the EJB references to the enterprise bean's homes
in the target operational environment.
<hr noshadow="" size="1"></span>
</span></p>
<p><span class="bodyBlack">
It means that after an Application Component Provider (in the document, it's you) has created a web application
and specified an EJB reference in the deployment descriptor, a deployer (you, too) has to bind the reference
in Tomcat. The task boils down to put appropriate entry in Tomcat's configuration file.
</span></p>
<p><span class="bodyBlack">
Tomcat's default configuration file is
<i>server.xml</i> in
<i>$CATALINA_HOME/conf</i> directory. According to server.xml's documentation it's possible to
create an appropriate definition of a factory and let the factory to handle requests for the objects it
is registered to handle. That's what OpenEJB's EJB factory does. It intercepts messages for EJBs, passes it along
to OpenEJB and returns requested bean.
</span></p>
<p><span class="bodyBlack">
Tomcat registers resource factories in
<i>GlobalNamingResources</i> or
<i>Context</i>
elements which demarcate the name space of different web applications.
</span></p>
<p><span class="bodyBlack">
<table bgcolor="#7270c2" width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#7270c2"><span class="note-caption">&nbsp;NOTE</span></td></tr><tr><td bgcolor="#7270c2"><table bgcolor="#7270c2" width="100%" cellspacing="2" cellpadding="7" border="0"><tr><td bgcolor="#FFFFFF"><span class="note">
It's recommended to place resource definitions within Context elements, which prevents name clashes
to occur when the same names are to point to different resources (e.g. EJBs).
</span></td></tr></table></td></tr></table>
</span></p>
<p><span class="bodyBlack">
The following snippet shows the elements necessary to register the EJB reference, which has been defined
in the web application's deployment descriptor. The document doesn't describe the particular elements of
server.xml file other than
<i>ResourceParams</i> parameters.
The reader shall read the
<a href-="">Tomcat documentation</a> to get acquainted with the file's structure.
</span></p>
<p><span class="bodyBlack">
<table width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#c0c0c0"><i><span class="code-title">$CATALINA_HOME/conf/server.xml</span></i></td></tr><tr><td bgcolor="#e0e0e0"><span class="code-block"><pre>
&lt;Server&gt;
...
&lt;Context path=...&gt;
...
&lt;Ejb name="ejb/hello"
type="Session"
home="org.acme.HelloHome"
remote="org.acme.Hello"/&gt;
&lt;ResourceParams name="ejb/hello"&gt;
&lt;parameter&gt;
&lt;name&gt;factory&lt;/name&gt;
&lt;value&gt;org.openejb.client.TomcatEjbFactory&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
&lt;name&gt;openejb.naming.factory.initial&lt;/name&gt;
&lt;value&gt;org.openejb.client.LocalInitialContextFactory&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
&lt;name&gt;openejb.naming.security.principal&lt;/name&gt;
&lt;value&gt;username&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
&lt;name&gt;openejb.naming.security.credentials&lt;/name&gt;
&lt;value&gt;password&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
&lt;name&gt;openejb.naming.provider.url&lt;/name&gt;
&lt;value&gt;localhost:4201&lt;/value&gt;
&lt;/parameter&gt;
&lt;parameter&gt;
&lt;name&gt;openejb.ejb-link&lt;/name&gt;
&lt;value&gt;Hello&lt;/value&gt;
&lt;/parameter&gt;
&lt;/ResourceParams&gt;
&lt;/Context&gt;
...
&lt;/Server&gt;</pre></span></td></tr></table>
</span></p>
<p><span class="bodyBlack">
ResourceParams parameters consitute a bean reference. They inform Tomcat about who will know how to handle
requests for the bean.
<table cellspacing="2" cellpadding="2" border="0"><tr><td height="5" colspan="2"></td></tr><span class="bodyGrey">
<tr><td width="10" valign="top" align="left"><img src="images/grayDot.gif"></td><td valign="top" align="left"><span class="bodyBlack">
<b>factory</b> - (mandatory) the class instantiated by Tomcat when a request for a bean has arrived;
it must be
<b>org.openejb.client.TomcatEjbFactory</b> if the request ought to be handed over to OpenEJB.
</span></td></tr>
<tr><td width="10" valign="top" align="left"><img src="images/grayDot.gif"></td><td valign="top" align="left"><span class="bodyBlack">
<b>openejb.naming.factory.initial</b> - (mandatory) OpenEJB JNDI InitialContext implementation;
the parameter may be assigned to one of the two values:
<table cellspacing="2" cellpadding="2" border="0"><tr><td height="5" colspan="2"></td></tr><span class="bodyGrey">
<tr><td width="10" valign="top" align="left"><img src="images/grayDot.gif"></td><td valign="top" align="left"><span class="bodyBlack">
<b>org.openejb.client.LocalInitialContextFactory</b> - OpenEJB is started in the same JVM as Tomcat;
it boosts performance drastically as the beans are in the same JVM as a client (e.g. a web application); it boots up
OpenEJB in the local mode - an Local (aka IntraVM) Server instance
</span></td></tr>
<tr><td width="10" valign="top" align="left"><img src="images/grayDot.gif"></td><td valign="top" align="left"><span class="bodyBlack">
<b>org.openejb.client.RemoteInitialContextFactory</b> - OpenEJB is started outside of the current JVM;
all calls are forwarded to a OpenEJB Remote Server instance
</span></td></tr>
</span></table>
</span></td></tr>
<tr><td width="10" valign="top" align="left"><img src="images/grayDot.gif"></td><td valign="top" align="left"><span class="bodyBlack">
<b>openejb.ejb-link</b> - (mandatory) the bean's name to be looked up in OpenEJB; the name doesn't
have to be the same as the reference's name in Tomcat; it's the name the bean may be found in OpenEJB
JNDI name space.
</span></td></tr>
</span></table>
</span></p>
<p><span class="bodyBlack">
The following parameters are only required when
<b>openejb.naming.factory.initial</b> is set to
<b>org.openejb.client.RemoteInitialContextFactory</b>.
<table cellspacing="2" cellpadding="2" border="0"><tr><td height="5" colspan="2"></td></tr><span class="bodyGrey">
<tr><td width="10" valign="top" align="left"><img src="images/grayDot.gif"></td><td valign="top" align="left"><span class="bodyBlack">
<b>openejb.naming.security.principal</b> - the name of the user who is allowed to access
the JNDI context
</span></td></tr>
<tr><td width="10" valign="top" align="left"><img src="images/grayDot.gif"></td><td valign="top" align="left"><span class="bodyBlack">
<b>openejb.naming.security.credentials</b> - the password of the user who is set up in
openejb.naming.security.principal parameter
</span></td></tr>
<tr><td width="10" valign="top" align="left"><img src="images/grayDot.gif"></td><td valign="top" align="left"><span class="bodyBlack">
<b>openejb.naming.provider.url</b> - the server and port OpenEJB handles remote requests
</span></td></tr>
</span></table>
</span></p>
<p><span class="bodyBlack">
The
<b>factory</b> parameter indicates the class which passes a request for a bean to OpenEJB instance.
In order for the class to be instantiated by Tomcat, OpenEJB Loader has to be installed. The Loader takes
care of loading necessary classes from OpenEJB directory. It finds the directory relying upon
<b>OPENEJB_HOME</b> environament variable.
</span></p>
<p><span class="bodyBlack">
Create a file named setenv.sh (or setenv.bat on MS Windows) in $CATALINA_HOME/bin directory with the following
content:
</span></p>
<p><span class="bodyBlack">
<table width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#c0c0c0"><i><span class="code-title">$CATALINA_HOME/bin/setenv.sh</span></i></td></tr><tr><td bgcolor="#e0e0e0"><span class="code-block"><pre>
export CATALINA_OPTS="-Dopenejb.home=$OPENEJB_HOME"</pre></span></td></tr></table>
</span></p>
<p><span class="bodyBlack">
Finally, add the OpenEJB Loader to Tomcat.
</span></p>
<p><span class="bodyBlack">
<table width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#e0e0e0"><span class="code-block"><pre>
$ cp $OPENEJB_HOME/dist/openejb_loader-0.9.0.war webapps/</pre></span></td></tr></table>
</span></p>
<p><span class="bodyBlack">
That's it. Tomcat is now fully configured to work with OpenEJB. Don't forget to start up OpenEJB instance
if the factory's been configured with RemoteInitialContextFactory.
</span></p>
<a name="example"><h2>Example application</h2></a>
<p><span class="bodyBlack">
You can use the OpenEJB Hello World as an
example EJB to test things out. You won't
need to do anything differently. Deploy
the myHelloEjb.jar just as described in
<a href="http://www.openejb.org/hello-world.html" target="_blank">http://www.openejb.org/hello-world.html</a>
</span></p>
<p><span class="bodyBlack">
Register the factory in Tomcat by editing server.xml, i.e. add the above Ejb element declaration
between Context's tags of Tomcat's default <i>example</i> web application. Place the JSP - openejb.jsp -
in $CATALINA_HOME/webapps/examples directory.
</span></p>
<p><span class="bodyBlack">Start up Tomcat and enter <a href="http://localhost:8080/examples/openejb.jsp" target="_blank">http://localhost:8080/examples/openejb.jsp</a>. As a result, you should
see "Hello World!!!!!" on the screen.
</span></p>
<p><span class="bodyBlack">Tomcat should print out the following on its console (note OpenEJB messages about its startup):</span></p>
<table width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#e0e0e0"><span class="code-block"><pre>
Using CATALINA_BASE: C:\_Jacek\apps\jakarta-tomcat-4.1.18
Using CATALINA_HOME: C:\_Jacek\apps\jakarta-tomcat-4.1.18
Using CATALINA_TMPDIR: C:\_Jacek\apps\jakarta-tomcat-4.1.18\temp
Using JAVA_HOME: C:\_JACEK\APPS\JDK1.3.1
[INFO] Registry - -Loading registry information
[INFO] Registry - -Creating new Registry instance
[INFO] Registry - -Creating MBeanServer
[INFO] Http11Protocol - -Initializing Coyote HTTP/1.1 on port 8080
Starting service Tomcat-Standalone
Apache Tomcat/4.1.18
OpenEJB 0.9.0 build: 20030118-2205
http://openejb.sf.net
[INFO] Http11Protocol - -Starting Coyote HTTP/1.1 on port 8080
[INFO] ChannelSocket - -JK2: ajp13 listening on 0.0.0.0/0.0.0.0:8009
[INFO] JkMain - -Jk running ID=0 time=30/241
config=C:\_Jacek\apps\jakarta-tomcat-4.1.18\conf\jk2.properties</pre></span></td></tr></table>
</td><td align="left" valign="top" height="5" width="120"><img src="images/diagram-tomcat-adapter.gif" width="240" height="500" border="0"><br>
&nbsp;
</td></tr><tr height="5"><td align="left" valign="top" bgcolor="#7270c2" height="5" width="20">&nbsp;</td><td valign="top" bgcolor="#7270c2" height="5" width="95">&nbsp;</td><td align="left" valign="top" bgcolor="#a9a5de" height="5" width="7">&nbsp;</td><td align="left" valign="top" height="5" width="40">&nbsp;</td><td align="left" valign="top" height="5" width="120">&nbsp;</td></tr><tr><td align="left" valign="top" bgcolor="#7270c2" height="5" width="20">&nbsp;</td><td align="left" valign="top" bgcolor="#7270c2" width="95">&nbsp;</td><td align="left" valign="top" bgcolor="#a9a5de" width="7"><img border="0" height="25" width="1" src="images/dotTrans.gif"></td><td align="left" valign="top" width="40"><img border="0" height="25" width="1" src="images/dotTrans.gif"></td><td align="left" valign="top" width="120">&nbsp;</td></tr><tr height="5"><td align="left" valign="bottom" bgcolor="#7270c2" height="100%" rowspan="2" width="20"><img border="0" height="125" width="20" src="images/stripes1.gif"></td><td align="left" valign="bottom" bgcolor="#7270c2" height="100%" rowspan="2" width="95"><img border="0" height="125" width="105" src="images/stripe105.gif"></td><td align="left" valign="top" bgcolor="#a9a5de" height="100%" rowspan="2" width="7">&nbsp;</td><td align="left" valign="top" height="100%" width="40">&nbsp;</td><td align="left" valign="top" height="100%" width="120">&nbsp;</td></tr><tr height="5"><td align="left" valign="top" height="25" width="40">&nbsp;</td><td align="left" valign="bottom" height="25" width="430"><br><br><img height="3" width="430" border="0" src="images/line_light.gif"><br><p></p><span class="bodyGrey"><small><notice>
OpenEJB is a trademark of the OpenEJB Group.
Java, EJB, JDBC, JNDI, JTA, Sun, Sun Microsystems are trademarks or registered
trademarks of Sun Microsystems, Inc. in the United States and in other
countries. XML, XML Schema, XSLT and related standards are trademarks or registered
trademarks of MIT, INRIA, Keio or others, and a product of the World Wide Web
Consortium. All other product names mentioned herein are trademarks of their respective
owners.
</notice><br>&nbsp;<br></small></span><p></p>
&nbsp;
</td><td align="left" valign="top" height="25" width="120">&nbsp;</td></tr></table></body></html>