Entradas

Persistencia de Java: Clave Primaria compleja con objeto

Como se vió, con el API de Persistencia de Java (Java Persistence API - JPA) se puede mapear todas las tablas de una base de datos como entidades para ser manipuladas desde objetos java. Ahora, ¿qué pasa con entidades débiles? Una entidad débil es aquella que depende su existencia de otra entidad. Por ejemplo, el detalle de una factura no puede existir sin una factura. Si se traslada este concepto a una base de datos, entonces, la clave primaria del detalle de factura será: la clave primaria de la factura a quien pertenece, y el número de orden que se muestra en la lista. Mapear la entidad FACTURA es simple: @Entity public class Factura implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="ID_FACTURA") private Long id; La entidad DETALLE_FACTURA tiene la clave primaria compuesta por dos campos: ID_FACTURA y NRO_ORDEN. En java, toda la clave primara es un objeto con el mismo nombre de la clase primaria más el sufijo "PK". Pero ad

According to TLD or attribute directive in tag file, attribute value does not accept any expressions

Este error me sucedían una y otra vez, revisaba los JSP, los TLD (que estaban dentro del .jar y siempre me aparecía ese error According to TLD or attribute directive in tag file, attribute value does not accept any expressions ... no me dejaría resignar en dejar los JSTL solo porque a veces me sale y otras veces puedo evaluar una evaluación como. <c:out value="${1+2}"/> La solución es sencilla: No debo de usar esta declaración del taglib <%@taglib uri="http://java.sun.com/jstl/core" prefix="c"%> Sino esta: <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

Administrador de Tomcat

Imagen
Quizás el Tomcat no es muy bien visto porque no tiene una interfaz de administración tan amigable como el de IIS. Pero esto es totalmente falso. Desde las primeras versiones, Tomcat ha tenido un administrador vía web. Pero por razones de seguridad el acceso era bloqueado. Quizás todos los hemos visto, pero no le hemos dado importancia. Cuando iniciamos el tomcat, se nos muestra una página como esta. Vemos un bloque llamado "Administration" y dentro un enlace que dice "Tomcat Manager". Y cuando se trata de ingresar allí, pide un usuario y una clave que ignoramos. Pues bien, si vemos en esta misma página, está la explicación. Editemos el archivo $CATALINA_HOME/conf/tomcat-users.xml y agreguemos una línea como esta: <?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="manager"/> <role rolename="admin"/> <user username="admin" password="admin" roles="admin,manager&q

Desplegando un .war en tomcat5.5 sobre ubuntu

Cuando ejecutaba el tomcat 5.5 sobre Ubuntu, de manera local (desde el usuario) las aplicaciones se ejecutaban correctamente. Pero cuando quería correrlo desde un demonio como parte del sistema, siempre mandaba un error de seguridad. Después de revisar por ahí, encontré que el ubuntu pone algunas seguridades sobre las acciones desde el tomcat. Edité este archivo /etc/tomcat5.5/policy.d/50user.policy y agregué lo siguiente: grant codeBase "file:/var/lib/tomcat5.5/webapps/ mi-aplicacion-web /-" { permission java.security.AllPermission; permission java.net.SocketPermission "127.0.0.1:3306", "connect,resolve"; permission java.net.SocketPermission "*.noaa.gov:80", "connect"; permission java.io.FilePermission "/var/lib/tomcat5.5/webapps/ mi-aplicacion-web /WEB-INF/logs-", "read,write,delete"; }; ... y vaya que resultó

API de Persistencia en NetBeans 5.5

Imagen
El artículo que traduje " Usando el API de persistencia en aplicaciones de escritorio (Introducción) " ahora pasará a la práctica usando NetBeans 5.5 Pues comenzamos por crear un nuevo proyecto llamado Persistence . Luego, crearemos la unidad de persistencia entrando a New | File dentro de la categoría Persistence. Definiremos el nombre de la unidad de persistencia (por omisión usaremos el nombre propuesto: PersistencePU). Recordemos que es una buena práctica utilizar el mismo nombre de la base de datos, aunque no necesariamente tengan que ser los nombres. Para la conexión de base de datos, crearemos uno nuevo: Podemos usar cualquier base de datos. Naturalmente debemos contar con el driver para el JDBC. Yo utilizaré el Firebird, por tanto los valores de la conexión a la base de datos son como sigue: Ahora vemos que creó el archivo persistence.xml dentro de META-INF, además ya tiene los valores de la plantilla como se mencionó en el artículo: Ahora, entraremos a New | File

campos tipo arreglo en Struts

Los arreglos nos ayudan mucho en la programación... se puede almacenar muchos valores en una misma variable, y se pueden diferenciar a través del índice. En la web (utilizando Struts 1), es posible que necesitemos campos variables que funcionen como arreglo. Es decir, un mismo formulario que tenga una vez 10 campos, la siguiente vez 15, y la siguiente 2 campos. Para ello, nuestro ActionForm deberá tener un campo arreglo: public class Formulario extends ActionForm { private String[] pregunta=new String[10]; public String[] getPregunta() { return pregunta; } public void setPregunta(String[] pregunta) { this.pregunta = pregunta; } Y en la capa de presentación (o sea, en el JSP) deberá mostrarse cada campo con un índice: Pregunta 1:<html:text property="pregunta[0]"/><br/> Pregunta 2:<html:text property="pregunta[1]"/><br/> Pregunta 3:<html:text property="pregunta[2]"/><br/> Si se está usando un DynaActionForm, la so

Usando el API de persistencia en aplicaciones de escritorio (Introducción)

Imagen
(Traducción no oficial de Using the Persistence API in Desktop Applications ) La especificación JSR220 define los EJB 3.0. Uno de los primeros objetivos es la simplicidad en la creación, manejo y almacenamiento de beans de entidad. Trabajando hacia la meta, Sun Microsystems y la colaboración de la comunidad de desarrolladores crearon un nuevo API que te permite usar los antiguos objetos de java (o POJOs) como entidades persistentes. El API de persistencia Java te facilita en el uso de POJOs como beans de entidad y reduce significativamente la necesidad de descriptores de despliegues complciados y beans ayudatnes extras. Adicionalmente, puedes usar siempre el API en aplicaciones de escritorio. Puedes describir muchas razones por la que deberías usar el nuevo API de persistencia, pero aquí hay algunas: No tienes que crear complejos objetos de accesos a datos (DAO). El API te ayuda manejar las transacciones. Escribes código basado en estándares que interactuan con la base de datos relacio

Cambiando la versión de la aplicación web (de especificación 2.3 a 2.4)

Recién me doy cuenta. Resulta que al hacer una aplicación en Eclipse importando el archivo blank.war de Struts 1.x, no podría usar expresiones como ${variable} si desea mostrar directamente en un .JSP el valor de esa variable de sesión. El lenguaje de expresiones (más conocido como EL) está disponible recién en la versión 2.4 de JSP . La versión que importé del archivo blank.war era la 2.3. Entonces ¿dónde cambio la versión de la especificación? Pues en el archivo web.xml El que importé decía esto: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> ... Por tanto, para cambiar la versión de la aplicación, debería cambiar con lo siguiente <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XM

INPUTS dinámicos

Ahora con todo eso de las aplicaciones web enriquecidas, y que las interfaces web no deberian recargarse del todo cuando se hace un pequeño cambio, pues aquí pongo un script (en javascript, obviamente) que permite agregar y quitar INPUT-TEXT según sea el gusto. <fieldset id="alternativas"> <legend>Alternativas</legend> <input type="Text" id="alt1" name="alternativa" size="100"/><br/> <input type="Text" id="alt2" name="alternativa" size="100"/> </fieldset> <input type="Button" value="Agregar alternativa" onclick="agregar_alternativa()"/> <input type="submit" value="Guardar"/> <script type="text/javascript"> function agregar_alternativa(){ var fieldset=document.getElementById("alternativas"); var inputs=document.getElementsByName("alternativa");

Convertir String a Date

Hice una vez un algoritmo para extraer pedazos de una cadena y pasarlo por la clase Calendar para obtener la fecha. Pero creo que son muchos pasos. Pues bien, creo que la siguiente manera deberá ser la más sencilla. Supongamos que tenemos la cadena "1976/03/27" y queremos convertirlo a java.util.Date. Pues este será el código: DateFormat df=DateFormat.getDateInstance(DateFormat.SHORT,Locale.JAPAN); Date d=df.parse("1976/03/27"); Uso el Locale.JAPAN por qué sé que ellos usan ese formato (yyyy/mm/dd) para las fechas.

String XML a Archivo

La manera más común de mandar una cadena a un archivo es justamente usar Streams. Pero podemos aprovechar el JDK utilizando los manejadores XML que tiene incorporado. Asumiendo que la variable xml es un String que contiene un XML válido, y la variable f es un objeto de tipo java.io.File . DocumentBuilderFactory factory = DocumentBuilderFactory. newInstance (); DocumentBuilder builder = factory. newDocumentBuilder (); Document document = builder. parse ( new InputSource ( new StringReader (xml))); document. setXmlVersion ( "1.0" ); Source source= new DOMSource (document); Result result= new StreamResult (f); Transformer xformer= TransformerFactory.newInstance().newTransformer(); xformer.transform(source, result);

Descargar XLS y PDF sin abrirlos en el navegador

Más de uno ha querido solucionar este problema: un link en un archivo para descargar un XLS o PDF (o DOC) sin que se abra en el navegador. Pues aquí tengo la solución (con PHP) Primero, los enlaces deberían como estos: <a href="download.php?link=Plantilla.xlt">XLT</a> <a href="download.php?link=Libro.pdf">PDF</a> Y el archivo download.php es el siguiente: <?php $doc=$_GET[ "link" ]; header ( 'Content-Type:application/octet-stream' ); header ( 'Content-Disposition:attachment; filename="' .$doc. '"' ); readfile ($doc); ?>

Realm con ActiveDirectory

Después de revisar varios ejemplos, probar y probar, logré encontrar una configuración para usar Realm con el ActiveDirectory de Windows. Esta es la configuración que usé: <Context path="/ldap" > <Realm className="org.apache.catalina.realm.JNDIRealm" connectionURL="ldap://med_spdom01" debug="99" userPattern="{0}@meduca.gob.pe" roleBase="OU=Politicas,DC=meduca,DC=gob,DC=pe" roleName="cn"/> </Context> Como se ve en userPattern, le estoy poniendo el dominio del usuario. Primero había probado logearme con ese formato en la ventana de inicio de sesión del windows. Al momento de escribir el árroba (@) en el nombre de usuario, la lista de dominios se me desactiva. Ya no hacía falta especificar el dominio. Con esa premisa fue que intenté utilizar el mismo formato para el Realm en el Tomcat

Anular caché de los navegadores

Los navegadores guardan todos los archivos que se han accedido. En internet explorer se llama "archivos temporales de internet"... lo cuál se refiere al caché de internet. (tanto nombre!) Pero si estamos en una página que requiere autenticarse, y al deslogear regresa a la página autenticada, pues el navegador mostrará la página por más que el usuario haya cerrado la sesión. Lo mejor es que cada página que el navegador no se guarde en el caché. Para ello colocaremos las siguientes sentencias (ya sea en jsp o en un servlet): response.setHeader("Cache-control","no-cache"); response.setHeader("Pragma","no-cache"); response.setDateHeader ("Expires", 0); Y Listo

Generar XLS

Para generar XLS generalmente se usa el Jakarta POI (en java), pero para web es mejor engañar al navegador. El navegador recibe como cabecera el tipo del archivo (mime-type) que está recibiendo y sabrá qué programa abrir. Si es de tipo text/html, abrirá el mismo navegador, pero si es un video tendrá otro tipo y le pedirá al sistema operativo abrir el reproductor de vídeo correspondiente. Para el caso de XLS es lo mismo, y como el Excel puede abrir hasta html, entonces lo engañaremos con más facilidad: Al inicio del JSP colocaremos esta línea: <%@page contentType="application/vnd.ms-excel"%> Con esto, cuando se acceda al .jsp abrirá el contenido con el excel. Pero si se estuviese usando el Internet Explorer, el xls saldrá incrustado en el navegador. Esto puede ser molestoso. Lo que podemos hacer es que se le pregunte al navegador si desea abrirlo o descargarlo. Colocaremos las siguientes líneas: <%@page contentType="application/vnd.ms-excel"%> <%respon

Configuración de Tomcat (conectando al Apache utilizando AJP)

Imagen
El Tomcat utiliza - por omisión - el puerto 8080 para mostrar los contenidos web. Se puede cambiar el puerto de salida en el archivo $CATALINA_HOME/conf/server.xml de 8080 a 80, para que el acceso sea más simple y evitar escribir un "apellido" como http://midominio :8080 /sistemaweb/. Pero quizás en nuestro host también estemos utilizando el apache para publicar otras aplicaciones que no son necesariamente jsp/servlet. Es posible hacer que todas las peticiones que reciba el apache a un determinado "directorio" sea redireccionado al tomcat, para que este lo atienda y envie su respueta al cliente através del Apache. Hay dos maneras para lograr esto: con el ProxyHTTP y con el conector AJP. En este mensaje mostraré cómo se utiliza el AJP. En este diagrama se muestra como funciona el AJP. Por omisión utiliza el puerto 8009 localmente. Paso 0: descargar el conector: El conector se puede encontrar en el sitio web de Tomcat . Debemos escoger el jk1.2( el jk2 es obsoleto). S

Configuración de Tomcat (módulos web)

"Normalmente", cuando un newbie en desarrollo hace su aplicación web y lo quiere publicar, suele colocarlo junto con los documentos del servidor web. Por ejemplo, si se tratase de PHP en Apache, lo coloca dentro de DocumentRoot; y si es Tomcat, en $CATALINA_HOME/webapps. Esto es normal, pero es algo desordenado tener la aplicación dentro del sistema que lo ejecuta. (Recuerdo que los perfiles de usuario en Windows NT estaban dentro del directorio Windows, si se instalaba nuevamente el sistema operativo, todos los perfiles se borraba. A partir del Windows 2K, los perfiles se guardan en un directorio a parte llamado "c:\Document and Settings"). Esto se puede hacer en Tomcat. Si deseamos cambiar de contenedor web (a una versión superior, o cambiar de propietario), los módulos web seguirán en el mismo sitio. Lo principal es tener todos los módulos web en un directorio aparte, que lo podamos identificar tan fácilmente como el "Document and Settings" del Windows.

Tiles en Struts 1.3

Comencé a migrar una aplicación hecha con Struts 1.2 para que utilizará Struts 1.3 Simplemente (pensé) sería copiar el contenido del struts-config.xls (manteniendo el DTD), obviamente usar los .jar respectivos, utilizar el mismo tiles-defs.xml, pero... no funcionó. Respondía el error 404 (no encuentra página). Después de un día perdido,revisé la documentación http://struts.apache.org/1.3.8/struts-tiles/installation.html y pues la solución era sencilla (algo nuevo con respecto al struts 1.2): Agregar el siguiente parámetro de inicialización del Action Servlet. <init-param> <param-name>chainConfig</param-name> <param-value>org/apache/struts/tiles/chain-config.xml</param-value> </init-param> hora, todo funciona como debería ser. ... no olvidar, siempre leer la documentación.

Menu contextual (con clic "derecho")

Cuando se hace clic 'derecho', se muestra un menú con las opciones propias del objeto que se está seleccionando. Si se hace clic 'derecho' sobre un icono, se debería mostrar opciones propias que se debe trabajar con ese ícono. En Windows esto se llama 'Menú Contextual' o 'Menú del contexto'. El término clic 'derecho' no debería llamarse 'derecho'. En sistemas operativos en donde se ha cambiado la posición de los botones del ratón para zurdos, la funciones de los botones - obviamente - cambian. Los botones se les llamaría como "Botón principal & botón secundario" para referencirse al clic 'izquierdo' y clic 'derecho'. (Por ahí oí que le decían también "clic & anti-clic"..... no sabia que un botón podría inhibir o estar en contra de lo que haga el botón). Pues bien, aquí un ejemplito bien sencillo de cómo mostrar el menú contextual con Java Swing. package diesil.swing; import java.awt.event.Mou

Struts 2 en Eclipse (parte 1)

Imagen
Pues, no utilizaré Eclipse, sino JBuilder 2007 que es lo mismo (me descepcionó la "mejora" que hizo Borland por este IDE) Creando una nueva aplicación Descargar el Struts de la web: http://struts.apache.org/download.cgi . Preferible si es la distribución completa. Descomprimir el archivo en un directorio. En el Eclipse (o JB2007), entrar el menú "File | Import...". Seleccionar Web > War File: Seleccionar el archivo struts2-blank.war que se encuentra en el directorio $STRUTS2/apps/. Además, escribir un nombre para el nombre del proyecto web nuevo: Clic en Finish. Examinando el proyecto El Struts2 viene con mejoras significativas. Prácticamente es otro framework, pero mantiene el espíritu principal de Struts: Actions + Forms. Ya no usa un Servlet, sino un Filter. Eso lo podemos ver en el archivo web.xml. El archivo de configuración ya no está en WEB-INF, sino es un recurso del proyecto. Podemos encontrar el archivo struts.xml en el directorio de fuentes .java (src