Mostrando entradas con la etiqueta APIS de Java. Mostrar todas las entradas
Mostrando entradas con la etiqueta APIS de Java. Mostrar todas las entradas

martes, 24 de agosto de 2010

Revelando el misterio de los Web Services en Java - Parte I

Al parecer el hecho de saber de web Services en Java es todo un lujo.. Existe poca información clara al respecto y por lo general los programadores java no saben por donde empezar cuando se les habla de web services. Es por la necesidad de tener información realmente útil y fácil de entender que nace este post .. Realmente considero que este artículo les va ser de mucha ayuda cuando requieran empezar con el uso de los Servicios Web en Java.

Personalmente aún no he tenido la oportunidad de participar en proyectos donde requieran el uso de los web services, con lo cúal aprendería mucho más del uso de estos.

Empezaremos este artículo viendo de forma general la gran importancia que tienen los Servicios Web.

Servicio Web.-  en inglés Web Service, es un conjunto de protocolos y estándares que sirven para intercambiar datos entre diferentes aplicaciones, pudiendo estar desarrolladas en distintos lenguajes de programación y siendo ejecutadas en diferentes plataformas.  En relación a ello nace el concepto de SOA (Arquitectura Orientada a Servicios).


ws.png

Pues bien, una vez conocida la definición empezaremos a implementarlo en Java. Es en este punto en donde empiezan nuestras interrogantes.
  •  ¿Es mejor AXIS2 o JAXWS?
  • ¿Cómo genero el ws a partir del wdsl o de las clases Java?
  • ....
Pues bien empezaremos a resolver nuestras dudas.

Con respecto a a nuestra primera interrogante de ¿Qué elegir, Axis2 o JAXWS?

Empezaremos haciendo una comparativa entre los frameworks que podemos utilizar para el desarrollo de un ws, ya sea Axis2 o JAXWS. Existen otras opciones pero son poco conocidas aún.

Ventajas  y desventajas del uso de ambos:

  • Con Axis2 necesitamos tener instalado al menos la versión 1.4 del jdk, mientras que para JAXWS al menos necesitamos la versión 1.5 como mínimo. Este puede ser un factor determinante, en el caso de que nuestro servidor de aplicaciones utilice la versión 1.4 y no podamos migrar a una versión posterior.

  • Si generamos el WS a partir de las clases Java, no existen muchas diferencias entre una y otra solución.Aunque el archivo .wsdl que genera Axis2 es bastante engorroso y complicado de analizar (hay que tenerlo en cuenta a la hora de que alguien tenga que crear una aplicación cliente que se conecte a nuestro WS a partir del wsdl que nosotros le proporcionemos).

  • Si la estructura de los mensajes SOAP es más compleja, o deseas generar tu mismo el wsdl para tener más control sobre los mensajes SOAP (cosa que se recomienda), es preferible utilizar JAXWS. El código que genera Axis2 es realmente “infumable”. Genera clases hasta por las puras clases de estilo clase_1, clase_2, así como un montón de clases anidadas. No sé si todo esto habrá cambiado en las versiones posteriores, pero desde luego en la versión que conosco(1.3), la legibilidad y reutilización del código era penosa. El código generado esta lleno de warnings. En fin todo bastante engorroso. Sin embargo en JAXWS, al utilizar anotaciones, todo queda mucho más límpio y claro. Desde luego, este punto es el que me hizo preferir JAXWS antes que Axis2.

  • JAXWS al ser de Sun, podríamos decir que es más estandar que Axis2 que es de Apache
En conclusión, recomiendo usar JAX-WS a menos de que el servidor tenga la versión 1.4.x del jdk y no se pueda migrar, en dicho caso es recomendable usar Axis2. Sin embargo, si el servidor tiene 1.5.x o superior de jdk no existe mejor opción que usar JAX-WS.
Para descargar Axis2 visitar : apache.org/axis2
Para descargar JAX-WS visitar: jax-ws.dev.java.net

Este post continuará ....

jueves, 3 de junio de 2010

Usando javaMail - API de envio de correos en Java

En el mundo del desarrollo de Sistemas de Información siempre existe la necesidad de enviar correos de distintas formas y maneras. En mi experiencia  profesional he necesitado de este medio en distintas ocasiones, como por ejemplo:


  • Al registrarse un usuario en el sistema de ventas, en el acto se le envía un email al usuario pidiéndole que confirme la existencia de su correo electrónico o también se le puede enviar el catálogo con los distintos productos que ofrece la empresa.

  •  Correos masivos a los distintos usuarios de nuestra base de datos.

  • Programar el envío automático de correos, en una especie de campaña de ventas.
Como podemos observar, en la actualidad, la importancia de el envío de correos desde el aplicativo tiene una importancia vital para la ejecución de las distintas estrategias de marketing y fidelización de clientes trazadas por las diferentes empresas.


Por esta razón, la siguiente pregunta cae por su propio peso : ¿Cómo podemos enviar correos electrónicos desde Java?

correos.jpg

Empezaremos este artículo definiendo al API JavaMail.

JavaMail se trata de una librería desarrollada por SUN encaminada al envío de correos electrónicos directamente desde tu aplicación Java. El uso de ésta librería es muy sencillo pero detallaremos paso a paso como realizar la instalación y uso de ella.
JavaMail implementa el protocolo SMTP (Simple Mail Transfer Protocol) así como los distintos tipos de conexión con servidores de correo -TLS, SSL, autentificación con usuario y password, etc.

JavaMail no se incluye en la JDK ni en la JRE, sino que debe conseguirse como un paquete externo.


Empezando a armar la Aplicación

Una vez descargado el API, añadimos el archivo mail.jar  v1.4.x a nuestro proyecto y de ser necesario también añadir activation.jar  v1.0.2 .

Pues bien, ahora procederemos a implementar un aplicativo que permita el envío de correos usando el protocolo SMTP de nuestra cuenta en gmail; sin embargo, si contamos con un servidor de correos personal será mucho mejor usar ese (dominio personal).


* Clases y métodos a utilizar

Clase Properties: Ésta clase es la encargada de almacenar las propiedades de la conexión que vamos a establecer con el servidor de correo Saliente SMTP.
Propiedades a utilizar:
  1. Protocolo a utilizar para el envío de correos.
  2. Dirección del servidor de correo.
  3. Indicar si se necesita autenticar o no.
  4. Puerto SMTP.
  5. Valor booleano de habilitación TLS.
  6. Email del emisor del mensaje.
  7. Usuario de acceso al servidor SMTP
Clase Session: De alguna forma representa la conexión con el servidor gmail de correo. Hay que obtenerla pasándole los parámetros de configuración para el servidor de correo - gmail en nuestro caso-.

Clase MimeMessage: Aquí formaremos el mensaje que deseamos enviar.


Clase Transport: Clase para el envío de mensajes.

 
* Aplicativo para el envío de correos

Archivo smtp.properties : Archivo que contiene los parámetros de configuración.Ubicado en el paquete src/resource

#SMTP configuration
mail.transport.protocol=smtp
mail.host=smtp.gmail.com
mail.smtp.auth=true
mail.smtp.port=465
mail.smtp.socketFactory.port=465
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
mail.smtp.socketFactory.fallback=false
mail.smtp.quitwait=false
mail.smtp.mail.sender=tuCorreo@gmail.com
mail.user=tuCorreo@gmail.com
mail.password=tuClaveGmail
mail.email=tuCorreo@gmail.com

Clase SMTPConfig.java : Clase reutilizable para el envío de email.
package pedro.rios.mail;

import java.security.Security;
import java.util.Properties;
import java.util.ResourceBundle;

import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


/**
 * @author pedro Rios
 * @date 10/12/09
 * 
 */
public class SMTPConfig {

/**
  * @param titulo : titulo del mensaje
  * @param mensaje : Cuerpo del Mensaje
  * @param paraEmail : Email receptor del mensaje
  * @return true si el envío es conforme y false si no es así.
  */
 
 public static synchronized  boolean sendMail(String titulo, String mensaje, String paraEmail) { 
  boolean envio=false;
  
  try {
   
   //carga del archivo smtp.properties
   final ResourceBundle  props = ResourceBundle.getBundle("resource.smtp");
   
   Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
   
   //Propiedades de la conexion
   Properties propiedades = new Properties();
   propiedades.setProperty("mail.transport.protocol",  props.getString("mail.transport.protocol"));
   propiedades.setProperty("mail.host",props.getString("mail.host"));
   propiedades.put("mail.smtp.auth",props.getString("mail.smtp.auth"));
   propiedades.put("mail.smtp.port",props.getString("mail.smtp.port"));
   propiedades.put("mail.smtp.socketFactory.port",props.getString("mail.smtp.socketFactory.port"));
   propiedades.put("mail.smtp.socketFactory.class",props.getString("mail.smtp.socketFactory.class"));
   propiedades.put("mail.smtp.socketFactory.fallback",props.getString("mail.smtp.socketFactory.fallback"));
   propiedades.put("mail.smtp.mail.sender",props.getString("mail.smtp.mail.sender"));
   
   propiedades.setProperty("mail.smtp.quitwait",props.getString("mail.smtp.quitwait"));
   
   //Preparamos la Sesion autenticando al usuario
   Session session = Session.getDefaultInstance(propiedades,new javax.mail.Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication(){ 
     return new PasswordAuthentication(props.getString("mail.user"),props.getString("mail.password"));
    }
   });
   
   //Preparamos el Mensaje
   MimeMessage message = new MimeMessage(session);
   message.setSender(new InternetAddress(props.getString("mail.email")));
   message.setSubject(titulo);
   message.setContent(mensaje, "text/html; charset=utf-8");
   message.setFrom(new InternetAddress(props.getString("mail.smtp.mail.sender")));
   message.setReplyTo(InternetAddress.parse(props.getString("mail.smtp.mail.sender")));
  
  
   if (paraEmail.indexOf(',') > 0) 
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(paraEmail));
   else
    message.setRecipient(Message.RecipientType.TO, new InternetAddress(paraEmail));
   
   //envío del mensaje
   Transport.send(message);
   envio = true;
  
  } catch (Throwable e) {
   envio = false;
   System.out.println(e.getMessage());
   e.printStackTrace();
  
  }finally{
   return envio;
  }
 }
}


Clase de Prueba de envío de correo PruebaMail.java
package pedro.rios.mail;

public class PruebaMail {

 public static void main(String[] args) {
  
  if(SMTPConfig.sendMail("Asunto del Mensaje"," Cuerpo del Mensaje.","destino@gmail.com")){
  
   System.out.println("envío Correcto");
   
  }else System.out.println("envío Fallido");

 }

}


Listo eso es todo. Solo nos queda ejecutar la clase PruebaMail.java ...

Para mayor información les dejo el link para descargar el libro Java Mail en Ejemplos de la Universidad de Málaga. .... Bueno amigos espero sus comentarios.. se despide de ustedes edisonjc7.