This Howto follows official guidelines and might be a bit more straight forward and easier to reproduce then original . That is a way I was able to get JNDI up and running on 9.0.41 release . I have also compiled in one post displaying mariadb's table data via Servlet and via JSP based on utilizing tags supported via the most recent versions of taglibs 1.2.5.
See for detailshttps://tomcat.apache.org/tomcat-9.0-doc/jndi-datasource-examples-howto.html
Overall application file layout .
Configuring a JNDI datasource allows you to create the bridge between a JNDI resource in your Tomcat Application server and the Elements Connect add-on. JNDI datasources use JDBC drivers that get a connection to a datasource. Once a JNDI datasource is configured, you'll be able to: Browse the datasource from the field configuration tester. JNDI is disabled in Spring boot's embedded Tomcat so you would need to enable it using Tomcat#enableNaming and once that is done you would need to create a lookup entry in JNDI. You can refer to the below code which I copied from one of the spring boot project maintainers repository GitHub repo JNDI-Tomcat.
[tomcat@sever33fedora ConnectionPool]$ ls -CRl
.:
total 8
drwxr-x---. 2 tomcat tomcat 24 Jan 23 20:33 images
-rw-r-----. 1 tomcat tomcat 752 Jan 23 16:22 index.html
drwxr-x---. 3 tomcat tomcat 56 Jan 23 20:33 META-INF
-rw-r-----. 1 tomcat tomcat 558 Jan 23 18:33 showbooks.jsp
drwxr-x---. 5 tomcat tomcat 58 Jan 23 20:33 WEB-INF
./images:
total 4
-rw-r-----. 1 tomcat tomcat 1441 Jan 22 22:02 tomcat.gif
./META-INF:
total 4
-rw-r-----. 1 tomcat tomcat 63 Jan 23 20:24 MANIFEST.MF
-rw-r-----. 1 tomcat tomcat 0 Jan 23 20:33 war-tracker
./WEB-INF:
total 4
drwxr-x---. 3 tomcat tomcat 19 Jan 23 20:33 classes
drwxr-x---. 2 tomcat tomcat 237 Jan 23 20:33 lib
drwxr-x---. 3 tomcat tomcat 47 Jan 23 20:33 src
-rw-r-----. 1 tomcat tomcat 800 Jan 22 18:59 web.xml
./WEB-INF/classes:
total 0
drwxr-x---. 2 tomcat tomcat 36 Jan 23 20:33 mypkg
./WEB-INF/classes/mypkg:
total 4
-rw-r-----. 1 tomcat tomcat 3381 Jan 23 18:32 MySQLDbcpServlet.class
*******************************************************
All required jars placed under WEB-INF/lib from https://tomcat.apache.org/download-taglibs.cgi
Mysql-connector-java-8.0.23.jar is also present in $CATALINA_HOME/lib and includes in $CLASSPATH of 'javac' build of MySQLDbcpServlet.java
*******************************************************
./WEB-INF/lib:
total 4440
-rw-r-----. 1 tomcat tomcat 2415211 Jan 21 18:17 mysql-connector-java-8.0.23.jar
-rw-r-----. 1 tomcat tomcat 1660960 Jan 21 18:17 protobuf-java-3.11.4.jar
-rw-r-----. 1 tomcat tomcat 52794 Jan 23 15:54 taglibs-standard-compat-1.2.5.jar
-rw-r-----. 1 tomcat tomcat 206430 Jan 23 15:54 taglibs-standard-impl-1.2.5.jar
-rw-r-----. 1 tomcat tomcat 163271 Jan 23 15:54 taglibs-standard-jstlel-1.2.5.jar
-rw-r-----. 1 tomcat tomcat 40153 Jan 23 15:54 taglibs-standard-spec-1.2.5.jar
./WEB-INF/src:
total 4
-rw-r-----. 1 tomcat tomcat 2714 Jan 23 18:32 MySQLDbcpServlet.java
*********************************
web.xml of particular application
********************************
[tomcat@sever33fedora ConnectionPool]$ cd WEB*
[tomcat@sever33fedora WEB-INF]$ cat web.xml
<web-app xmlns='http://java.sun.com/xml/ns/j2ee'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:schemaLocation='http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd'
version='2.4'>
<resource-ref>
<description>DB Connection Pool</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<servlet>
<servlet-name>MySQLDbcpExample</servlet-name>
<servlet-class>mypkg.MySQLDbcpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MySQLDbcpExample</servlet-name>
<url-pattern>/trydbcp</url-pattern>
</servlet-mapping>
</web-app>
***************************************************
$CATALINA_HOME/conf/context.xml contains Recource
entry available over all apps on Tomcat 9.0.41
***************************************************
<Resource name='jdbc/TestDB' auth='Container' type='javax.sql.DataSource'
maxActive='100' maxIdle='30' maxWait='10000' removeAbandoned='true'
username='root' password='root' driverClassName='com.mysql.jdbc.Driver'
url='jdbc:mysql://localhost:3306/ebookshop' />
****************
Servlet code
***************
[tomcat@sever33fedora src]$ catMySQLDbcpServlet.java
package mypkg;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import javax.sql.DataSource;
import javax.naming.*;
public class MySQLDbcpServlet extends HttpServlet {
DataSource pool; // Database connection pool
@Override
public void init( ) throws ServletException {
try {
// Create a JNDI Initial context to be able to lookup the DataSource
InitialContext ctx = new InitialContext();
// Lookup the DataSource, which will be backed by a pool
// that the application server provides.
pool = (DataSource)ctx.lookup('java:comp/env/jdbc/TestDB');
if (pool null)
throw new ServletException('Unknown DataSource 'jdbc/TestDB');
} catch (NamingException ex) {
ex.printStackTrace();
}
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// Set the response message's MIME type
response.setContentType('text/html;charset=UTF-8');
// Allocate a output writer to write the response message into the network socket
PrintWriter out = response.getWriter();
Connection conn = null;
Statement stmt = null;
try {
out.println('<!DOCTYPE html>');
out.println('<html>');
out.println('<head><title>Qurey Servlet</title></head>');
out.println('<body bgcolor='C0C0C0'>');
out.println('<h3>Servlet displayes table content via connection pool</h3>');
out.println('<br>');
// Get a connection from the pool
conn = pool.getConnection();
// Normal JBDC programming hereafter. Close the Connection to return it to the pool
Similkameen wineries map. stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery('SELECT title, author ,price, qty FROM books');
int count=0;
out.println('<table border='2'>');
while(rset.next()) {
out.println('<tr><td>' + rset.getString('title') + ', '
+ rset.getString('author') + ', ' + String.valueOf(rset.getDouble('price')) + ', ' + Integer.toString(rset.getInt('qty')) + '</td></tr>');
++count;
}
out.println('</table>');
out.println('<p> ' + count + ' rows found </p>');
out.println('</body></html>');
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
out.close();
try {
if (stmt != null) stmt.close();
if (conn != null) conn.close(); // return to pool
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}
***********************
JSP showbooks.jsp code
**********************
[tomcat@sever33fedora ConnectionPool]$ cat showbooks.jsp
<%@ taglib uri='http://java.sun.com/jsp/jstl/sql' prefix='sql' %>
<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c' %>
<sql:query var='rs' dataSource='jdbc/TestDB'>
select id, title, author, price from books
</sql:query>
<html>
<head>
<title>DB Test</title>
</head>
<body bgcolor='C0C0C0'>
<h3>JSP displayes table content via tags 'c:' and 'sql:'</h3>
<table border='2'>
<c:forEach var='row' items='${rs.rows}'>
<tr><td> ${row.id} ; ${row.title} ; ${row.author} ; ${row.price} </td></tr>
</c:forEach>
</table>
</body>
</html>