| 1 | <html><head><META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><title>Apache Tomcat 6.0 - JNDI Resources HOW-TO</title><meta value="Craig R. McClanahan" name="author"><meta value="craigmcc@apache.org" name="email"><meta value="Yoav Shapira" name="author"><meta value="yoavs@apache.org" name="email"></head><body vlink="#525D76" alink="#525D76" link="#525D76" text="#000000" bgcolor="#ffffff"><table cellspacing="0" width="100%" border="0"><!--PAGE HEADER--><tr><td><!--PROJECT LOGO--><a href="http://tomcat.apache.org/"><img border="0" alt=" | 
|---|
| 2 |       The Apache Tomcat Servlet/JSP Container | 
|---|
| 3 |     " align="right" src="./images/tomcat.gif"></a></td><td><font face="arial,helvetica,sanserif"><h1>Apache Tomcat 6.0</h1></font></td><td><!--APACHE LOGO--><a href="http://www.apache.org/"><img border="0" alt="Apache Logo" align="right" src="./images/asf-logo.gif"></a></td></tr></table><table cellspacing="4" width="100%" border="0"><!--HEADER SEPARATOR--><tr><td colspan="2"><hr size="1" noshade></td></tr><tr><!--LEFT SIDE NAVIGATION--><td nowrap="true" valign="top" width="20%"><p><strong>Links</strong></p><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li></ul><p><strong>User Guide</strong></p><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="realm-howto.html">6) Realms and AAA</a></li><li><a href="security-manager-howto.html">7) Security Manager</a></li><li><a href="jndi-resources-howto.html">8) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">9) JDBC DataSources</a></li><li><a href="class-loader-howto.html">10) Classloading</a></li><li><a href="jasper-howto.html">11) JSPs</a></li><li><a href="ssl-howto.html">12) SSL</a></li><li><a href="ssi-howto.html">13) SSI</a></li><li><a href="cgi-howto.html">14) CGI</a></li><li><a href="proxy-howto.html">15) Proxy Support</a></li><li><a href="mbeans-descriptor-howto.html">16) MBean Descriptor</a></li><li><a href="default-servlet.html">17) Default Servlet</a></li><li><a href="cluster-howto.html">18) Clustering</a></li><li><a href="balancer-howto.html">19) Load Balancer</a></li><li><a href="connectors.html">20) Connectors</a></li><li><a href="monitoring.html">21) Monitoring and Management</a></li><li><a href="logging.html">22) Logging</a></li><li><a href="apr.html">23) APR/Native</a></li><li><a href="virtual-hosting-howto.html">24) Virtual Hosting</a></li><li><a href="aio.html">25) Advanced IO</a></li><li><a href="extras.html">26) Additional Components</a></li><li><a href="maven-jars.html">27) Mavenized</a></li></ul><p><strong>Reference</strong></p><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul><p><strong>Apache Tomcat Development</strong></p><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li></ul></td><!--RIGHT SIDE MAIN BODY--><td align="left" valign="top" width="80%"><table cellspacing="4" width="100%" border="0"><tr><td valign="top" align="left"><h1>Apache Tomcat 6.0</h1><h2>JNDI Resources HOW-TO</h2></td><td nowrap="true" valign="top" align="right"><small><a href="printer/jndi-resources-howto.html"><img alt="Printer Friendly Version" border="0" src="./images/printer.gif"><br>print-friendly<br>version | 
|---|
| 4 |                     </a></small></td></tr></table><table cellpadding="2" cellspacing="0" border="0"><tr><td bgcolor="#525D76"><font face="arial,helvetica.sanserif" color="#ffffff"><a name="Introduction"><strong>Introduction</strong></a></font></td></tr><tr><td><blockquote> | 
|---|
| 5 |  | 
|---|
| 6 | <p>Tomcat 6 provides a JNDI <strong>InitialContext</strong> implementation | 
|---|
| 7 | instance for each web application running under it, in a manner that is  | 
|---|
| 8 | compatible with those provided by a  | 
|---|
| 9 | <a href="http://java.sun.com/j2ee">Java2 Enterprise Edition</a> application  | 
|---|
| 10 | server.  | 
|---|
| 11 |  | 
|---|
| 12 | The J2EE standard provides a standard set of elements in  | 
|---|
| 13 | the <code>/WEB-INF/web.xml</code> file to reference resources; resources  | 
|---|
| 14 | referenced in these elements must be defined in an application-server-specific | 
|---|
| 15 | configuration.  | 
|---|
| 16 | </p> | 
|---|
| 17 |  | 
|---|
| 18 | <p>For Tomcat 6, these entries in per-web-application  | 
|---|
| 19 | <code>InitialContext</code> are configured in the  | 
|---|
| 20 | <a href="config/context.html"><code><Context></code></a> elements that | 
|---|
| 21 | can be specified in either <code>$CATALINA_BASE/conf/server.xml</code> or, | 
|---|
| 22 | preferably, the per-web-application context XML file ( | 
|---|
| 23 | <code>META-INF/context.xml</code>). | 
|---|
| 24 | </p> | 
|---|
| 25 |  | 
|---|
| 26 | <p>Tomcat 6 maintains a separate namespace of global resources for the  | 
|---|
| 27 | entire server.  These are configured in the  | 
|---|
| 28 | <a href="config/globalresources.html"> | 
|---|
| 29 | <code><strong><GlobalNameingResources></strong></code></a> element of  | 
|---|
| 30 | <code>$CATALINA_BASE/conf/server.xml</code>. You may expose these resources to  | 
|---|
| 31 | web applications by using  | 
|---|
| 32 | <code><strong><ResourceLink></strong></code> elements. | 
|---|
| 33 | </p> | 
|---|
| 34 |  | 
|---|
| 35 | <p>The resources defined in these elements | 
|---|
| 36 | may be referenced by the following elements in the web application deployment | 
|---|
| 37 | descriptor (<code>/WEB-INF/web.xml</code>) of your web application:</p> | 
|---|
| 38 | <ul> | 
|---|
| 39 | <li><code><strong><env-entry></strong></code> - Environment entry, a | 
|---|
| 40 |     single-value parameter that can be used to configure how the application | 
|---|
| 41 |     will operate.</li> | 
|---|
| 42 | <li><code><strong><resource-ref></strong></code> - Resource reference, | 
|---|
| 43 |     which is typically to an object factory for resources such as a JDBC | 
|---|
| 44 |     <code>DataSource</code>, a JavaMail <code>Session</code>, or custom | 
|---|
| 45 |     object factories configured into Tomcat 6.</li> | 
|---|
| 46 | <li><code><strong><resource-env-ref></strong></code> - Resource | 
|---|
| 47 |     environment reference, a new variation of <code>resource-ref</code> | 
|---|
| 48 |     added in Servlet 2.4 that is simpler to configure for resources | 
|---|
| 49 |     that do not require authentication information.</li> | 
|---|
| 50 | </ul> | 
|---|
| 51 |  | 
|---|
| 52 | <p>The <code>InitialContext</code> is configured as a web application is | 
|---|
| 53 | initially deployed, and is made available to web application components (for | 
|---|
| 54 | read-only access).  All configured entries and resources are placed in | 
|---|
| 55 | the <code>java:comp/env</code> portion of the JNDI namespace, so a typical | 
|---|
| 56 | access to a resource - in this case, to a JDBC <code>DataSource</code> - | 
|---|
| 57 | would look something like this:</p> | 
|---|
| 58 |  | 
|---|
| 59 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 60 | // Obtain our environment naming context | 
|---|
| 61 | Context initCtx = new InitialContext(); | 
|---|
| 62 | Context envCtx = (Context) initCtx.lookup("java:comp/env"); | 
|---|
| 63 |  | 
|---|
| 64 | // Look up our data source | 
|---|
| 65 | DataSource ds = (DataSource) | 
|---|
| 66 |   envCtx.lookup("jdbc/EmployeeDB"); | 
|---|
| 67 |  | 
|---|
| 68 | // Allocate and use a connection from the pool | 
|---|
| 69 | Connection conn = ds.getConnection(); | 
|---|
| 70 | ... use this connection to access the database ... | 
|---|
| 71 | conn.close(); | 
|---|
| 72 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 73 |  | 
|---|
| 74 | <p>See the following Specifications for more information about programming APIs | 
|---|
| 75 | for JNDI, and for the features supported by Java2 Enterprise Edition (J2EE) | 
|---|
| 76 | servers, which Tomcat emulates for the services that it provides:</p> | 
|---|
| 77 | <ul> | 
|---|
| 78 | <li><a href="http://java.sun.com/products/jndi">Java Naming and Directory | 
|---|
| 79 |     Interface</a> (included in JDK 1.4 onwards)</li> | 
|---|
| 80 | <li><a href="http://java.sun.com/j2ee/download.html">J2EE Platform | 
|---|
| 81 |     Specification</a> (in particular, see Chapter 5 on <em>Naming</em>)</li> | 
|---|
| 82 | </ul> | 
|---|
| 83 |  | 
|---|
| 84 | </blockquote></td></tr></table><table cellpadding="2" cellspacing="0" border="0"><tr><td bgcolor="#525D76"><font face="arial,helvetica.sanserif" color="#ffffff"><a name="Configuring JNDI Resources"><strong>Configuring JNDI Resources</strong></a></font></td></tr><tr><td><blockquote> | 
|---|
| 85 |  | 
|---|
| 86 | <p>Each available JNDI Resource is configured based on inclusion of the | 
|---|
| 87 | following elements in the | 
|---|
| 88 | <a href="config/context.html"><code><Context></code></a> element:</p> | 
|---|
| 89 |  | 
|---|
| 90 | <ul> | 
|---|
| 91 | <li><a href="config/context.html#Environment Entries"><Environment></a> - | 
|---|
| 92 |     Configure names and values for scalar environment entries that will be | 
|---|
| 93 |     exposed to the web application through the JNDI | 
|---|
| 94 |     <code>InitialContext</code> (equivalent to the inclusion of an | 
|---|
| 95 |     <code><env-entry></code> element in the web application | 
|---|
| 96 |     deployment descriptor).</li> | 
|---|
| 97 | <li><a href="config/context.html#Resource Definitions"><Resource></a> - | 
|---|
| 98 |     Configure the name and data type of a resource made available to the | 
|---|
| 99 |     application (equivalent to the inclusion of a | 
|---|
| 100 |     <code><resource-ref></code> element in the web application | 
|---|
| 101 |     deployment descriptor).</li> | 
|---|
| 102 | <li><a href="config/context.html#Resource Links"><ResourceLink></a> - | 
|---|
| 103 |     Add a link to a resource defined in the global JNDI context. Use resource  | 
|---|
| 104 |     links to give a web application access to a resource defined in  | 
|---|
| 105 |     the<a href="config/globalresources.html"><GlobalNamingResources></a> | 
|---|
| 106 |     child element of the <a href="config/server.html"><Server></a> | 
|---|
| 107 |     element.</li> | 
|---|
| 108 | <li><a href="config/context.html#Transaction"><Transaction></a> - | 
|---|
| 109 |     Add a resource factory for instantiating the UserTransaction object  | 
|---|
| 110 |     instance that is available at <code>java:comp/UserTransaction</code>.</li> | 
|---|
| 111 |  | 
|---|
| 112 | </ul> | 
|---|
| 113 |  | 
|---|
| 114 | <p>Any number of these elements may be nested inside a | 
|---|
| 115 | <a href="config/context.html"><code><Context></code></a> element (to be | 
|---|
| 116 | associated only with that particular web application).</p> | 
|---|
| 117 |  | 
|---|
| 118 | <p>In addition, the names and values of all <code><env-entry></code> | 
|---|
| 119 | elements included in the web application deployment descriptor | 
|---|
| 120 | (<code>/WEB-INF/web.xml</code>) are configured into the initial context as | 
|---|
| 121 | well, overriding corresponding values from the | 
|---|
| 122 | <a href="config/context.html"><code><Context></code></a> element | 
|---|
| 123 | <strong>only</strong> if allowed by the corresponding | 
|---|
| 124 | <code><Environment></code> element (by setting the <code>override</code> | 
|---|
| 125 | attribute to "true").</p> | 
|---|
| 126 |  | 
|---|
| 127 | <p>Global resources can be defined in the server-wide JNDI context, by adding | 
|---|
| 128 | the resource elements described above to the | 
|---|
| 129 | <a href="config/globalresources.html"><GlobalNamingResources></a> | 
|---|
| 130 | child element of the <a href="config/server.html"><Server></a> | 
|---|
| 131 | element and using a  | 
|---|
| 132 | <a href="config/context.html#Resource Links"><ResourceLink></a> to | 
|---|
| 133 | include it in the per-web-application context.</p> | 
|---|
| 134 |  | 
|---|
| 135 | </blockquote></td></tr></table><table cellpadding="2" cellspacing="0" border="0"><tr><td bgcolor="#525D76"><font face="arial,helvetica.sanserif" color="#ffffff"><a name="Tomcat Standard Resource Factories"><strong>Tomcat Standard Resource Factories</strong></a></font></td></tr><tr><td><blockquote> | 
|---|
| 136 |  | 
|---|
| 137 |   <p>Tomcat 6 includes a series of standard resource factories that can | 
|---|
| 138 |   provide services to your web applications, but give you configuration | 
|---|
| 139 |   flexibility (via the | 
|---|
| 140 |   <a href="config/context.html"><code><Context></code></a> element) | 
|---|
| 141 |   without modifying the web application or the deployment descriptor. Each | 
|---|
| 142 |   subsection below details the configuration and usage of the standard resource | 
|---|
| 143 |   factories.</p> | 
|---|
| 144 |  | 
|---|
| 145 |   <p>See <a href="#Adding Custom Resource Factories">Adding Custom | 
|---|
| 146 |   Resource Factories</a> for information about how to create, install, | 
|---|
| 147 |   configure, and use your own custom resource factory classes with | 
|---|
| 148 |   Tomcat 6.</p> | 
|---|
| 149 |  | 
|---|
| 150 |   <p><em>NOTE</em> - Of the standard resource factories, only the | 
|---|
| 151 |   "JDBC Data Source" and "User Transaction" factories are mandated to | 
|---|
| 152 |   be available on other platforms, and then they are required only if | 
|---|
| 153 |   the platform implements the Java2 Enterprise Edition (J2EE) specs. | 
|---|
| 154 |   All other standard resource factories, plus custom resource factories | 
|---|
| 155 |   that you write yourself, are specific to Tomcat and cannot be assumed | 
|---|
| 156 |   to be available on other containers.</p> | 
|---|
| 157 |  | 
|---|
| 158 |   <table cellpadding="2" cellspacing="0" border="0"><tr><td bgcolor="#828DA6"><font face="arial,helvetica.sanserif" color="#ffffff"><a name="Generic JavaBean Resources"><strong>Generic JavaBean Resources</strong></a></font></td></tr><tr><td><blockquote> | 
|---|
| 159 |  | 
|---|
| 160 |     <h3>0.  Introduction</h3> | 
|---|
| 161 |  | 
|---|
| 162 |     <p>This resource factory can be used to create objects of <em>any</em> | 
|---|
| 163 |     Java class that conforms to standard JavaBeans naming conventions (i.e. | 
|---|
| 164 |     it has a zero-arguments constructor, and has property setters that | 
|---|
| 165 |     conform to the setFoo() naming pattern.  The resource factory will | 
|---|
| 166 |     create a new instance of the appropriate bean class every time a | 
|---|
| 167 |     <code>lookup()</code> for this entry is made.</p> | 
|---|
| 168 |  | 
|---|
| 169 |     <p>The steps required to use this facility are described below.</p> | 
|---|
| 170 |  | 
|---|
| 171 |     <h3>1.  Create Your JavaBean Class</h3> | 
|---|
| 172 |  | 
|---|
| 173 |     <p>Create the JavaBean class which will be instantiated each time | 
|---|
| 174 |     that the resource factory is looked up.  For this example, assume | 
|---|
| 175 |     you create a class <code>com.mycompany.MyBean</code>, which looks | 
|---|
| 176 |     like this:</p> | 
|---|
| 177 |  | 
|---|
| 178 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 179 | package com.mycompany; | 
|---|
| 180 |  | 
|---|
| 181 | public class MyBean { | 
|---|
| 182 |  | 
|---|
| 183 |   private String foo = "Default Foo"; | 
|---|
| 184 |  | 
|---|
| 185 |   public String getFoo() { | 
|---|
| 186 |     return (this.foo); | 
|---|
| 187 |   } | 
|---|
| 188 |  | 
|---|
| 189 |   public void setFoo(String foo) { | 
|---|
| 190 |     this.foo = foo; | 
|---|
| 191 |   } | 
|---|
| 192 |  | 
|---|
| 193 |   private int bar = 0; | 
|---|
| 194 |  | 
|---|
| 195 |   public int getBar() { | 
|---|
| 196 |     return (this.bar); | 
|---|
| 197 |   } | 
|---|
| 198 |  | 
|---|
| 199 |   public void setBar(int bar) { | 
|---|
| 200 |     this.bar = bar; | 
|---|
| 201 |   } | 
|---|
| 202 |  | 
|---|
| 203 |  | 
|---|
| 204 | } | 
|---|
| 205 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 206 |  | 
|---|
| 207 |   <h3>2.  Declare Your Resource Requirements</h3> | 
|---|
| 208 |  | 
|---|
| 209 |   <p>Next, modify your web application deployment descriptor | 
|---|
| 210 |   (<code>/WEB-INF/web.xml</code>) to declare the JNDI name under which | 
|---|
| 211 |   you will request new instances of this bean.  The simplest approach is | 
|---|
| 212 |   to use a <code><resource-env-ref></code> element, like this:</p> | 
|---|
| 213 |  | 
|---|
| 214 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 215 | <resource-env-ref> | 
|---|
| 216 |   <description> | 
|---|
| 217 |     Object factory for MyBean instances. | 
|---|
| 218 |   </description> | 
|---|
| 219 |   <resource-env-ref-name> | 
|---|
| 220 |     bean/MyBeanFactory | 
|---|
| 221 |   </resource-env-ref-name> | 
|---|
| 222 |   <resource-env-ref-type> | 
|---|
| 223 |     com.mycompany.MyBean | 
|---|
| 224 |   </resource-env-ref-type> | 
|---|
| 225 | </resource-env-ref> | 
|---|
| 226 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 227 |  | 
|---|
| 228 |     <p><strong>WARNING</strong> - Be sure you respect the element ordering | 
|---|
| 229 |     that is required by the DTD for web application deployment descriptors! | 
|---|
| 230 |     See the | 
|---|
| 231 |     <a href="http://java.sun.com/products/servlet/download.html">Servlet | 
|---|
| 232 |     Specification</a> for details.</p> | 
|---|
| 233 |  | 
|---|
| 234 |   <h3>3.  Code Your Application's Use Of This Resource</h3> | 
|---|
| 235 |  | 
|---|
| 236 |   <p>A typical use of this resource environment reference might look | 
|---|
| 237 |   like this:</p> | 
|---|
| 238 |  | 
|---|
| 239 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 240 | Context initCtx = new InitialContext(); | 
|---|
| 241 | Context envCtx = (Context) initCtx.lookup("java:comp/env"); | 
|---|
| 242 | MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory"); | 
|---|
| 243 |  | 
|---|
| 244 | writer.println("foo = " + bean.getFoo() + ", bar = " + | 
|---|
| 245 |                bean.getBar()); | 
|---|
| 246 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 247 |  | 
|---|
| 248 |     <h3>4.  Configure Tomcat's Resource Factory</h3> | 
|---|
| 249 |  | 
|---|
| 250 |     <p>To configure Tomcat's resource factory, add an element like this to the | 
|---|
| 251 |     <a href="config/context.html"><code><Context></code></a> element for | 
|---|
| 252 |     this web application.</p> | 
|---|
| 253 |  | 
|---|
| 254 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 255 | <Context ...> | 
|---|
| 256 |   ... | 
|---|
| 257 |   <Resource name="bean/MyBeanFactory" auth="Container" | 
|---|
| 258 |             type="com.mycompany.MyBean" | 
|---|
| 259 |             factory="org.apache.naming.factory.BeanFactory" | 
|---|
| 260 |             bar="23"/> | 
|---|
| 261 |   ... | 
|---|
| 262 | </Context> | 
|---|
| 263 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 264 |  | 
|---|
| 265 |     <p>Note that the resource name (here, <code>bean/MyBeanFactory</code> | 
|---|
| 266 |     must match the value specified in the web application deployment | 
|---|
| 267 |     descriptor.  We are also initializing the value of the <code>bar</code> | 
|---|
| 268 |     property, which will cause <code>setBar(23)</code> to be called before | 
|---|
| 269 |     the new bean is returned.  Because we are not initializing the | 
|---|
| 270 |     <code>foo</code> property (although we could have), the bean will | 
|---|
| 271 |     contain whatever default value is set up by its constructor.</p> | 
|---|
| 272 |  | 
|---|
| 273 |   </blockquote></td></tr></table> | 
|---|
| 274 |  | 
|---|
| 275 |  | 
|---|
| 276 |   <table cellpadding="2" cellspacing="0" border="0"><tr><td bgcolor="#828DA6"><font face="arial,helvetica.sanserif" color="#ffffff"><a name="JavaMail Sessions"><strong>JavaMail Sessions</strong></a></font></td></tr><tr><td><blockquote> | 
|---|
| 277 |  | 
|---|
| 278 |     <h3>0.  Introduction</h3> | 
|---|
| 279 |  | 
|---|
| 280 |     <p>In many web applications, sending electronic mail messages is a | 
|---|
| 281 |     required part of the system's functionality.  The | 
|---|
| 282 |     <a href="http://java.sun.com/products/javamail">Java Mail</a> API | 
|---|
| 283 |     makes this process relatively straightforward, but requires many | 
|---|
| 284 |     configuration details that the client application must be aware of | 
|---|
| 285 |     (including the name of the SMTP host to be used for message sending).</p> | 
|---|
| 286 |  | 
|---|
| 287 |     <p>Tomcat 6 includes a standard resource factory that will create | 
|---|
| 288 |     <code>javax.mail.Session</code> session instances for you, already | 
|---|
| 289 |     configured to connect to an SMTP server. | 
|---|
| 290 |     In this way, the application is totally insulated from changes in the | 
|---|
| 291 |     email server configuration environment - it simply asks for, and receives, | 
|---|
| 292 |     a preconfigured session whenever needed.</p> | 
|---|
| 293 |  | 
|---|
| 294 |     <p>The steps required for this are outlined below.</p> | 
|---|
| 295 |  | 
|---|
| 296 |     <h3>1.  Declare Your Resource Requirements</h3> | 
|---|
| 297 |  | 
|---|
| 298 |     <p>The first thing you should do is modify the web application deployment | 
|---|
| 299 |     descriptor (<code>/WEB-INF/web.xml</code>) to declare the JNDI name under | 
|---|
| 300 |     which you will look up preconfigured sessions.  By convention, all such | 
|---|
| 301 |     names should resolve to the <code>mail</code> subcontext (relative to the | 
|---|
| 302 |     standard <code>java:comp/env</code> naming context that is the root of | 
|---|
| 303 |     all provided resource factories.  A typical <code>web.xml</code> entry | 
|---|
| 304 |     might look like this:</p> | 
|---|
| 305 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 306 | <resource-ref> | 
|---|
| 307 |   <description> | 
|---|
| 308 |     Resource reference to a factory for javax.mail.Session | 
|---|
| 309 |     instances that may be used for sending electronic mail | 
|---|
| 310 |     messages, preconfigured to connect to the appropriate | 
|---|
| 311 |     SMTP server. | 
|---|
| 312 |   </description> | 
|---|
| 313 |   <res-ref-name> | 
|---|
| 314 |     mail/Session | 
|---|
| 315 |   </res-ref-name> | 
|---|
| 316 |   <res-type> | 
|---|
| 317 |     javax.mail.Session | 
|---|
| 318 |   </res-type> | 
|---|
| 319 |   <res-auth> | 
|---|
| 320 |     Container | 
|---|
| 321 |   </res-auth> | 
|---|
| 322 | </resource-ref> | 
|---|
| 323 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 324 |  | 
|---|
| 325 |     <p><strong>WARNING</strong> - Be sure you respect the element ordering | 
|---|
| 326 |     that is required by the DTD for web application deployment descriptors! | 
|---|
| 327 |     See the | 
|---|
| 328 |     <a href="http://java.sun.com/products/servlet/download.html">Servlet | 
|---|
| 329 |     Specification</a> for details.</p> | 
|---|
| 330 |  | 
|---|
| 331 |     <h3>2.  Code Your Application's Use Of This Resource</h3> | 
|---|
| 332 |  | 
|---|
| 333 |     <p>A typical use of this resource reference might look like this:</p> | 
|---|
| 334 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 335 | Context initCtx = new InitialContext(); | 
|---|
| 336 | Context envCtx = (Context) initCtx.lookup("java:comp/env"); | 
|---|
| 337 | Session session = (Session) envCtx.lookup("mail/Session"); | 
|---|
| 338 |  | 
|---|
| 339 | Message message = new MimeMessage(session); | 
|---|
| 340 | message.setFrom(new InternetAddress(request.getParameter("from")); | 
|---|
| 341 | InternetAddress to[] = new InternetAddress[1]; | 
|---|
| 342 | to[0] = new InternetAddress(request.getParameter("to")); | 
|---|
| 343 | message.setRecipients(Message.RecipientType.TO, to); | 
|---|
| 344 | message.setSubject(request.getParameter("subject")); | 
|---|
| 345 | message.setContent(request.getParameter("content"), "text/plain"); | 
|---|
| 346 | Transport.send(message); | 
|---|
| 347 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 348 |  | 
|---|
| 349 |     <p>Note that the application uses the same resource reference name | 
|---|
| 350 |     that was declared in the web application deployment descriptor.  This | 
|---|
| 351 |     is matched up against the resource factory that is configured in the | 
|---|
| 352 |     <a href="config/context.html"><code><Context></code></a> element | 
|---|
| 353 |     for the web application as described below.</p> | 
|---|
| 354 |  | 
|---|
| 355 |     <h3>3.  Configure Tomcat's Resource Factory</h3> | 
|---|
| 356 |  | 
|---|
| 357 |     <p>To configure Tomcat's resource factory, add an elements like this to the | 
|---|
| 358 |     <a href="config/context.html"><code><Context></code></a> element for | 
|---|
| 359 |     this web application.</p> | 
|---|
| 360 |  | 
|---|
| 361 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 362 | <Context ...> | 
|---|
| 363 |   ... | 
|---|
| 364 |   <Resource name="mail/Session" auth="Container" | 
|---|
| 365 |             type="javax.mail.Session" | 
|---|
| 366 |             mail.smtp.host="localhost"/> | 
|---|
| 367 |   ... | 
|---|
| 368 | </Context> | 
|---|
| 369 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 370 |  | 
|---|
| 371 |     <p>Note that the resource name (here, <code>mail/Session</code>) must | 
|---|
| 372 |     match the value specified in the web application deployment descriptor. | 
|---|
| 373 |     Customize the value of the <code>mail.smtp.host</code> parameter to | 
|---|
| 374 |     point at the server that provides SMTP service for your network.</p> | 
|---|
| 375 |  | 
|---|
| 376 |     <h3>4.  Install the JavaMail libraries</h3> | 
|---|
| 377 |  | 
|---|
| 378 |     <p><a href="http://java.sun.com/products/javamail/downloads/index.html"> | 
|---|
| 379 |     Download the JavaMail API</a>.  The JavaMail API requires the Java Activation | 
|---|
| 380 |     Framework (JAF) API as well.  The Java Activation Framework can be downloaded | 
|---|
| 381 |     from <a href="http://java.sun.com/products/javabeans/glasgow/jaf.html">Sun's site</a>. | 
|---|
| 382 |     </p> | 
|---|
| 383 |  | 
|---|
| 384 |     <p>This download includes 2 vital libraries for the configuration;  | 
|---|
| 385 |     activation.jar and mail.jar. Unpackage both distributions and place  | 
|---|
| 386 |     them into $CATALINA_HOME/lib so that they are available to | 
|---|
| 387 |     Tomcat during the initialization of the mail Session Resource. | 
|---|
| 388 |     <strong>Note:</strong> placing these jars in both $CATALINA_HOME/lib and a  | 
|---|
| 389 |     web application's lib folder will cause an error, so ensure you have | 
|---|
| 390 |     them in the $CATALINA_HOME/lib location only. | 
|---|
| 391 |     </p> | 
|---|
| 392 |  | 
|---|
| 393 |     <h3>Example Application</h3> | 
|---|
| 394 |  | 
|---|
| 395 |     <p>The <code>/examples</code> application included with Tomcat contains | 
|---|
| 396 |     an example of utilizing this resource factory.  It is accessed via the | 
|---|
| 397 |     "JSP Examples" link.  The source code for the servlet that actually | 
|---|
| 398 |     sends the mail message is in | 
|---|
| 399 |     <code>/WEB-INF/classes/SendMailServlet.java</code>.</p> | 
|---|
| 400 |  | 
|---|
| 401 |     <p><strong>WARNING</strong> - The default configuration assumes that there | 
|---|
| 402 |     is an SMTP server listing on port 25 on <code>localhost</code>. If this is | 
|---|
| 403 |     not the case, edit the | 
|---|
| 404 |     <a href="config/context.html"><code><Context></code></a> element for | 
|---|
| 405 |     this web application and modify the parameter value for the | 
|---|
| 406 |     <code>mail.smtp.host</code> parameter to be the host name of an SMTP server | 
|---|
| 407 |     on your network.</p> | 
|---|
| 408 |  | 
|---|
| 409 |   </blockquote></td></tr></table> | 
|---|
| 410 |  | 
|---|
| 411 |   <table cellpadding="2" cellspacing="0" border="0"><tr><td bgcolor="#828DA6"><font face="arial,helvetica.sanserif" color="#ffffff"><a name="JDBC Data Sources"><strong>JDBC Data Sources</strong></a></font></td></tr><tr><td><blockquote> | 
|---|
| 412 |  | 
|---|
| 413 |     <h3>0.  Introduction</h3> | 
|---|
| 414 |  | 
|---|
| 415 |     <p>Many web applications need to access a database via a JDBC driver, | 
|---|
| 416 |     to support the functionality required by that application.  The J2EE | 
|---|
| 417 |     Platform Specification requires J2EE Application Servers to make | 
|---|
| 418 |     available a <em>DataSource</em> implementation (that is, a connection | 
|---|
| 419 |     pool for JDBC connections) for this purpose.  Tomcat 6 offers exactly | 
|---|
| 420 |     the same support, so that database-based applications you develop on | 
|---|
| 421 |     Tomcat using this service will run unchanged on any J2EE server.</p> | 
|---|
| 422 |  | 
|---|
| 423 |     <p>For information about JDBC, you should consult the following:</p> | 
|---|
| 424 |     <ul> | 
|---|
| 425 |     <li><a href="http://java.sun.com/products/jdbc/">http://java.sun.com/products/jdbc/</a> - | 
|---|
| 426 |         Home page for information about Java Database Connectivity.</li> | 
|---|
| 427 |     <li><a href="http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame.html">http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame.html</a> - | 
|---|
| 428 |         The JDBC 2.1 API Specification.</li> | 
|---|
| 429 |     <li><a href="http://java.sun.com/products/jdbc/jdbc20.stdext.pdf">http://java.sun.com/products/jdbc/jdbc20.stdext.pdf</a> - | 
|---|
| 430 |         The JDBC 2.0 Standard Extension API (including the | 
|---|
| 431 |         <code>javax.sql.DataSource</code> API).  This package is now known | 
|---|
| 432 |         as the "JDBC Optional Package".</li> | 
|---|
| 433 |     <li><a href="http://java.sun.com/j2ee/download.html">http://java.sun.com/j2ee/download.html</a> - | 
|---|
| 434 |         The J2EE Platform Specification (covers the JDBC facilities that | 
|---|
| 435 |         all J2EE platforms must provide to applications).</li> | 
|---|
| 436 |     </ul> | 
|---|
| 437 |  | 
|---|
| 438 |     <p><strong>NOTE</strong> - The default data source support in Tomcat | 
|---|
| 439 |     is based on the <strong>DBCP</strong> connection pool from the | 
|---|
| 440 |     <a href="http://commons.apache.org/">Commons</a> | 
|---|
| 441 |     project.  However, it is possible to use any other connection pool | 
|---|
| 442 |     that implements <code>javax.sql.DataSource</code>, by writing your | 
|---|
| 443 |     own custom resource factory, as described | 
|---|
| 444 |     <a href="#Adding Custom Resource Factories">below</a>.</p> | 
|---|
| 445 |  | 
|---|
| 446 |     <h3>1.  Install Your JDBC Driver</h3> | 
|---|
| 447 |  | 
|---|
| 448 |     <p>Use of the <em>JDBC Data Sources</em> JNDI Resource Factory requires | 
|---|
| 449 |     that you make an appropriate JDBC driver available to both Tomcat internal | 
|---|
| 450 |     classes and to your web application.  This is most easily accomplished by | 
|---|
| 451 |     installing the driver's JAR file(s) into the | 
|---|
| 452 |     <code>$CATALINA_HOME/lib</code> directory, which makes the driver | 
|---|
| 453 |     available both to the resource factory and to your application.</p> | 
|---|
| 454 |  | 
|---|
| 455 |     <h3>2.  Declare Your Resource Requirements</h3> | 
|---|
| 456 |  | 
|---|
| 457 |     <p>Next, modify the web application deployment descriptor | 
|---|
| 458 |     (<code>/WEB-INF/web.xml</code>) to declare the JNDI name under | 
|---|
| 459 |     which you will look up preconfigured data source.  By convention, all such | 
|---|
| 460 |     names should resolve to the <code>jdbc</code> subcontext (relative to the | 
|---|
| 461 |     standard <code>java:comp/env</code> naming context that is the root of | 
|---|
| 462 |     all provided resource factories.  A typical <code>web.xml</code> entry | 
|---|
| 463 |     might look like this:</p> | 
|---|
| 464 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 465 | <resource-ref> | 
|---|
| 466 |   <description> | 
|---|
| 467 |     Resource reference to a factory for java.sql.Connection | 
|---|
| 468 |     instances that may be used for talking to a particular | 
|---|
| 469 |     database that is configured in the <Context> | 
|---|
| 470 |     configurartion for the web application. | 
|---|
| 471 |   </description> | 
|---|
| 472 |   <res-ref-name> | 
|---|
| 473 |     jdbc/EmployeeDB | 
|---|
| 474 |   </res-ref-name> | 
|---|
| 475 |   <res-type> | 
|---|
| 476 |     javax.sql.DataSource | 
|---|
| 477 |   </res-type> | 
|---|
| 478 |   <res-auth> | 
|---|
| 479 |     Container | 
|---|
| 480 |   </res-auth> | 
|---|
| 481 | </resource-ref> | 
|---|
| 482 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 483 |  | 
|---|
| 484 |     <p><strong>WARNING</strong> - Be sure you respect the element ordering | 
|---|
| 485 |     that is required by the DTD for web application deployment descriptors! | 
|---|
| 486 |     See the | 
|---|
| 487 |     <a href="http://java.sun.com/products/servlet/download.html">Servlet | 
|---|
| 488 |     Specification</a> for details.</p> | 
|---|
| 489 |  | 
|---|
| 490 |     <h3>3.  Code Your Application's Use Of This Resource</h3> | 
|---|
| 491 |  | 
|---|
| 492 |     <p>A typical use of this resource reference might look like this:</p> | 
|---|
| 493 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 494 | Context initCtx = new InitialContext(); | 
|---|
| 495 | Context envCtx = (Context) initCtx.lookup("java:comp/env"); | 
|---|
| 496 | DataSource ds = (DataSource) | 
|---|
| 497 |   envCtx.lookup("jdbc/EmployeeDB"); | 
|---|
| 498 |  | 
|---|
| 499 | Connection conn = ds.getConnection(); | 
|---|
| 500 | ... use this connection to access the database ... | 
|---|
| 501 | conn.close(); | 
|---|
| 502 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 503 |  | 
|---|
| 504 |     <p>Note that the application uses the same resource reference name that was | 
|---|
| 505 |     declared in the web application deployment descriptor. This is matched up | 
|---|
| 506 |     against the resource factory that is configured in the | 
|---|
| 507 |     <a href="config/context.html"><code><Context></code></a> element for | 
|---|
| 508 |     the web application as described below.</p> | 
|---|
| 509 |  | 
|---|
| 510 |     <h3>4.  Configure Tomcat's Resource Factory</h3> | 
|---|
| 511 |  | 
|---|
| 512 |     <p>To configure Tomcat's resource factory, add an element like this to the | 
|---|
| 513 |     <a href="config/context.html"><code><Context></code></a> element for | 
|---|
| 514 |     the web application.</p> | 
|---|
| 515 |  | 
|---|
| 516 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 517 | <Context ...> | 
|---|
| 518 |   ... | 
|---|
| 519 |   <Resource name="jdbc/EmployeeDB" | 
|---|
| 520 |             auth="Container" | 
|---|
| 521 |             type="javax.sql.DataSource" | 
|---|
| 522 |             username="dbusername" | 
|---|
| 523 |             password="dbpassword" | 
|---|
| 524 |             driverClassName="org.hsql.jdbcDriver" | 
|---|
| 525 |             url="jdbc:HypersonicSQL:database" | 
|---|
| 526 |             maxActive="8" | 
|---|
| 527 |             maxIdle="4"/> | 
|---|
| 528 |   ... | 
|---|
| 529 | </Context> | 
|---|
| 530 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 531 |  | 
|---|
| 532 |     <p>Note that the resource name (here, <code>jdbc/EmployeeDB</code>) must | 
|---|
| 533 |     match the value specified in the web application deployment descriptor.</p> | 
|---|
| 534 |  | 
|---|
| 535 |     <p>This example assumes that you are using the HypersonicSQL database | 
|---|
| 536 |     JDBC driver.  Customize the <code>driverClassName</code> and | 
|---|
| 537 |     <code>driverName</code> parameters to match your actual database's | 
|---|
| 538 |     JDBC driver and connection URL.</p> | 
|---|
| 539 |  | 
|---|
| 540 |     <p>The configuration properties for Tomcat's standard data source | 
|---|
| 541 |     resource factory | 
|---|
| 542 |     (<code>org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory</code>) are | 
|---|
| 543 |     as follows:</p> | 
|---|
| 544 |     <ul> | 
|---|
| 545 |     <li><strong>driverClassName</strong> - Fully qualified Java class name | 
|---|
| 546 |         of the JDBC driver to be used.</li> | 
|---|
| 547 |     <li><strong>maxActive</strong> - The maximum number of active instances | 
|---|
| 548 |         that can be allocated from this pool at the same time.</li> | 
|---|
| 549 |     <li><strong>maxIdle</strong> - The maximum number of connections that | 
|---|
| 550 |         can sit idle in this pool at the same time.</li> | 
|---|
| 551 |     <li><strong>maxWait</strong> - The maximum number of milliseconds that the | 
|---|
| 552 |         pool will wait (when there are no available connections) for a | 
|---|
| 553 |         connection to be returned before throwing an exception.</li> | 
|---|
| 554 |     <li><strong>password</strong> - Database password to be passed to our | 
|---|
| 555 |         JDBC driver.</li> | 
|---|
| 556 |     <li><strong>url</strong> - Connection URL to be passed to our JDBC driver. | 
|---|
| 557 |         (For backwards compatibility, the property <code>driverName</code> | 
|---|
| 558 |         is also recognized.)</li> | 
|---|
| 559 |     <li><strong>user</strong> - Database username to be passed to our | 
|---|
| 560 |         JDBC driver.</li> | 
|---|
| 561 |     <li><strong>validationQuery</strong> - SQL query that can be used by the | 
|---|
| 562 |         pool to validate connections before they are returned to the | 
|---|
| 563 |         application.  If specified, this query MUST be an SQL SELECT | 
|---|
| 564 |         statement that returns at least one row.</li> | 
|---|
| 565 |     </ul> | 
|---|
| 566 |     <p>For more details, please refer to the commons-dbcp documentation.</p> | 
|---|
| 567 |  | 
|---|
| 568 |   </blockquote></td></tr></table> | 
|---|
| 569 |  | 
|---|
| 570 | </blockquote></td></tr></table><table cellpadding="2" cellspacing="0" border="0"><tr><td bgcolor="#525D76"><font face="arial,helvetica.sanserif" color="#ffffff"><a name="Adding Custom Resource Factories"><strong>Adding Custom Resource Factories</strong></a></font></td></tr><tr><td><blockquote> | 
|---|
| 571 |  | 
|---|
| 572 |   <p>If none of the standard resource factories meet your needs, you can write | 
|---|
| 573 |   your own factory and integrate it into Tomcat 6, and then configure the use | 
|---|
| 574 |   of this factory in the | 
|---|
| 575 |   <a href="config/context.html"><code><Context></code></a> element for | 
|---|
| 576 |   the web application. In the example below, we will create a factory that only | 
|---|
| 577 |   knows how to create <code>com.mycompany.MyBean</code> beans from the | 
|---|
| 578 |   <a href="#Generic JavaBean Resources">Generic JavaBean Resources</a> example | 
|---|
| 579 |   above.</p> | 
|---|
| 580 |  | 
|---|
| 581 |   <h3>1.  Write A Resource Factory Class</h3> | 
|---|
| 582 |  | 
|---|
| 583 |   <p>You must write a class that implements the JNDI service provider | 
|---|
| 584 |   <code>javax.naming.spi.ObjectFactory</code> inteface.  Every time your | 
|---|
| 585 |   web application calls <code>lookup()</code> on a context entry that is | 
|---|
| 586 |   bound to this factory, the <code>getObjectInstance()</code> method is | 
|---|
| 587 |   called, with the following arguments:</p> | 
|---|
| 588 |   <ul> | 
|---|
| 589 |   <li><strong>Object obj</strong> - The (possibly null) object containing | 
|---|
| 590 |       location or reference information that can be used in creating an object. | 
|---|
| 591 |       For Tomcat, this will always be an object of type | 
|---|
| 592 |       <code>javax.naming.Reference</code>, which contains the class name of | 
|---|
| 593 |       this factory class, as well as the configuration properties (from the | 
|---|
| 594 |       <a href="config/context.html"><code><Context></code></a> for the | 
|---|
| 595 |       web application) to use in creating objects to be returned.</li> | 
|---|
| 596 |   <li><strong>Name name</strong> - The name to which this factory is bound | 
|---|
| 597 |       relative to <code>nameCtx</code>, or <code>null</code> if no name | 
|---|
| 598 |       is specified.</li> | 
|---|
| 599 |   <li><strong>Context nameCtx</strong> - The context relative to which the | 
|---|
| 600 |       <code>name</code> parameter is specified, or <code>null</code> if | 
|---|
| 601 |       <code>name</code> is relative to the default initial context.</li> | 
|---|
| 602 |   <li><strong>Hashtable environment</strong> - The (possibly null) | 
|---|
| 603 |       environment that is used in creating this object.  This is generally | 
|---|
| 604 |       ignored in Tomcat object factories.</li> | 
|---|
| 605 |   </ul> | 
|---|
| 606 |  | 
|---|
| 607 |   <p>To create a resource factory that knows how to produce <code>MyBean</code> | 
|---|
| 608 |   instances, you might create a class like this:</p> | 
|---|
| 609 |  | 
|---|
| 610 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 611 | package com.mycompany; | 
|---|
| 612 |  | 
|---|
| 613 | import java.util.Enumeration; | 
|---|
| 614 | import java.util.Hashtable; | 
|---|
| 615 | import javax.naming.Context; | 
|---|
| 616 | import javax.naming.Name; | 
|---|
| 617 | import javax.naming.NamingException; | 
|---|
| 618 | import javax.naming.RefAddr; | 
|---|
| 619 | import javax.naming.Reference; | 
|---|
| 620 | import javax.naming.spi.ObjectFactory; | 
|---|
| 621 |  | 
|---|
| 622 | public class MyBeanFactory implements ObjectFactory { | 
|---|
| 623 |  | 
|---|
| 624 |   public Object getObjectInstance(Object obj, | 
|---|
| 625 |       Name name, Context nameCtx, Hashtable environment) | 
|---|
| 626 |       throws NamingException { | 
|---|
| 627 |  | 
|---|
| 628 |       // Acquire an instance of our specified bean class | 
|---|
| 629 |       MyBean bean = new MyBean(); | 
|---|
| 630 |  | 
|---|
| 631 |       // Customize the bean properties from our attributes | 
|---|
| 632 |       Reference ref = (Reference) obj; | 
|---|
| 633 |       Enumeration addrs = ref.getAll(); | 
|---|
| 634 |       while (addrs.hasMoreElements()) { | 
|---|
| 635 |           RefAddr addr = (RefAddr) addrs.nextElement(); | 
|---|
| 636 |           String name = addr.getType(); | 
|---|
| 637 |           String value = (String) addr.getContent(); | 
|---|
| 638 |           if (name.equals("foo")) { | 
|---|
| 639 |               bean.setFoo(value); | 
|---|
| 640 |           } else if (name.equals("bar")) { | 
|---|
| 641 |               try { | 
|---|
| 642 |                   bean.setBar(Integer.parseInt(value)); | 
|---|
| 643 |               } catch (NumberFormatException e) { | 
|---|
| 644 |                   throw new NamingException("Invalid 'bar' value " + value); | 
|---|
| 645 |               } | 
|---|
| 646 |           } | 
|---|
| 647 |       } | 
|---|
| 648 |  | 
|---|
| 649 |       // Return the customized instance | 
|---|
| 650 |       return (bean); | 
|---|
| 651 |  | 
|---|
| 652 |   } | 
|---|
| 653 |  | 
|---|
| 654 | } | 
|---|
| 655 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 656 |  | 
|---|
| 657 |   <p>In this example, we are unconditionally creating a new instance of | 
|---|
| 658 |   the <code>com.mycompany.MyBean</code> class, and populating its properties | 
|---|
| 659 |   based on the parameters included in the <code><ResourceParams></code> | 
|---|
| 660 |   element that configures this factory (see below).  You should note that any | 
|---|
| 661 |   parameter named <code>factory</code> should be skipped - that parameter is | 
|---|
| 662 |   used to specify the name of the factory class itself (in this case, | 
|---|
| 663 |   <code>com.mycompany.MyBeanFactory</code>) rather than a property of the | 
|---|
| 664 |   bean being configured.</p> | 
|---|
| 665 |  | 
|---|
| 666 |   <p>For more information about <code>ObjectFactory</code>, see the | 
|---|
| 667 |   <a href="http://java.sun.com/products/jndi/docs.html">JNDI 1.2 Service | 
|---|
| 668 |   Provider Interface (SPI) Specification</a>.</p> | 
|---|
| 669 |  | 
|---|
| 670 |   <p>You will need to compile this class against a class path that includes | 
|---|
| 671 |   all of the JAR files in the <code>$CATALINA_HOME/lib</code> directory.  When you are through, | 
|---|
| 672 |   place the factory class (and the corresponding bean class) unpacked under | 
|---|
| 673 |   <code>$CATALINA_HOME/lib</code>, or in a JAR file inside | 
|---|
| 674 |   <code>$CATALINA_HOME/lib</code>.  In this way, the required class | 
|---|
| 675 |   files are visible to both Catalina internal resources and your web | 
|---|
| 676 |   application.</p> | 
|---|
| 677 |  | 
|---|
| 678 |   <h3>2.  Declare Your Resource Requirements</h3> | 
|---|
| 679 |  | 
|---|
| 680 |   <p>Next, modify your web application deployment descriptor | 
|---|
| 681 |   (<code>/WEB-INF/web.xml</code>) to declare the JNDI name under which | 
|---|
| 682 |   you will request new instances of this bean.  The simplest approach is | 
|---|
| 683 |   to use a <code><resource-env-ref></code> element, like this:</p> | 
|---|
| 684 |  | 
|---|
| 685 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 686 | <resource-env-ref> | 
|---|
| 687 |   <description> | 
|---|
| 688 |     Object factory for MyBean instances. | 
|---|
| 689 |   </description> | 
|---|
| 690 |   <resource-env-ref-name> | 
|---|
| 691 |     bean/MyBeanFactory | 
|---|
| 692 |   </resource-env-ref-name> | 
|---|
| 693 |   <resource-env-ref-type> | 
|---|
| 694 |     com.mycompany.MyBean | 
|---|
| 695 |   </resource-env-ref-type> | 
|---|
| 696 | <resource-env-ref> | 
|---|
| 697 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 698 |  | 
|---|
| 699 |     <p><strong>WARNING</strong> - Be sure you respect the element ordering | 
|---|
| 700 |     that is required by the DTD for web application deployment descriptors! | 
|---|
| 701 |     See the | 
|---|
| 702 |     <a href="http://java.sun.com/products/servlet/download.html">Servlet | 
|---|
| 703 |     Specification</a> for details.</p> | 
|---|
| 704 |  | 
|---|
| 705 |   <h3>3.  Code Your Application's Use Of This Resource</h3> | 
|---|
| 706 |  | 
|---|
| 707 |   <p>A typical use of this resource environment reference might look | 
|---|
| 708 |   like this:</p> | 
|---|
| 709 |  | 
|---|
| 710 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 711 | Context initCtx = new InitialContext(); | 
|---|
| 712 | Context envCtx = (Context) initCtx.lookup("java:comp/env"); | 
|---|
| 713 | MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory"); | 
|---|
| 714 |  | 
|---|
| 715 | writer.println("foo = " + bean.getFoo() + ", bar = " + | 
|---|
| 716 |                bean.getBar()); | 
|---|
| 717 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 718 |  | 
|---|
| 719 |     <h3>4.  Configure Tomcat's Resource Factory</h3> | 
|---|
| 720 |  | 
|---|
| 721 |     <p>To configure Tomcat's resource factory, add an elements like this to the | 
|---|
| 722 |     <a href="config/context.html"><code><Context></code></a> element for | 
|---|
| 723 |     this web application.</p> | 
|---|
| 724 |  | 
|---|
| 725 | <div align="left"><table border="0" cellpadding="0" cellspacing="4"><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#ffffff"><pre> | 
|---|
| 726 | <Context ...> | 
|---|
| 727 |   ... | 
|---|
| 728 |   <Resource name="bean/MyBeanFactory" auth="Container" | 
|---|
| 729 |             type="com.mycompany.MyBean" | 
|---|
| 730 |             factory="com.mycompany.MyBeanFactory" | 
|---|
| 731 |             bar="23"/> | 
|---|
| 732 |   ... | 
|---|
| 733 | </Context> | 
|---|
| 734 | </pre></td><td width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr><tr><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td><td height="1" width="1" bgcolor="#023264"><img border="0" hspace="0" vspace="0" height="1" width="1" src="./images/void.gif"></td></tr></table></div> | 
|---|
| 735 |  | 
|---|
| 736 |     <p>Note that the resource name (here, <code>bean/MyBeanFactory</code> | 
|---|
| 737 |     must match the value specified in the web application deployment | 
|---|
| 738 |     descriptor.  We are also initializing the value of the <code>bar</code> | 
|---|
| 739 |     property, which will cause <code>setBar(23)</code> to be called before | 
|---|
| 740 |     the new bean is returned.  Because we are not initializing the | 
|---|
| 741 |     <code>foo</code> property (although we could have), the bean will | 
|---|
| 742 |     contain whatever default value is set up by its constructor.</p> | 
|---|
| 743 |  | 
|---|
| 744 |     <p>You will also note that, from the application developer's perspective, | 
|---|
| 745 |     the declaration of the resource environment reference, and the programming | 
|---|
| 746 |     used to request new instances, is identical to the approach used for the | 
|---|
| 747 |     <em>Generic JavaBean Resources</em> example.  This illustrates one of the | 
|---|
| 748 |     advantages of using JNDI resources to encapsulate functionality - you can | 
|---|
| 749 |     change the underlying implementation without necessarily having to | 
|---|
| 750 |     modify applications using the resources, as long as you maintain | 
|---|
| 751 |     compatible APIs.</p> | 
|---|
| 752 |  | 
|---|
| 753 | </blockquote></td></tr></table></td></tr><!--FOOTER SEPARATOR--><tr><td colspan="2"><hr size="1" noshade></td></tr><!--PAGE FOOTER--><tr><td colspan="2"><div align="center"><font size="-1" color="#525D76"><em> | 
|---|
| 754 |         Copyright © 1999-2008, Apache Software Foundation | 
|---|
| 755 |         </em></font></div></td></tr></table></body></html> | 
|---|