El uso de Tomcat context xml como fichero para configurar funcionalidad de servidor es muy habitual. Normalmente la configuración de una aplicación web se realiza a través el web.xml .
Pero hay algunas partes de la configuración que están más ligadas a las tareas de administración y no usan el web.xml ya que este es neutro y no pertenece a ningún tipo de servidor en concreto. Así pues cada fabricante define el suyo. Vamos a ver como usar el fichero context.xml en Tomcat para dar de alta una fuente de datos o Datasource.
Utilizando Tomcat context xml
Es momento de crear este fichero en nuestra aplicación web y abordar su configuración. Para ello añadimos el fichero en la carpeta META-INF de la aplicación web:
Acabamos de añadir contenido al fichero y configurar una fuente de datos o Datasource:
<?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/cursosDS" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" url="jdbc:mysql://localhost:3306/java" driverClassName="com.mysql.jdbc.Driver" username="root" password="mysql" /> </Context>
Acabamos de configurar el DataSource con los siguientes parámetros:
- name: Nombre del Datasource o fuente de datos
- type: type de Datasource en este caso SQL
- url: Dirección del servidor y la base de datos de Mysql
- driverClassName: Tipo de driver
- username: Usuario de conexión
- password: Clave de conexión
Nos queda modificar el web.xml para que enlace con el DataSource construido:
<resource-ref> <res-ref-name>jdbc/cursosDS</res-ref-name> <res-type>java.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
Una vez hecho esto el siguiente paso es construir un Servlet en nuestra aplicación que sea capaz de obtener una referencia al DataSource.
Este Servlet lanzará una consulta de inserción:
package com.arquitecturajava.ejemplo1; import java.io.IOException; import java.sql.Connection; import java.sql.Statement; import javax.annotation.Resource; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; @WebServlet("/ServletInsercion") public class ServletInsercion extends HttpServlet { private static final long serialVersionUID = 1L; @Resource(name = "jdbc/cursosDS") private DataSource fuente; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String sql = "insert into cursos values (2,'java') "; try (Connection conn = fuente.getConnection(); Statement stmt = conn.createStatement();) { stmt.executeUpdate(sql); } catch (Exception se) { throw new RuntimeException("error SQL", se); } } }
Hemos construido un Servlet que hace uso de una anotación @Resource para referirse al DataSource que acabamos de configurar entre el web.xml y el context.xml. Nos queda invocar el Servlet y que nos inserte la información en la base de datos.
Recordemos que para que la aplicación funcione debemos agregar el driver JDBC de mysql. Acabamos de configurar el fichero Tomcat context xml con un Datasource.
Otros artículos relacionados:
<
Resource
name
=
"jdbc/cursosDS"
type
=
"javax.sql.DataSource"
maxActive
=
"100"
maxIdle
=
"30"
maxWait
=
"10000"
url
=
"jdbc:mysql://localhost:3306/java"
driverClassName
=
"com.mysql.jdbc.Driver"
username
=
"root"
password
=
"mysql"
/>
Existe alguna manera para que el username y password no queden visibles
https://www.middlewareinventory.com/blog/secure-tomcat-jdbc/ esta es una opción 🙂
Ese @Resource para el Servlet no funcionaría para una clase normal , verdad?
quiero decir, esa inyección de data source como la podríamos hacer fuera del servlet usando una clase distinta al servlet?
Esto no se si sería útil pero querría que otra clase hiciera la configuración de DAOs usando una inyección en esta y no en el mismo Servlet tener que hacerla ahí. Se podría ?
hola estoy tratando de aprender a programar y estuve esando netbeans
pero ahora estoy usando eclipse y veo quees muy diferente. hay alguna
forma de crear algu tipo de plantilla para qu me aparesca
web, resource, otro resourse. pomxml., jaa scprim t todo lo qiue me aparece en netbean qu no aarece en eclipse
Una un dinamic web proyect
Buenas, y si quiero acceder desde una aplicación jar, a un datasource remoto en un application server como tomcat??
como puedo hacer?
Gracias.
Genial. Muy clarito.
gracias 🙂