Deployando en un OC4J desde NetBeans 6.5

Escrito por blood

Fecha: 23/Febrero/2009

Tags: , ,

Hola, pues cambiando de aires es necesario deployar aplicaciones en algunos horribles servidores de aplicaciones, como es el caso de OAS 10.3.x. De manera que si no queremos desarrollar en el IDE de Oracle llamado JDeveloper podemos hacer lo siguiente para que nuestro amado NetBeans sea capaz de deployar aplicaciones en OAS.

Lo primero es agregar un repositorio a NetBeans:

Herramientas>Complementos>Configuracion>Agregar

Nombre: MiRepositorio

URL: http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastStableBuild/artifact/nbbuild/nbms/updates.xml.gz

Después solo neceistamos recargar la lista de complementos disponibles y buscar el complemento llamado OC4J J2EE Container.

Ubuntu 8.10 Intrepid Ibex en la HP MiniNote 2133

Escrito por TheRealThom

Fecha: 18/Enero/2009

Categoría: GNU/Linux, Software

Que caray… pues aqui estoy de regreso, no se por qué se me da la costumbre de abandonar por largo tiempo los blogs, pero para no pelear solo diré que fue porque no tenia nada nuevo que aportar, a veces el trabajo se muestra algo tedioso y mis intereses vuelan por la ciencia ficción o la historia, pero aquí estoy de nuevo :’D pese a quien le pese!

Hace cosa de dos meses adquirí la MiniNote 2133 de HP, como mucha gente (de la que le entiende al contenido del blog al menos) de los pocos defectos que le encontré es que traía instalado Windows Vista, esa misma tarde desapareció de su disco duro de 120 Gigas y apareció Windows XP (Solo por costumbre) y Ubuntu 8.04, la instalacion de Windows XP fue muy simple y realmente no cabe decir nada más acerca de eso, sin embargo, al momento de instalar Ubuntu hubo algunos problemas, cosa que no me amilanó porque el gusto de verlo instalado iba a hacer que todo valiera la pena… seguí religiosamente las instrucciones de una página muy conocida para quien haya intentado la misma instalación: https://wiki.ubuntu.com/LaptopTestingTeam/HP2133. Página altamente recomendable, sin embargo hay un pequeño detalle y es el archivo xorg.conf, ya que al sobreescribirlo tal cual dice y al reiniciar el sistema, sigue con la más baja resolución de pantalla y no hay manera de cambiarla. Largo tiempo estuve investigando sin éxito. Surgió Intrepid Ibex e hice las mismas pruebas, y nada, pero el viernes pasado llegué a casa con la intención de no dormir con tal de que quedara, y bueno, sin mucho trabajo y como por arte de magia encontré la solución.

Paso a paso:

1. Instalar ubuntu como lo indica el wiki hasta el punto de Video Driver Fix, en ese punto seguir con el paso 2.
2. Cuando la instalación haya terminado y al reiniciar la computadora, elegir Reiniciar en modo a prueba de errores.
3. Toca el turno de la instalación del driver de Via.
3.1. El driver para 2D (resolucion 1024×600) lo pueden descargar de aqui.

3.1.2. Descomprimir el driver recién descargado, entrar a la carpeta resultante e instalarlo desde consola con root: $ sudo ./v2DInstall
3.1.3. Este punto es muy importante, antes de reiniciar, sobreescribir el archivo /etc/X11/xorg.conf por este.
4. Reiniciar y disfrutar una chula nueva instalación de Ubuntu 8.10 Intrepid Ibex en la MiniNote 2133.

Lo más complejo del asunto es configurar o encontrar al menos, un xorg.conf que funcione, pero bueno, una vez que ha funcionado hay que compartlrlo :-)

Ubuntu se comporta mucho mejor que windows XP y Vista en la MiniNote, como era de suponerse, instalé todo el entorno de desarrollo para mi trabajo y hobbies: NetBeans, JBoss, el JDK y hasta ¡¡Oracle XE!! además de un IDE para Python (SPE) y solo por probar, instalé VirtualBox y con ésta, windows XP, que no es por presumir, pero funcionó sin mayor problema con los recursos disponibles.

Por fin tengo mi MiniNote como la quería XD. ¡Aquí nos vemos!

Good Luck!

Internacionalización en JAVA

Escrito por blood

Fecha: 12/Enero/2009

Categoría: Java

Muchas veces nos enfrentamos con problemas de formatos internacionales cuando programamos en java, de tal modo que cuando utilizamos instancias de la clase Date por ejemplo, nos imprime valores como “January” en lugar de “Enero” y cosas por el estilo.

A continuación se muestra un ejemplo para resolver este tipo de problemas utilizando la clase SimpleDateFormat y Locale.

java.util.Locale MX = new Locale("es","MX");
java.text.SimpleDateFormat FormatoFecha = new SimpleDateFormat("dd/MM/yyyy h:mm:ss a", MX);
String Fecha Formateada = FormatoFecha.format(new Date());

Esto dará como resultado el mes actual en español de México (o castellano).

Hasta Luego.

Secuencias de Oracle en Hibernate

Escrito por TheRealThom

Fecha: 25/Octubre/2008

Categoría: Hibernate

Tags:

Algo simple y sencillo: Vamos a describir como utilizar Secuencias de Oracle en Hibernate.

Las secuencias se utilizan generalmente para asignar la llave primaria (primary key) en los registros que vamos insertando en nuestras tablas, evitando tener que calcular el número asignado a la llave en el último registro que insertamos, así pues, vamos a crear una tabla, la cual utilizaremos de ejemplo junto con la secuencia.

CREATE TABLE usuarios (
   idUsuario INT PRIMARY KEY,
   usuario VARCHAR2(15) NOT NULL,
   passwd VARCHAR2(15) NOT NULL
);
 
CREATE SEQUENCE seq_usuarios
   INCREMENT BY 1
   START WITH 1
   NOMAXVALUE
   NOMINVALUE
   NOCYCLE;

La secuencia anterior se llama seq_usuarios, se va incrementando en 1, empieza en 1, no tiene un valor máximo ni un valor mínimo definido, no se comporta de manera cíclica.

Como se puede observar en el Post de mike acerca de Hibernate, debemos de crear un POJO (Plain Old Java Object), el cual contendrá tantos métodos setters y getters como campos tenga nuestra tabla, en este caso nuestro POJO quedaría de la siguiente manera.

package com.hibernate.pojos;
 
/**
 *
 * @author thom
 */
public class Usuarios {
    private int idUsuario;
    private String usuario;
    private String passwd;
 
    public Usuarios() {
    }
    public void setIdUsuario(int idUsuario) {
        this.idUsuario = idUsuario;
    }
    public int getIdUsuario() {
        return idUsuario;
    }
    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }
    public String getUsuario() {
        return usuario;
    }
    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }
    public String getPasswd() {
        return passwd;
    }
}

El siguiente paso puede verse en el post de mike, donde configuramos el archivo hibernate.cfg.xml con los datos de la conexión de la base de datos, el usuario, password, etc.

Después vamos a configurar el archivo *.hbm.xml, describiendo la estructura de nuestra tabla y asociandola con los atributos del POJO, quedando de la siguiente manera:

<hibernate-mapping>
    <class dynamic-insert="false" dynamic-update="false" mutable="true" 
name="com.hibernate.pojos.Usuarios" optimistic-lock="version" polymorphism="implicit" 
select-before-update="false" table="USUARIOS">
        <id name="idUsuario" column="IDUSUARIO" type="integer">
            <generator class="sequence">
                <param name="sequence">seq_usuarios
                </param>
            </generator>
        </id>
        <property name="usuario" column="USUARIO" type="string">
        </property>
        <property name="passwd" column="PASSWD" type="string">
        </property>
    </class>
</hibernate-mapping>

En el anterior código XML podemos observar el objetivo de este Post, en el miembro id se está indicando que es de tipo entero y se relaciona con el campo IdUsuario de la tabla usuarios, además el valor que se le asiganrá será una secuencia, el valor que se encuentra dentro del miembro param es el nombre de la secuencia, en este caso seq_usuarios, en esta parte solo ese valor a de cambiarse dependiendo del nombre de tu secuencia.

El código Java sería el siguiente:

try {
   SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
   Session session = sessionFactory.openSession();
   Transaction tx = session.beginTransaction();
   Usuarios usuario = new Usuarios();
   usuario.setUsuario("thom");
   usuario.setPasswd("123456");
   session.save(usuario);
   tx.commit();
   session.close();
} catch (HibernateException e) {
   throw new RuntimeException(e.getMessage());
}

¡Y listo amigos! ¡A disfrutar! (Como diría el Chef Chava de Neurótica.fm).

Problema con Ajax en Internet Explorer

Escrito por blood

Fecha: 10/Octubre/2008

Categoría: Java

Hola, este es un problema muy común para los desarrolladores web, sucede que ciertas ocasiones nuestra aplicación se comporta extrañamente en el muy odiado pero usado Internet Explorer, gran parte de estos problemas se deben a que dicho navegador guarda (o cachea) datos para no hacer demasiadas solicitudes al servidor, lo cual provoca que muchas de nuestras llamadas asincronas den resultados inesperados.

La solución a este problema está del lado del servidor, solo tenemos que agregar los siguientes parametros a la cabecera de nuestro objeto response desde un servlet o un JSP:

response.addHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("pragma", "no-cache");
response.addDateHeader("Expires", -1);

Y listo. (Se agradecen sus comentarios y/o soluciones alternas)

Persistencia de Objetos con Hibernate (Parte 1)

Escrito por miklex

Fecha: 29/Septiembre/2008



Hala a todos!!! (hahaha típico saludo de blood)

En esta ocasión les traigo un “mini tutorial” del manejo de la persistencia de objetos con Hibernate (hahaha también conocido de manera incorrecta como Hiberné, Hibernet ó el muy gracioso Hiberante; si no me creen busquen en Google :p).

Este tutorial he decidido dividirlo en 3 partes, en particular esta entrada se centra en conceptos básicos y en la configuración general de Hibernate. Los post siguientes tratarán de cuestiones que exijen un poco más de trabajo en la configuración y en la programación así como algunos errores comunes que se cometen de manera involuntaria, asi que empecemos por lo esencial.

¿Qué es persistencia?

La persistencia es la capacidad de un lenguaje de programación o entorno de desarrollo para almacenar y recuperar el estado de los objetos de forma que sobrevivan a los procesos que las manipulan. Dicho de otra manera: es conseguir que los datos de un objeto sobrevivan a la ejecución de un proceso padre (en donde fueron creados), para que puedan ser reutilizados por otros procesos.

Existen diversas técnicas para hacer uso de la persistencia, siendo las principales: La Serialización (mediante la interfaz java.io.Serializable de Java), el uso de un motor de persistencia(como Hibernate) o el uso de un manejador de base de datos orientada a objetos.

Pero como dice nuestro título, veremos la persistencia mediante el uso de Hibernate.

¿Qué es un motor de persistencia?

Traducción del Motor de Persistencia

Traducción del Motor de Persistencia

Es un componente de software que realiza la traducción de registos de base de datos relacional a objetos y viceversa. Esta traduccíon es conocida como mapeo o mapping que precisamente es una técnica de programación para convertir el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y el utilizado en la base de datos relacional.

Las principales ventajas del uso de un motor de persistencia son que por una parte, el programa solo ve que puede guardar y recuperar objetos, como si estuviera programado para una base de datos orientada a objetos, y a su vez la base de datos sólo ve que guarda registros y recupera registros como si el programa estuviera dirigiendose a ella de forma relacional. Y tal vez la principal: es posible programar con orientación a objetos, aprovechando las ventajas de flexibilidad, mantenimiento y reusabilidad.

Estos conceptos son necesarios para poder entender el funcionamiento de Hibernate, así que vamos a la acción.

Trabajando con Hibernate

******************************************************************************************************
Para poder usarlo hay que bajar las librerías de Hibernate Core aquí y claro, añadirlas al proyecto
******************************************************************************************************

Es un framework de java, el cual facilita el mapeo de atributos mediante archivos XML que permiten establecer relaciones entre una base de datos relacional y objetos Java, creando un entorno Objeto-Relacional.

Para lograr esto es necesario detallar cómo es el modelo de datos, qué relaciones existen y qué forma tienen. Con esta información Hibernate le permite a la aplicación manipular los datos de la base operando sobre objetos, con todas las características de la programación orientada a objetos. Hibernate convierte los datos entre los tipos utilizados por Java y los definidos por SQL.

Hibernate genera las sentencias SQL y libera al programador del manejo manual de los datos que resultan de la ejecución de dichas sentencias, manteniendo la portabilidad entre todas (o por lo menos la mayoría) de las bases de datos con un ligero incremento en el tiempo de ejecución. Lo que es una ventaja importe, nunca se esta atado a usar siempre un mismo manejador de base de datos.

Hibernate está diseñado para ser flexible en cuanto al esquema de tablas utilizado, para poder adaptarse a su uso sobre una base de datos ya existente. También ofrece un lenguaje de consulta de datos llamado HQL (Hibernate Query Language), al mismo tiempo que una API para construir las consultas programáticamente (conocida como “criteria”).

Hablando un poco de la composición de Hibernate, pueden destacar 3 módulos:

Proveedor de Conexiones: Este administrador provee un manejo eficiente de las conexiones a las base de datos. Las conexiones son la parte más costosa al momento de interactuar con la base de datos pues requieren de muchos recursos al momento de abrir o cerrar la conexión. Sin embargo, los desarrolladores de Hibernate recomiendan no usar este administrador en un ambiente de producción, por lo cual, en la siguiente parte hablaremos un poco de C3P0, un framework de Java que lleva a cabo esta tarea.

Fabrica de Transacciones: Este servicio provee al usuario la habilidad de ejecutar más de una sentencia a la base de datos a la vez.

Fábrica de Sesiones (Session Factory): La Fábrica de Sesiones es aquella que se encarga de decir al sistema, donde se encuentran todos los ficheros de mapeo de Hibernate, el dialecto de Hibernate a utilizar (varía según el gestor de base de datos). De esta componente se generan los objetos Session de Hibernate, los cuales son los encargados de realizar todas las operaciones sobre la base de datos.

Ahora bien, empecemos con la verdadera acción, para poder definir nuestro modelo de datos desde el paradigma orientado a objetos es necesario crear clases llamadas POJO (Plain Old Java Object). Estas clases representan nuestras tablas de la base de datos pero claro, como objetos. Lo único que necesitan estas clases son métodos SET y GET por cada uno de los atributos de la tabla, como su nombre lo indica, set es el método que asigna el valor a la variable, y get el que lo obtiene. Ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Contacto{
      prívate int idContacto;
      private String nombreContacto;
      private String telefonoContacto;
      private String direccionContacto;  
 
public Contacto(){}
public void setIdContacto(int valor){
	this.idContacto=valor;
}
public int getIdContacto(){
	return idContacto;
}
public void setNombreContacto(String valor){
	this.nombreContacto=valor;
}
public String getNombreContacto(){
	return nombreContacto;
}
public void setTelefonoContacto(String valor){
	this.telefonoContacto=valor;
}
public String getTelefonoContacto(){
	return telefonoContacto;
}
public void setDireccionContacto(String valor){
	this.direccionContacto=valor;
}
public String getDireccionContacto(){
	return direccionContacto;
}
}

Lo siguiente será definir la estructura de nuestra base de datos en un archivo XML llamado nombre_del_archivo.hbm.xml (OJO (u¬¬) nombre_del_archivo es cualquiera que deseen). Este archivo es conocido como archivo de mapeo (o mapping), este archivo contiene (tan detallado como se necesite) la estructura de la base de datos y a su vez a que clase POJO va asociada cada tabla.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="mipaquete.Contacto" table="Contacto">
   <id name="idContacto" type="integer" column="idContacto" >
   <generator class="assigned"/>
  </id>
  <property name="nombreContacto" column="nombreContacto" type="string"/>
  <property name="telefonoContacto" column="telefonoContacto" type="string"/>
 <property name="direccionContacto" column="direccionContacto" type="string"/>
 </class>
</hibernate-mapping>

Vamos a entender la estrucura del archivo de mapeo; a primera instancia notese que inicia con la etiqueta hibernate-mapping :p, a partir de aquí pueden ser agregadas cuantas Tablas(Clases) deseemos mapear, haciendo uso de la etiqueta class y de algunas de sus propiedades:

name: Se debe indicar la clase POJO que se utilizará para el mapeo.
table: Es el nombre de la tabla en la base de datos.
mutable: Especifica si las instancias de esa clase pueden sufrir cambios.
y algunos otros…

Lo siguiente es describir las propiedades de la clase, lo primero es definir la llave primaria (o id). La llave puede ser especificada de muchas formas distintas, si es asignada, si se obtiene por medio de alguna secuencia(sequence), algoritmos hi/lo, etc.; estas formas dependen del SMBD, pero las más comunes siempre serán asignarlas manualmente o por medio de una secuencia.

La etiqueta id, tiene como principales atributos: name: en cual especifica el atributo de la clase POJO que corresponde, type: el tipo de dato a utilizar; column: el nombre del campo de la tabla de la base de datos. Y para la definición del tipo de llave primaria hace uso del miembro generator, mediante su atributo class es como le indicamos a Hibernate como es nuestra PK.

Lo siguiente será enlistar todas las propiedades restantes mediante la etiqueta property. Property tiene como principales attributos name (nombre de del atributo de la clase POJO), type(tipo de dato), column(nombre de la columna de la tabla de BD), length(longitud del campo) y not-null(nulo??), pero claro tiene algunas más.

Como vemos no resulta muy difícil generar este archivo, pero sí llega a ser tedioso cuando tenemos una cantidad considerable de tablas que deseamos mapear.

Teniendo definida la estructura de la base de datos es momento de configurar Hibernate, claro, creando un archivo XML llamado hibernate.cfg.xml.

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--1--><property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver
        </property>
<!--2--><property name="hibernate.connection.url">jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:XX
        </property>
<!--3--><property name="hibernate.connection.username">nombre_usuario
         </property>
<!--4--><property name="hibernate.connection.password">password
        </property>
<!--5--><property name="show_sql">true
        </property>
<!--6--><property name="dialect">org.hibernate.dialect.OracleDialect
        </property>
        <!-- Archivos de Mapeo -->
       <mapping resource="contacto.hbm.xml"/>
</session-factory>
</hibernate-configuration>

Hibernate proporciona un gran número de propiedades para poder realizar su configuración, pero de momento solo nos centraremos en las necesarias para lograr un buen funcionamiento, básico, pero bueno. Observemos el ejemplo, la primera propiedad hace referencia al driver de conexión para la BD que utilizaremos, en el ejemplo se hace para Oracle. En la segunda propiedad se especifica la cadena de conexión que se utilizará. Las propiedades 3 y 4 son datos de autenticación del usuario o esquema de la BD. La 5ta propiedad es opcional, y para fines de ejemplo la colocamos; su función es imprimir en consola la sentencia HQL o SQL ejecutada por Hibernate. En la 6ta propiedad se debe indicar el diálecto de la base de datos que utilizaremos, es necesaria para que Hibernate puede realizar la traducción correcta de los tipos de datos y sintaxis de las consultas.

En el atributo resources de mapping indicamos la ubicación del archivo de mapeo creado anteriormente. Y con esto estamos listos para empezar a realizar operaciones sobre la base de datos. Ejemplo

....
private void guardarObjeto(MiObjeto obj) {
    try {
 1)      SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
 2)      Session session = sessionFactory.openSession();
 3)      Transaction tx = session.beginTransaction();
 4)       session.save(obj);
 5)       tx.commit();
 6)      session.close();       
    } catch (HibernateException e) {
        throw new RuntimeException(e.getMessage());
    }
}
....

A continuación se describe el ejemplo anterior:


1)Se inicializa la Fábrica de Sesiones configurándola a partir del archivo hibernate.cfg.xml.


2)Se obtiene una sesión de la Fábrica de Sesiones con la que realizarán las operaciones.

3)Se inicia una transacción con la base de datos, esta transacción es la encargada de mantener el acceso a los datos y de realizar un commit para terminar con la operación o un rollback en caso de haberse generado un error.

4)Se ejecuta la operación deseada, en el ejemplo se usa el método save del objeto session, que es lo equivalente a realizar un insert en la base de datos. Si se quisiera realizar una búsqueda bastaría con usar load(clase.del.objeto, id_a_buscar). Una actualización se realiza con update(objeto) o con saveOrUpdate(objeto), la diferencia radica en que saveOrUpdate inserta el registro en caso que éste no exista. Y para eliminar bastará con usar delete(objeto).

5)Se cierra la transacción con un commit, Este paso es muy importante, pues al no realizar el commit, ninguna de los cambios de guardará en la base de datos.

6)Se concluye la operación al cerrar la sesión y libera todos sus recursos.

Aquí concluye esta primera parte, se ha visto solamente la parte básica del funcionamiento de hibernate; en los próximos días estaré publicando la segunda parte con un ejemplo más completo, con las operaciones tipicas de una aplicación CRUD (Create, Retrieve, Update and Delete) en una sola clase y algunos detalles finos en el manejo del objeto Session y del archivo de mapeo.

Como comentario final a este post, los errores más comunes en esta parte surgen en las clases POJO y en el archivo de mapeo, ya sea por errores de dedo o porque falta algun método set o get para un atributo, Así que cuidado, igualmente no esta de más revisar los propiedades del hibernate.cfg.xml
.

Que les aproveche, saludos!!!

Ja na!!

ミゲエル

Algo sobre JBoss e integración con NetBeans

Escrito por TheRealThom

Fecha: 26/Septiembre/2008

Categoría: GNU/Linux, JBoss

¡Compañeros de múltiples batallas! Quien va a postear, les saluda.

La instalación de otro servidor de aplicaciones para el despliegue de nuestros proyectos es necesario cuando buscamos beneficios particulares, integración de librerías específicas o simplemente nuevos aires. Glassfish es un servidor de aplicaciones que sin duda tiene soporte para mútiples herramientas y no dudo que SUN esté intentándo posicionarse en el mercado con éste, sin embargo no es la única opción, en mi particular punto de vista JBoss Application Server es una alternativa buena tanto para proyectos pequeños, como algunos más ambiciosos. Nosotros lo estamos utilizando para el despliegue de una aplicación con objetivos recaudatorios para el Instituto de la Función Registral del Estado de México y nos ha funcionado muy bien, ya que nos ha permitido integrar tecnologías como Hibernate, pools de conexiones, cachés de nivel uno y nivel dos (Para lo cual el poderoso Miklex se ha tenido que convertir en super saiyajin). En esencia, trabaja mucho mejor que el desastroso OAS 10g, el cual nos dió mas de 17 dolores de cabeza.

Ahora bien, ¿Y dónde está lo de la integración con NetBeans?… Ahí va, todos tranquilos.

Siguiendo con las bondades de NetBeans 6.1 (Que no son únicas, ya que Eclipse y muchos más también las tienen), las cuales nos permiten la integración de nuevos servidores de aplicaciones en nuestro entorno de desarrollo, podemos agregar JBoss con unos cuantos pasos.

0. Instalar el jdk1.5.
1. Exportar las variables de entorno para el jdk1.5, agregandolas a final del archivo .bashrc del home del usuario con el que queremos ejecutar JBoss, en mi caso el jdk lo tengo bajo /opt, por lo cual los comandos que me corresponden son:

   export JAVA_HOME=/opt/jdk1.5.0_14
   export PATH=$PATH:$JAVA_HOME/bin

2. Descargar JBoss de www.jboss.org
3. Posicionarse en el directorio en donde se descargó el archivo, moverlo a un directorio conocido, puede ser bajo /opt y descomprimirlo.

   $ mv [DIR]/jboss-4.2.2.GA.zip /opt
   $ cd /opt
   $ unzip jboss-4.2.2.GA.zip
   $ cd jboss-4.2.2/

4. Abrir NetBeans 6.1, en el menú ir a Tools/Servers/Add Server. Ahí podrás seleccionar el servidor de tu preferencia, en este caso, JBoss Application Server.

5. En la siguiente ventana, deberemos elegir el directorio en donde se encuentra contenido el JBoss que descargamos y descomprimimos.

6. La tercera ventana no permite muchos cambios, el parametro Default quiere decir que será dentro de la carpeta default/deploy que deberás alojar las aplicaciones ya que al correr el servidor, en ese directorio serán buscadas.

7. Ahora tendremos agregado el JBoss al NetBeans.

8. Falta un paso muy importante, que es indicarle a nuestros proyectos que queremos usar JBoss como servidor de aplicaciones y no GlassFish, para ello daremos click derecho sobre el proyecto/properties. En Run indicaremos nuestra nueva preferencia.

¡Y listo!

Lo último es iniciar el servidor de aplicaciones en la pestaña Services como se muestra en la siguiente figura.

JBoss es un mundo en que vale la pena adentrarse, es un servidor de aplicaciones bastante bueno, con mucho soporte y múltiples librerías para aquellas noches de insomnio, así que… ¡¡Have Fun!!

Formato de fechas en Java

Escrito por blood

Fecha: 26/Septiembre/2008

Categoría: Java

Bueno, esto de las fechas en Java es muy divertido, hay ocasiones en las que necesitamos que la fecha tenga un formato específico, por ejemplo cuando insertamos un campo de tipo fecha de alguna base de datos.

Lo primero que debemos hacer es crear un objeto de la clase java.text.SimpleDateFormat a cuyo constructor le enviaremos como parametro el formato que deseamos en forma de cadena. Por ejemplo:

java.text.SimpleDateFormat Formateador = new SimpleDateFormat("dd/MM/yyyy");

Podemos combinar las opciones de la cadena para lograr el formato deseado, por ejemplo:

dd.MM.yy será 01.05.08
dd.MM.yyyy será 01.05.2008
dd-MM/yyyy G será 01-05/2008 AD
EEE, MMM, ''YY será Wen, Sep, '08
hh:mm:ss será 12:20:16
hh:mm:ss:SSS será 13:10:06:987
hh.mm.ss z será 12:20:16 PDT
h:mm:ss a será 8:30 PM

Y algunas otras.

Después generamos un objeto de la clase java.util.Date por ejemplo para obtener la fecha actual:

java.util.Date Hoy = new Date();

y por último le aplicamos el formato que definimos:

String FechaFormateada = Formateador.format(Hoy);

Y eso es todo, espero que les sea de utilidad.

Ejemplo con JSPs, Servlets, AJAX (JQuery) y JSON

Escrito por TheRealThom

Fecha: 10/Septiembre/2008

Categoría: JQuery, Java

Tags: ,

WTF?

Bueno, por muy rebuscado que suene, no es nada del otro mundo, sigue siendo conocimiento humano :).

El tema que nos atañe hoy es realizar un ejemplo de una suma cualquiera que implemente una llamada asíncrona al servidor entre un JSP y un Servlet usando Ajax, o mejor dicho, la librería JQuery, y recibir la respuesta en formato JSON.

Lo primero es crear una aplicación web desde nuestro IDE favorito, como de costumbre yo lo realizaré en NetBeans, cuando creamos el proyecto Web, se crea por default la página index.jsp, dentro de esta, vamos a importar la libreria JQuery que descargamos, en cualquiera de sus 3 versiones, por lo único que varian es por el tamaño, ya que en la que pesa menos Kb se encuentra condensado el código fuente.

Importamos la libreria de la manera siguiente:

<script src=”jquery.js” type=”text/javascript”></script>

Dentro de las etiquetas body insertamos el siguiente codigo:

<input id=”txtOp1″ type=”text” />
+
<input id=”txtOp2″ type=”text” />
<br/>
<input id=”btnSumar” type=”button” value=”Sumar” />
<div id = “resultado”></div>

Ahora escribiremos la función que se encargará de la llamada asíncrona al servidor y que pertenece a la librería de Jquery. El siguiente código debe ir dentro de etiquetas script indicandole el type y el language de javascript.

$(document).ready(function(){
   $("#btnSumar").click(function() {
      $.getJSON (
         "MiServlet",
         { op1 : $("#txtnOp1").val(),
            op2 : $("#txtOp2").val()
         },
         function(data) {
            var resultado = data.mensaje;
             $("#resultado").html("La suma es "+resultado);
         }
      );
   });
});

Después de que tenemos todo el código anterior dentro de nuestra página JSP, procederemos a crear un servlet al cual llamaremos MiServlet, o en caso de querer llamarlo de otra manera, cambiaremos el primer parametro de la función getJSON y pondremos el nombre que hayamos elegido.

AHora bien, vamos a agregar el siguiente codigo en el servlet, donde nosotros consideremos, dentro del método doGET, doPOST o processRequest.

try {
   PrintWriter out = response.getWriter();
   int op1 = new Integer(request.getParameter("op1")).intValue();
   int op2 = new Integer(request.getParameter("op2")).intValue();
   String respuestaJSON = "";
   int resultado = op1 + op2;
   out.println(" { mensaje : \""+resultado+"\"} ");
} catch (Exception e) {
   System.out.println("Error: "+e.toString());
} finally {
   out.close();
}

Con esto vamos a lograr que el resultado de la suma se haga sin que se recargue la página, ya que estamos indicando que ese resultado se muestre dentro del div del mismo nombre.

Y Ahí tenemos el ejemplo, pero.. ¡Qué simplón eres Thom! Esto está de risa, parece que oigo que todos me lo dicen, pues para darle un poco más de sabor al caldo, les propongo que este ejemplo se combine con el de Web Services, para que la definición del ejercicio quede de la siguiente manera.

Realización de un Web Service que ejecute una suma y la publique, para que un consumidor la implemente mediante JSPs, Servlets, JQuery y JSON.

Para muchos seguirá siendo cosa de nada, pero habrá aquellos para los que represente algunas horas de trabajo, a ellos les digo ¡¡Con todo el power!! como dice Chava, el director de mi área de informática.

Directorio compartido usando nfs en ubuntu 8.04

Escrito por blood

Fecha: 10/Septiembre/2008

Categoría: GNU/Linux

Bueno, vamos a ver como compartir un directorio sin usar samba, esta vez usaremos nfs.

LADO DEL SERVIDOR

Instalar los siguientes paquetes:

portmap
nfs-common
nfs-kernel-server

Editar el archivo /etc/exports

Las lienas que agreguemos aqui tienen las siguientes posibles sintaxis:

directorio_a_compartir IP1(opcion,opcion) IP2(opcion,opcion)

o

directorio_a_compartir RED/MASCARA(opcion,opcion)

en donde las opciones son:

ro | rw : Con la opción ro el directorio será compartido de solo lectura. Esta opción está por defecto.y con la opción rw se permitirá tanto acceso de lectura como de escritura.

sync | async : sync es la opción recomendada, ya que se ha de respetar el protocolo NFS, es decir, no se responden a las peticiones antes de que los cambios realizados sean escritos al disco. Con la opción async se permite mejorar el rendimiento y agilizar el funcionamiento global, pero supone un riesgo de corrupción de archivos o del sistemas de ficheros en casos de caidas del servidor y/o errores de éste.

root_squash | no_root_squash | all_squash : root_squash indica que un cliente identificado como root tendrá acceso al directorio con privilegios de un usuario anónimo. Si seleccionamos la opción no_root_squash evitaremos esto, y si indicamos all_squash, entonces aplicaremos esto último a todos los usuarios, no sólo root.

subtree_check | no_subtree_check : indica si sera recursivo en el arbol de directorios.

un ejemplo integrador

/home/usuario/docs 192.168.0.2(rw,async,all_squash,subtree_check) 192.168.0.5(ro,async,root_squash,subtree_check)
/home/usuario/publico 192.168.0.0/255.255.0.0(rw,async,all_squash,subtree_check)

Editar el archivo /etc/hosts.deny

Este archivo tiene la siguiente sintaxis:

servicio: host [o red/mascara_subred], host [o red/mascara_subred]

para tener un poco de seguridad negaremos a todos los hosts de la red el acceso a portmap que es un servicio necesario para acceder via nfs a nuesta máquina.

portmap:ALL

Editar el archivo /etc/hosts.allow

Con la misma estructura de hosts.deny pero este archivo especifica los hosts que tendran acceso a un servicio en nuestra máquina, por ejemplo daremos permiso a toda la red 192.168.0.0 para acceder a portmap y nfs:

portmap:192.168.0.0/255.255.0.0
nfs:192.168.0.0/255.255.0.0

Reiniciar los servicios

Ejecutamos los siguientes comandos para reiniciar los servicios necesarios:

/etc/init.d/nfs-common restart
/etc/init.d/nfs-kernel-server restart
/etc/init.d/portmap restart

LADO DEL CLIENTE

Instalar los siguientes paquetes:

portmap
nfs-common

Montar el directorio compartido en un directorio local

Utilizaremos el comando mount especificando el tipo del sistema de archivos y los puntos de montaje.

sudo mount -t nfs IP_REMOTA:/directorio/compartido /directorio/local

Un ejemplo:

sudo mount -t nfs 172.16.0.2:/home/usuario/publico /home/oscar/compartido

Listo!!!