Sequences 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).

1 Star2 Stars3 Stars4 Stars5 Stars (Aún no hay votos)
Loading ... Loading ...

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)

1 Star2 Stars3 Stars4 Stars5 Stars (Aún no hay votos)
Loading ... Loading ...

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!!

ミゲエル

1 Star2 Stars3 Stars4 Stars5 Stars (Aún no hay votos)
Loading ... Loading ...

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!!

1 Star2 Stars3 Stars4 Stars5 Stars (Aún no hay votos)
Loading ... Loading ...

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.

1 Star2 Stars3 Stars4 Stars5 Stars (Aún no hay votos)
Loading ... Loading ...

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.

1 Star2 Stars3 Stars4 Stars5 Stars (Aún no hay votos)
Loading ... Loading ...

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!!!

1 Star2 Stars3 Stars4 Stars5 Stars (Aún no hay votos)
Loading ... Loading ...

Deploying Web Services fuera de localhost

Escrito por TheRealThom

Fecha: 10/Septiembre/2008

Categoría: Web Services

Pero que caray, ¿Quién diría que esto prodría causar problemas? pues si, y muchos, sin embargo la solución es muy simple.

Caso:

Hice un web service tal cual Thom me guió en otro Post de este mismo blog, sin embargo intento desplegarlo en un servidor de prueba, de producción, en una tostadora o sandwichera, la cuestión que es fuera de mi máquina, y no me muestra nada! estoy desesperado, Thom, ¿Qué puedo hacer? Help me!!

Solución:

Está bien pequeño saltacerros, Thom te ayudará una vez más.

Lo que sucede es que cuando nosotros creamos la referencia al web service desde el consumidor, el archivo WSDL al que estamos accediendo, tiene la ruta http://localhost:8080/Proyecto/Servicio?wsdl, y cuando intentamos hacer el deploy en otra máquina cuya IP con la que se levanta el servidor de aplicaciones es distinta a 127.0.0.1 (localhost), el consumidor busca el archivo WSDL con esa misma ruta, lo cual no va a encontrar y nos saldrá una espantosa excepción.

Aún para ser más específico, yo tengo una máquina con la IP 172.16.2.18, con la cual levanté JBoss para que las demás maquinas de mi red local pudiera acceder al servidor de aplicaciones, cuando despliego el web service y el consumidor, este último va a buscar en 127.0.0.1, cuando el WSDL está sobre 172.16.2.18:8080…

Para que el web service funcione, tenemos que realizar el siguiente paso en el código que insertamos al referenciar un web service desde el consumidor, que fue el siguiente:

16
17
18
19
20
21
22
23
24
25
26
try {
   com.ws.HolaMundoWSService service = new com.ws.HolaMundoWSService();
   com.ws.HolaMundoWS port = service.getHolaMundoWSPort();
   // TODO initialize WS operation arguments here
   java.lang.String nombre = "Thom";
   // TODO process result here
   java.lang.String respuesta = port.saludar(nombre);
   out.println(respuesta);
} catch (Exception ex) {
   // TODO handle custom exceptions here
}

Modificaremos los argumentos que recibe el constructor com.ws.HolaMundoWSService(), le enviaremos los siguientes valores.

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
try {
 
   //String servidor = "localhost";
   String servidor = "172.16.2.18";   
   URL url = new URL("http://"+servidor+":8080/HolaMundoWSApp/HolaMundoWS?wsdl");
   QName qname = new QName("http://ws.com/", "CalculatorWSService");
 
   service = new com.ws.CalculatorWSService(url, qname);
 
   com.ws.HolaMundoWS port = service.getHolaMundoWSPort();
   // TODO initialize WS operation arguments here
   java.lang.String nombre = "Thom";
   // TODO process result here
   java.lang.String respuesta = port.saludar(nombre);
   out.println(respuesta);
} catch (Exception ex) {
   // TODO handle custom exceptions here
}

Lo que estamos haciendo es mandarle como argumentos la URL en la que buscaremos el archivo WSDL, ademas del paquete y el nombre del servicio. Esto, aunque simple… me dejó algunas malas secuelas nerviosas, nada fuera de lo de cada día :P

¡¡Hasta la victoria!!

1 Star2 Stars3 Stars4 Stars5 Stars (Aún no hay votos)
Loading ... Loading ...

Generar Web Services en Netbeans 6.1

Escrito por TheRealThom

Fecha: 10/Septiembre/2008

Categoría: Web Services

Después de digerir la teoría sobre Web Services, me dispuse a buscar como aplicar todo aquel conocimiento acumulado en las aplicaciones que actualmente estamos desarrollando en el IFREM, que mejor que separando la capa de persistencia (Hecha en Hibernate) de la aplicacion principal, con la finalidad de que las demás aplicaciones que se vayan generando posteriormente la usen, sin tener que implementar los POJOs, ni los DAOs de nuevo en cada proyecto, esto nos ayuda a reciclar código y a que los .war de los proyectos pesen menos, eso aunque suena vanal, es importante cuando la velocidad de subida no es del todo adecuada para cuando el proyecto pesa megas y megas…

Lo primero que se debe hacer antes de adentrarse en los web services es conocer varias definiciones, como WSDL, SOAP, SOA, UDDI, JAX-WS, BPEL, RESTful, entre otros, si bien, para proyectos pequeños no todos se aplican a la vez, es bueno conocer al enemigo (¿o a nuestra nuevo amante?).

NetBeans es para mis gustos uno de los mejores IDEs para Java, en su versión 6.1 ha incorporado nuevas funcionalidad para web services. Cuando vamos empezando con esto, lo que más deseamos es ver conectados proveedor con consumidor, no importando que hagan entre ellos, digamos que es un tipo de vouyerismo informático.

Para empezar, vamos a crear un proyecto web en nuestro NetBeans:

Le vamos a nombrar HolaMundoWSApp o como se nos venga en gana.

El paso siguiente es el que empieza a ser interesante, damos click derecho sobre la carpeta principal del proyecto y elegimos Web Service tal cual se observa en la imagen.

Le asignaremos un nombre al Web Service y lo pondremos en un paquete, es de buena costumbre ser ordenados en la organización del código de nuestro proyecto.

La ventana que nos aparece muestra un Wizard para la creación de Web Methods.

Damos click en el botón Add Method… y le asignamos el nombre, así como los parámetros que recibirá el método, además del valor de retorno que el consumidor recibirá, resultado de su petición, en este caso ambos, parametro y valor de retorno, serán String.

Netbeans nos proporciona una herramienta sencilla para la generación de los métodos y sus atributos, sin embargo la funcionalidad del método la escribiremos nosotros a código pelao!

Si damos click en el botón Source veremos qué es lo que realmente está haciendo Netbeans, encontramos defiinida la clase, así como el método, sus parámetros y valor de retorno, tal cual los configuramos en el paso anterior, dentro del método escribiremos:

@WebMethod(operationName = "saludar")
    public String saludar(@WebParam(name = "nombre") String nombre) {
        return "Hola "+nombre+"!!";
    }

Estamos tomando el nombre que recibimos de parámetro y le estamos concatenando un Hola, que mandamos como valor de retorno, poca ciencia, ¿no?

Para que el consumidor pueda comunicarse con el Web Service, éste debe estar desplegado en el Servidor de aplicaciones, lo cual es el siguiente paso.

Desplegamos la aplicación, en mi caso esto se realizará dentro del servidor de aplicaciones JBoss que es con el que trabajo, aunque tambien puede ser Glassfish, que viene por default con el Netbeans completo.

Una vez que se ha desplegado, es momento de crear a nuestro consumidor, añadimos un nuevo proyecto web tal cual indica la primera figura de este post y le asignamos algún nombre con el que nos gustaría bautizar nuestro primer Consumidor de Web Service.

El siguiente paso es agregar dos librerías necesarias para que la conexión se realize adecuadamente. Damos click derecho sobre nuestro nuevo proyecto, propiedades y librerias.

Añadimos las que se observan en la figura anterior.

Después damos click derecho sobre el proyecto, y creamos nuestro Web Service Client…

AHora bien, ya que lo creamos, nos aparece una ventana en donde se nos pide que elijamos la ruta donde se encuentra el archivo WSDL que contiene la definición de nuestro Web Service.

Si dan un click en el botón Browse, aparecerá otra ventana y en ella, nuestro primer proyecto.

Elegimos tal cual se ve en la figura anterior, esto nos creará una referencia al web service al que accederemos.

Como se puede observar, la referencia contiene la definición completa del web service, en la última parte de la rama, se encuentra el método saludar, que si bien recuerdan, fue el que creamos en el primer proyecto.

El siguiente paso es muy simple, seleccionen el método saludar, y arrastrenlo al punto en donde quieran que se ubique, en este caso será un jsp, dentro de la etiqueta body de html.

El código que aparecerá será muy parecido al siguiente:

            try {
                com.ws.HolaMundoWSService service = new com.ws.HolaMundoWSService();
                com.ws.HolaMundoWS port = service.getHolaMundoWSPort();
                // TODO initialize WS operation arguments here
                java.lang.String nombre = "Thom";
                // TODO process result here
                java.lang.String respuesta = port.saludar(nombre);
                out.println(respuesta);
            } catch (Exception ex) {
                // TODO handle custom exceptions here
            }

Dije muy parecido, porque yo hice dos modificaciones, le cambie el valor a la variable nombre y le puse Thom, además de que en lugar del result que aparece por default, le puse la respuesta que nos manda el web service.

Por último nos queda probar nuestro consumidor, con el servidor de aplicaciones corriendo y nuestro web service desplegado, ejecutamos el consumidor, al abrirse el navegador que tengamos configurado por default, nos aparecera algo como lo que se muestra en la siguiente figura.

¡Y listo! En caso de que hayamos seguido todas las indicaciones al pie de la letra y no exista un ente maligno estropeando nuestro código, todo habrá salido bien.

Ahora, a echar a volar la imaginación, el mundo de los web service es amplio y nunca está de más saberlos dominar, antes que se nos vayan de las manos.

¡Felices madrugadas!

1 Star2 Stars