Bonjour,

Meilleurs vœux tout d'abord !

Voici ce qui m'amène : je souhaiterais créer une page jsp rudimentaire permettant de visualiser les données présentes dans une table d'une base postgresql via jdbc, le tout déployé sous Tomcat 8.

Mon 1er test utilise les instructions suivantes pour la connexion (extrait) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Class.forName("org.postgresql.Driver");
Connection cn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres?user=postgres&password=admin");
Ici pas de problème, le contenu de ma table est bien affiché.

Mon 2nd test utilise cette fois la notion de contexte :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
Context initContext = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/mydb1");
Connection cn = ds.getConnection();
J'ai au préalable mis à jour les fichiers server.xml et context.xml (présents dans C:\Program Files\Apache Software Foundation\Tomcat 8.5\conf) comme suit :

server.xml

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<Resource name="jdbc/mydb1"
		  auth="Container"
		  type="javax.sql.DataSource"
		  driverClassName="org.postgresql.Driver"
		  url="jdbc:postgresql://localhost:5432/postgres"
		  username="postgres"
		  password="admin"
		  maxActive="20"
		  initialSize="0"
		  minIdle="0"
		  maxIdle="8"
		  maxWait="10000"
		  timeBetweenEvictionRunsMillis="30000"
		  minEvictableIdleTimeMillis="60000"
		  testWhileIdle="true"
		  validationQuery="SELECT 1"
		  maxAge="600000"
		  rollbackOnReturn="true"/>
context.xml

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
<Resource name="jdbc/mydb1" auth="Container" type="javax.sql.DataSource"
               maxTotal="100" maxIdle="30" maxWaitMillis="10000"
               username="postgres" password="admin" driverClassName="org.postgresql.Driver"
               url="jdbc:postgresql://localhost:5432/postgres"/>
La encore pas de problème, le contenu de ma table est bien affiché.

A présent, 3ème et dernier test : je souhaiterais ne pas avoir à modifier les fichiers server.xml et context.xml comme précédemment, mais plutôt utiliser des fichiers context.xml et web.xml propres à mon appli web.

Voici les fichiers impliqués :

context.xml dans le sous-dossier META-INF de mon appli web :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
  <Resource name="jdbc/mydb2" auth="Container" type="javax.sql.DataSource"
               maxTotal="100" maxIdle="30" maxWaitMillis="10000"
               username="postgres" password="admin" driverClassName="org.postgresql.Driver"
               url="jdbc:postgresql://localhost:5432/postgres"/>
</Context>
web.xml dans le sous-dossier WEB-INF de mon appli web :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1">
  <description>postgres</description>
  <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/mydb2</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref> 
</web-app>
Et enfin la partie connexion dans ma page :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
Context initContext = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/mydb2");
Connection cn = ds.getConnection();
Cette fois quand j'affiche ma page, j'ai la belle erreur suivante :

javax.servlet.ServletException: javax.naming.NameNotFoundException: Le Nom [mydb2] n'est pas lié à ce Contexte

J'ai du louper un épisode ou bien mon implémentation n'est tout simplement pas possible ...

Merci d'avance pour votre aide !