• Skip to primary navigation
  • Skip to main content

Jorge Arrambide

Especialista en programación web en java

  • ¿Quién soy?
  • Contactar
  • Servicios
    • Programación para empresas
    • Asesorías de programación universidad
  • Articulos
    • Java
    • Salesforce
    • WordPress

Blog

Expression Language en JSF

Java Expression Language (EL) es un compacto y poderoso mecanismo que permite una comunicación dinámica en aplicaciones basadas en Java Server PAges (JSP) y Java Server Faces (JSF).

Embebemos estas expresiones en la capa de presentación para comunicar con la capa de la lógica de la aplicación. Con esto EL, provee una comunicación bidireccional.

¿Para qué se usa EL (Expression Language)?

EL es usado para “llenar” peticiones HTTP (HTTP request) con la información capturada por el usuario, también para extraer la información de las respuestas HTTP (HTTP response), también para actualizar el DOM HTML o para condicionar datos procesados, etc.

NOTA: Las expresiones EL, suelen estar usarse en páginas JSP y JSF, pero también pueden usarse en otros archivos, como por ejemplo en el archivo de configuración de faces-config.xml de JSF.

Sintaxis EL

EL puede evaluar las expresiones como inmediata (immediate) o diferida (deferred).

La evaluación inmediata, regresa el resultado tan pronto como la página es renderizada por primera vez. Este tipo de expresión es de tipo solo lectura (read only) y solo puede estar presente en etiquetas (tags) que aceptan expresiones en tiempo de ejecución (runtime expressions). Estas expresiones son reconocidas mediante la anotación ${ } y por lo general es usada en páginas JSP.

La evaluación diferida, puede reguresar el resultado en diferentes fases del ciclo de vida de la página. JSF puede evaluar la expresión en diferentes fases del ciclo de vida (por ejemplo, durante la fase de renderizado y la fase postback). Este tipo de expresiones pueden ser valores y métodos de expresiones, y son reconocidos con la anotación #{ }. Además es de tipo lectura y escritura.

Agregar registros o elementos a un datatable en Primefaces

Para Java, el framework de Primefaces es mi favorito para crear el front-end de una manera fácil, estandarizada y evitando usar javascript de manera “manual”. Ya que ofrece más de 100 componentes (entre ellos calendarios, ajax, etc.)

En este tutorial, muestro como agregar elementos a un elemento datatable de Primefaces, al inicio del vídeo muestro el resultado obtenido.

Videotutorial

Tomcat ¿qué debería usar, el JRE o JDK?

Respuesta rápida: cualquiera de las 2 opciones. Eso ya depende de ti. 🙂

Tomcat requiere como mínimo el JRE (Java Runtime Enviroment) para funcionar.

Archivo RUNNING.TXT

En el archivo RUNNING.txt, del Tomcat que hayas descargado, puedes encontrar la versión mínima de Java que requiere para funcionar.

En este ejemplo, yo uso Tomcat 9, el cual requiere el JRE 8 o superior.

Sin embargo también puedes usar el JDK, ya que el JDK contiene el JRE.

Y para hacer lo anterior, requieres tener configurada la variable de entorno en tu sistema operativo.

Si quieres usar el JRE para Tomcat, debes de tener creada la variable de entorno (enviroment variable) JRE_HOME, si quieres usar el JDK, debes tener la variable de entorno JAVA_HOME.

¿Qué pasa si tengo ambas variables de entorno JDK y JRE?

Si ambas variables de entorno están declaradas, Tomcat toma la variable JRE_HOME. Así que es algo que deberás tener en consideración.

Tomcat por default toma JRE_HOME, si existen ambas variables.

NOTA: Los contenedores web (como Tomcat), pueden requerir el JDK para soportar JSP (Java Server Pages), porque requiere un Compilador Java para compilar Servlets que son generados a partir de archivos JSP. Tomcat ya cuenta con un Compilador Java (Eclipse Java Compiler) en su librería y con esto ya puede soportar JSP sin ningún problema.

Eclipse Java Compiler

¿Qué versión de java usar para cada tomcat?

Versiones soportadas

Además de tener en cuenta la versión de Java que requieres para usar un Tomcat en especifico, revisa muy bien las columnas:

  • ServletSpec
  • JSP Spec
  • EL Spec

Estos 3 puntos determinarán que nuevas características puedes usar a nivel de configuración o de programación.

Por ejemplo en la versión Servlet 3.0, en lugar de usar el archivo web.xml para configurar ciertos parametros, ahora lo puedes hacer con anotaciones a nivel de clases de java.

Obtenido de la documentación oficial de Apache Tomcat

Crear documento json a partir de tablas relacionales en MySQL

Requerimientos

  • MySQL 8.0.2
  • Workbench

Query

Usaremos las funciones JSON_OBJECT Y JSON_ARRAYAGG.

SELECT
	JSON_OBJECT('id',u.id, 'nombre', u.nombre, 'paterno' ,u.paterno, 'materno' ,u.materno, 
    'direcciones',
			(
			SELECT 
			JSON_ARRAYAGG(JSON_OBJECT('calle', d.calle ,'colonia' ,d.colonia, 'municipio' , m.descripcion, 'estado' , e.descripcion ))
			FROM
				tutoriales.direccion d
						INNER JOIN tutoriales.municipio m
						ON m.id = d.id
						INNER JOIN tutoriales.estado e
						ON e.id = m.idEstado
			WHERE d.idUsuario = u.id
			),
	 'referencias', (
			SELECT 
				JSON_ARRAYAGG(JSON_OBJECT('id', r.id,'nombre', r.nombre,
                'telefonos', (
                
					SELECT JSON_ARRAYAGG(JSON_OBJECT ('numero',rt.numero, 'tipoTelefono', tt.descripcion))
							FROM referenciatelefono rt
								INNER JOIN tipotelefono tt
								ON tt.id = rt.idTipoTelefono
							WHERE rt.idReferencia = r.id
                
                )
                ))
			FROM
				tutoriales.referencias r
			 WHERE r.idUsuario = u.id
		)
    )
AS dato
FROM usuario u 
WHERE u.id = 1;

Script para crear tablas relacionales

CREATE DATABASE  IF NOT EXISTS `tutoriales` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `tutoriales`;
--
-- Table structure for table `direccion`
--
DROP TABLE IF EXISTS `direccion`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `direccion` (
  `id` int NOT NULL AUTO_INCREMENT,
  `idUsuario` int NOT NULL,
  `calle` varchar(45) NOT NULL,
  `colonia` varchar(45) NOT NULL,
  `idMunicipio` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

DROP TABLE IF EXISTS `estado`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `estado` (
  `id` int NOT NULL,
  `descripcion` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

DROP TABLE IF EXISTS `municipio`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `municipio` (
  `id` int NOT NULL AUTO_INCREMENT,
  `descripcion` varchar(100) NOT NULL,
  `idEstado` int NOT NULL,
  `idMunicipio` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=68 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

DROP TABLE IF EXISTS `referencias`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `referencias` (
  `id` int NOT NULL AUTO_INCREMENT,
  `idUsuario` varchar(45) NOT NULL,
  `nombre` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

DROP TABLE IF EXISTS `referenciatelefono`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `referenciatelefono` (
  `id` int NOT NULL AUTO_INCREMENT,
  `idReferencia` int NOT NULL,
  `numero` varchar(45) NOT NULL,
  `idTipoTelefono` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

DROP TABLE IF EXISTS `telefono`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `telefono` (
  `id` int NOT NULL,
  `numero` varchar(45) DEFAULT NULL,
  `idTipoTelefono` int NOT NULL,
  `idUsuario` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

DROP TABLE IF EXISTS `tipotelefono`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `tipotelefono` (
  `id` int NOT NULL,
  `descripcion` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

DROP TABLE IF EXISTS `usuario`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `usuario` (
  `id` int NOT NULL AUTO_INCREMENT,
  `nombre` varchar(100) DEFAULT NULL,
  `paterno` varchar(100) DEFAULT NULL,
  `materno` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Script para insertar información

INSERT INTO `direccion` VALUES (1,1,'Calle 10','Jardines de Anahuac',1),(2,1,'Pico de Socampa','Balcones de las Puentes',1);

INSERT INTO `estado` VALUES (14,'Jalisco'),(19,'Nuevo León');

INSERT INTO `municipio` VALUES (1,'San Nicolás de los Garza',19,46),(2,'Linares',19,33),(3,'Monterrey',19,39),(4,'Guadalajara',14,39),(5,'Puerto Vallarta',14,67);

INSERT INTO `referencias` VALUES (1,'1','Norma Treviño'),(2,'1','Mérida Arrambide'),(3,'1','Astrid Arrambide'),(4,'1','Santiago Arrambide');

INSERT INTO `referenciatelefono` VALUES (1,1,'8111323221',2),(2,1,'8183305866',1),(3,2,'5599888221',2),(4,3,'8167626161',2),(5,4,'8177188112',2);

INSERT INTO `telefono` VALUES (1,'8122154101',2,1),(2,'8183305836',1,1),(3,'8189898989',3,1),(4,'8111312929',2,2);

INSERT INTO `tipotelefono` VALUES (1,'Casa'),(2,'Celular'),(3,'Trabajo');

INSERT INTO `usuario` VALUES (1,'Jorge','Arrambide','Hernandez'),(2,'Santiago','Arrambide','Treviño'),(3,'Astrid','Arrambide','Treviño'),(4,'Mérida','Arrambide','Treviño');

Maven Eclipse error web.xml is missing and failOnMissingWebXml is set to true

Cuando creas un proyecto con Maven en el IDE de Eclipse, puedes tener el siguiente error:

web.xml is missing and is set to true

Error al crear un proyecto con Maven dentro de Eclipse

¿Cómo solucionar web.xml is missing and failOnMissingWebXml is set to true?

Para solucionar dicho error sigue los siguientes pasos:

  • Da clic derecho sobre el proyecto en donde tienes el error.
  • Navega hasta la opción Java EE Tools
  • Selecciona “Generate Deployment Descriptor stub“
  • Lo anterior debe generar el archivo web.xml
Generar Descriptor de despliegue

Con los pasos anteriores, deberías de poder ver el siguiente archivo web.xml y en la pestaña de Markers, ya no se debe mostrar el error.

¿Porqué pasa este error?

Porque estas usando una versión de maven inferior al 3.1.0, a continuación un poco más de detalle.

Las especificaciones Java EE 6+ han intentado quitar el énfasis a los descriptores de implementación, ya que pueden reemplazarse por anotaciones . Sin embargo, las versiones inferiores todavía lo requieren.

Desde la versión de Java EE 6 y superiores, se esta “promoviendo” no usar el archivo web.xml, mejor conocido como deployment descriptor o descriptor de despliegue.

Ya que a partir de dicha versión de Java, en lugar de usar el archivo web.xml, se puede usar clases de java con anotaciones (@WebServlet, @WebFilter y @WebListener).

Resulta que dependiendo de la versión de Maven que estés usando, este archivo lo toma como requerido, es decir, que debe de estar presente en el proyecto.

La propiedad failOnMissingWebXml es una de las propiedades del plug-in de Apache Maven War, org.apache.maven.plugins: maven-war-plugin. A partir de la versión 3.1.0 o superior, esta propiedad viene con el valor false, por default.

Propiedad failOnMissingWebXml
Puedes ver más en la documentación oficial de Maven
  • « Go to Previous Page
  • Page 1
  • Page 2
  • Page 3
  • Page 4
  • Interim pages omitted …
  • Page 7
  • Go to Next Page »

Derechos de autor © 2025

  • Política de privacidad
  • Política de cookies
Este sitio web utiliza cookies propias para poder optimizar su visita a la página y cookies de terceros para recoger información sobre sus visitas y el uso de nuestra web. Vd. puede permitir su uso, rechazarlo o cambiar la configuración cuando lo desee. En caso de seguir navegando, se considerará que se acepta el uso. Más información: Política de Cookies