[66] | 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> |
---|