Buscar

Rss Artículos

Foro

Autor

 

Artículos en ‘Java’

Java en javascript

Abr 29

Puede resultar un poco extraño pero John Resig se ha propuesto ejecutar o al menos imitar el funcionamiento de la Máquina virtual de Java en Javascript.

El proyecto de John se basó en Orto (la documentación está en japones) y permite compilar una aplicación en java, hacerla funcionar en Orto, el cual generará el código en javascript necesario e insertarlo en nuestra aplicación web.

Evidentemente esto no puede asegurar al 100% que todas las aplicaciones java se migren correctamente a javascript, pero como dice el autor, se pueden hacer “demos interesantes” como el juego del tetrix.

Empezando con Java

Mar 04

Al igual que he hecho con el tutorial de php, creo conveniente realizar uno para poder agrupar todos los artículos que he realizado con Java.

Quizás la característica más importante de Java es que es un lenguaje capaz de ser ejecutado en cualquier ordeandor que disponga de una máquina virtual java, por ello uno de los grandes fuertes de este lenguaje es que es multiplataforma.

La sintáxis es similiar a la programación en C++, ya que java también es orientada a objetos con la única diferencia de que suprime algunas opciones a bajo nivel haciendo mucho más sencillo nuestro trabajo.

Para poder ejecutar programas java necesitaremos el JRE (Java Runtime Environment, o Entorno en Tiempo de Ejecución de Java) cualquier usuario final de nuestra aplicación necesitará tener instalado el JRE en su máquina.

También para desarrolladores, podemos utilizar el SDK de Java 2, o JDK (Java Development Kit) que, además del JRE para poder ejecutar aplicaciones java, incluye otras herramientas que permiten el desarrollo de aplicaciones java.

Antes de empezar con Java tenemos que tener claro que plataforma se adapta mejor a nuestras necesidades, j2SE, j2EE o j2ME.

PLATAFORMAS DE JAVA

J2SE (Standar Edition)

Es la más simple de todas, todas las clases que contiene están también incluidas en el J2EE, ideal para proyectos que no requieran de grandes prestaciones.

J2EE (Enterprise Edition)

Quizás es la más conocida, ya que informalmente se trata como el “estandar” . Me gustaría citar la descripción que la wikipedia da sobre j2ee:

Java EE incluye varias especificaciones de API, tales como JDBC, RMI, e-mail, JMS, Servicios Web, XML, etc y define cómo coordinarlos. Java EE también configura algunas especificaciones únicas para Java EE para componentes. Estas incluyen Enterprise JavaBeans, servlets, portlets (siguiendo la especificación de Portlets Java), JavaServer Pages y varias tecnologías de servicios web. Esto permite al desarrollador crear una Aplicación de Empresa portable entre plataformas y escalable, a la vez que integrable con tecnologías anteriores. Otros beneficios añadidos son, por ejemplo, que el servidor de aplicaciones puede manejar transacciones, la seguridad, escalabilidad, concurrencia y gestión de los componentes desplegados, significando que los desarrolladores pueden concentrarse más en la lógica de negocio de los componentes en lugar de en tareas de mantenimiento de bajo nivel.

J2ME (Micro Edition)

Esta plataforma es una colección de APIs en Java orientadas a productos de consumo como PDAs, teléfonos móviles o electrodomésticos.

Es lo opción perfecta para realizar juegos en los teléfonos móviles.

¿Que puedo programar con Java?

Java es un lenguaje que ofrece muchísimas opciones, podemos hacer aplicaciones de escritorio, aplicaciones web, aplicaicones para el teléfono móvil e incluso videojuegos.

Con todo esto claro ya podemos comenzar a programar en java, decidiremos que plataforma es la más adecuada para nosotros, la descargaremos de la página oficial, y empezaremos nuestras andaduras.

Obtener sistema operativo con Java

Feb 26

Una de las grandes ventajas de usar java es sin duda el soporte para multiplataforma, el poder hacer un sólo programa que pueda ser ejecutado tanto en Windows, Mac, Unix… cualquier SS.OO que disponga de una máquina virtual Java.

Navegando por la red me he encontrado este código tan interesante, se trata de una manera eficaz de conocer sobre que sistema operativo se está ejecutando nuestro programa y obtener las rutas absulutas correctas para el buen funcionamiento de nuestro programa.

Miguel Álvarez Úbeda ha enviado este código a la lista de desarrolladores de gvSIG:

  1. import java.io.BufferedReader;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5.  
  6. public class ApplicationLauncher {
  7.  
  8. public static void main(String args[]){
  9. if( args.length!=1) {
  10. System.out.println(”Numero de parametros erroneo forma de uso: java -cp . ApplicationLauncher fichero|URL”);
  11. return;
  12. }
  13. if(args[0].indexOf(”http”)!=-1) launchURL(args[0]);
  14. else launchDefaultViewer(args[0]);
  15. }
  16.  
  17. private static String linuxDesktop = null;
  18.  
  19. private static String getEnv(String envvar){
  20. try{
  21. Process p = Runtime.getRuntime().exec(”/bin/sh echo $”+envvar);
  22. BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
  23. String value = br.readLine();
  24. if(value==null) return “”;
  25. else return value.trim ();
  26. }
  27. catch(Exception error){
  28. return “”;
  29. }
  30. }
  31.  
  32. private static String getLinuxDesktop(){
  33. //solo se averigua el entorno de escritorio una vez, despues se almacena en la variable estatica
  34. if(linuxDesktop!=null) return linuxDesktop;
  35. if(!getEnv(”KDE_FULL_SESSION”).equals(") || !getEnv(”KDE_MULTIHEAD”).equals(”")){
  36. linuxDesktop=”kde”;
  37. }
  38. else if(!getEnv(”GNOME_DESKTOP_SESSION_ID”).equals(") || !getEnv(”GNOME_KEYRING_SOCKET”).equals(”")){
  39. linuxDesktop=”gnome”;
  40. }
  41. else linuxDesktop=”";
  42.  
  43. return linuxDesktop;
  44. }
  45.  
  46. public static Process launchURL(String url){
  47. try{
  48. if (System.getProperty(”<a href="http://os.name/">os.name </a>“).toUpperCase().indexOf(”95″) != -1)
  49. return Runtime.getRuntime().exec( new String[]{”<a href="http://command.com/">command.com</a>“, “/C”, “start”, url} );
  50. if (System.getProperty(”<a href="http://os.name/">os.name</a>“).toUpperCase().indexOf(”WINDOWS”) != -1)
  51. return Runtime.getRuntime().exec( new String[]{”cmd.exe”, “/C”, “start”, url} );
  52. if (System.getProperty(”<a href="http://os.name/">os.name</a>“).toUpperCase().indexOf(”MAC”) != -1)
  53. return Runtime.getRuntime().exec( new String[]{”open”, url} );
  54. if (System.getProperty(”<a href="http://os.name/">os.name</a>“).toUpperCase().indexOf(”LINUX”) != -1 ) {
  55. if(getLinuxDesktop().equals(”kde”))
  56. return  Runtime.getRuntime().exec( new String[]{”kfmclient”, “exec”, url} );
  57. else
  58. return Runtime.getRuntime().exec( new String[]{”gnome-open”, url} );
  59. }
  60. }
  61. catch(IOException ioex){System.out.println(ioex);}
  62.  
  63. return null;
  64. }
  65.  
  66. public static Process launchDefaultViewer(String filepath){
  67. return launchURL( new File(filepath).getAbsolutePath());
  68. }
  69.  
  70. }

Espero que sirva de ayuda ;)

Servicio web con eclipse, Xfire y AXIS2

Ene 28

Tiempo atrás, escribí mi primer post sobre servicios web en Java, se trataba de un tablón de mensajes realizado con JDeveloper, algunos compañeros me tacharon de “básico” por utilizar asistentes para generarlo en lugar de AXIS y/o derivados y por no crear los esqueletos a mano. Y yo pensé, no voy a reinventar la rueda, si alguien ha facilitado la creación de servicios web.. bienvenido sea..

Así pues, hoy llego con otra entrada sobre servicios web, de la misma manera que antes, lo más sencillo posible, para que con conocimientos mínimos podamos crear un servicio web accesible desde cualquier lugar y aplicación.

Para su implementación esta vez he usado eclipse, herramienta que utilizo en el trabajo y que a día de hoy considero una de las mejores para programar, el plugin de MyEclipse y el framework (JAVA-SOAP), Xfire.

Crear un servicio web con Xfire (ServidorSW)

Nuevo proyecto

Creamos un nuevo proyecto, que sea del tipo “Web Service Project” (MyEclipse/J2EE Projects/ Web Service Project) .

Aquí nos dará dos opciones a elegir, por un lado si queremos hacer el servidor, y por el otro el cliente. De momento empezaremos por el servidor, así pues, una vez seleccionado el proyecto del tipo “Web Service Project” que habíamos creado antes, marcaremos la opción “Create web service form java bean (bottom-up scenario)”

En la siguiente pantalla, decidiremos el nombre del proyecto, la especificación (que versión de J2EE usar) y la ruta.

Una vez aceptado los parámetros, pasaremos a configurar nuestro servlet Xfire, donde decidiremos algo muy importante, el nombre de la ruta a nuestro servicio web “Servlet mapping” y la localización del fichero de configuración del servicio web, el services.xml.

Por último, tendremos que seleccionar las librerías que queramos incluir en nuestro servicio web, para nuestro ejemplo, necesitaremos cargar, las Xfire 1.1 Core y Xfire 1.1 HTTP client.

Implementamos nuestro servicio web

Ya tenemos nuestro servicio web creado, ahora necesitaremos implementarlo, para ello, pulsaremos botón derecho sobre nuestro proyecto, “New” y “Other”. Al abrirse la nueva ventana, tendremos que navegar desde la carpeta My Eclipse, Web, Web Services y por último seleccionar “Web Service”.

Se nos abrirá otra ventana, donde deberemos seleccionar de entre todos nuestros proyectos web en el que queramos generar las clases que implementarán el servicio, importante, si tenemos ya las clases que queramos implementar como servicio web, no deberemos hacer nada más, en caso contrario, deberemos seleccionar la opción de “Create new Java bean”

Una vez seleccionado, decidiremos el nombre del servicio web y sobretodo, si tenemos una interface y su implementación ya realizadas, las incluiremos en nuestro proyecto, sino, (habremos seleccionado la opción anterior de “Create new Java bean” ) nos la generará por defecto.

Por defecto, Xfire, nos generará un método example, al que se le pasa un String y lo devuelve.

En SOAP/Servlet configuration recomiendo dejar puesto en style/use la opción de “wrapped/literal” y en Servlet Scope “application”. Sin estas configuraciones, dará problemas con clientes AXIS.

Una vez terminado, ya tendremos un ejemplo básico de servicio web, para hacerlo funcionar, si tenemos configurada una conexión a un servidor J2EE o tomcat, la usaremos para hacer el deploy del servicio, sino, lo haremos a mano.

Una vez en el servidor, desde eclipse tenemos la opción de “Launch service web explorer” para poder acceder al servicio web, sino, desde cualquier navegador podremos utilizarlo mediante la dirección:

*NS = NombreProyecto
*NSW = NombreServicioWeb

http://localhost:8080/NP/Servletmapping/NSW?wsdl

Conectar a un servicio web con Xfire (ClienteSW)

Como vimos antes, al principio, cuando generamos un servicio web, podemos decidir si hacer un cliente o un servidor, de aquella manera, simplemente seleccionando el fichero WSDL se generará automaticamente la plantilla del cliente, si no dispusiéramos de un fichero WSDL o queremos hacerlo de otra manera, explicaré los pasos.

Este proyecto no tiene por que ser de tipo “Web Service”, ahora seleccionaremos un proyecto “Java”.

Lo primero es copiar la interface de nuestro servidor en nuestro cliente, ya que tendrá que implementar los mismos métodos.

Si no hemos incluido las librerías necesarias de Xfire las incluimos, necesitaremos al menos las siguientes:

import org.codehaus.xfire.XFire;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

Y ya que vamos a trabajar con direcciones URL, tendremos que importar la excepción java.net.MalformedURLException en nuestro proyecto.

Para conectarnos realizaremos un método denominado CallWebService()

public static byte[] callWebService() throws MalformedURLException, Exception {

//Creamos un objeto de tipo Service (matadata)
Service serviceModel = new ObjectServiceFactory().create(IreportesWS.class);

//Necesitaremos un objeto XFire y su proxy asociado
XFire xfire = XFireFactory.newInstance().getXFire();
XFireProxyFactory factory = new XFireProxyFactory(xfire);

//Incluiremos la URL del servicio Web, sin el ?wsdl al final
String serviceUrl = “http://localhost:8080/NP/Servletmapping/NSW”;

//Cargamos la interface para poder invocar los métodos del servicio web
InterfaceWS cliente = null;
try {
cliente = (InterfaceWS) factory.create(serviceModel, serviceUrl);
} catch (MalformedURLException e) {
System.out.println(”ClienteWS.callWebService(): EXCEPTION: ” + e.toString());
}

//Si todo ha ido bien, podremos invocar al servicio web
String ejemplo= “”;
try{

ejemplo= cliente.example(”Esto es un ejemplo básico”);

} catch (Exception e){
System.out.println(”ClienteWS.callWebService(): EXCEPTION: ” + e.toString());
}
//Si queremos mostrar los resultados en pantalla
System.out.println(”ClienteWS.callWebService(): respuesta=” + ejemplo);

//Si queremos devolver los resultados
return ejemplo;
}

Ahora, con invocar este método, podremos conectar con el servicio web y utilizar sus servicios.

Conectar a un servicio web de Xfire con AXIS2 (ClienteAxis2SW)

** Para realizar este cliente, se necesita Eclipse IDE for Java EE Developers, cualquier otro eclipse es posible que no tenga la configuración necesaria.

Muchos, los no-documentados, siempre tienden a tachar de herejía lo que conocen, como puede ser el caso de Xfire.

Yo nunca lo había usado, es más, ni lo conocía, hasta que gracias a MyEclipse empecé a trabajar con él. Me ha resultado muy cómodo y potente, ya que el servicio web que he realizado funciona a las mil maravillas, pero aún así, habrá gente que le ponga pegas.

¿Y cuál es la mayor pega que se le puede poner? pues por ejemplo, que no sea compatible o no funcione bien con los servicios web más usados/conocidos hoy en día, por ejemplo AXIS, y es por ello, que he decidido también poner un cliente realizado con AXIS que conecte a mi servicio web realizado con Xfire.

Para empezar, seleccionaremos “New Project” y la opción de “Dynamic Web project”, elegiremos un nombre para nuestro proyecto y en la siguiente pantalla, “Project facets” activaremos la casilla de “Axis2 Web Service”, acabaremos de rellenar todas las opciones y finalizaremos el proceso.

Una vez generado el proyecto, pulsaremos sobre “New”, “Other” y “Web Service Client”.

En esta pantalla, en “service definition” tendremos que buscar el servicio web (la ruta) de la que queramos generar el cliente. Ésta ha de ser de la forma : “http://localhost:8080/NP/Servletmapping/NSW?wsdl”

Una vez seleccionada la ruta y la carpeta donde se generará el código del cliente, sólo nos queda configurar un main. Supongamos que el nombre del servicio web sea ServidorWS.

public static void main(String[] args) {
try{
ServidorWS service = new ServidorWSLocator();
ServidorWSHttpBindingStub stub = new ServidorWSHttpBindingStub(new URL(”http://localhost:8080/NP/Servletmapping/servidorWS”), service);
String ejemplo= “”;
ejemplo = stub.example(”hola, esto es otro ejemplo básico con AXIS”);

if (ejemplo != null){
System.out.println(”Bien”);
} else{
System.out.println(”Mal”);
}
} catch (Exception e) {
e.printStackTrace();
}
}

Y ya tenemos nuestro cliente AXIS funcionando correctamente.

PD: El código puede que no funcione al 100% ya que no ha sido probado, pero el proyecto real del que se ha sacado este ejemplo funciona correctamente.

Cargar un Servlet con Ajax

Oct 15

La semana pasada escribía un artículo sobre los comienzos con ajax, en él indicaba una forma fácil para cargar un documento estático en cualquier capa de una página.

En algún momento hice referencia a poder cargar documentos que contuvieran funciones javascript o incluso servlets.

Esto si es posible, pero siempre con algunas recomendaciones para evitar problemas futuros.

Recomendaciones para evitar problemas.

Las funciones javascript deberían ser declaradas en la plantilla base, es decir, donde se establecen las diferentes capas, al lado de las funciones ajax y a ser posible (para mejor organización) en ficheros .js externos al documento, así para cualquier cambio será todo mucho más sencillo.

Las direcciones deberíamos (por lo menos al principio) ponerlas absolutas y a medida que vaya funcionando ir cambiandolas por relativas, así cargaremos menos el servidor. En caso de no tener problema de carga las podríamos dejar como absolutas.

Cuando carguemos una página en una capa, si esta llama a alguna función ya estará declarada en la plantilla base y no habrá ningún problema de ejecución.

Cómo cargar un servlet en una capa con Ajax

La sintaxis sería la misma que con una página normal, nosotros llamaríamos a nuestra función cargar página y le pasaríamos la dirección del servlet (http://localhost:8080/Prueba/ServletPrueba?accion=1) tal cual la usaríamos para acceder normal.

Ahora, el servlet se ejecutará y la salida, por ejemplo, si redirecciona a un .jsp aparecerá en la capa.

La única modificación que tendremos que hacer será modificar los enlaces generados dentro del servlet para que se vuelvan a cargar dentro de la capa, al igual que llamamos al servlet, hacer las demás llamadas.

Recordad que si en algún momento tenemos que ejecutar varias intrucciones javascript a la vez podemos usar un sólo evento, por ejemplo, el onLoad y separarlas con “;”

onLoad(javascrip1();javascrip2())

Servicios Web en Java II

Jun 26

Después de haber arrancadao nuestro servicio web como vimos en la primera parte de este curso, vamos a ver como podemos crearnos un cliente que conecte y pueda realizar las diferentes operaciones que propusimos.

Creamos un nuevo proyecto tal cual vimos en el apartado anterior, ahora en vez de crearnos una clase normal en java iremos a BusinessTier, Web Services y pulsaremos sobre Web Service proxy.

Pulsamos siguiente e iremos a una ventana donde nos piden la ruta del MyWebService1.wsdl que creamos anteriormente, para ello la buscamos en la carpeta donde guardamos el proyecto anterior, en public html, WEB INF y dentro de la carpeta wsdl lo encontraremos.

Ahora si pulsamos sobre finalizar veremos como se nos crean muchos archivos en nuestro proyecto, ahora tendremos que conectar.

Si todo ha ido bien nos aparecerá el cursor dentro del main de la clase proxy que hemos creado, donde nos dice exactamente donde tendremos que poner nuestro código.

[java]

public static void main(String[] args) {
try {
AQUI.mypackage.MyWebService1SoapHttpPortClient myPort = new AQUI.mypackage.MyWebService1SoapHttpPortClient();
System.out.println(”calling ” + myPort.getEndpoint());
// Add your own code here

} catch (Exception ex) {
ex.printStackTrace();
}
}

[/java]

Ahora tendremos que añadir al main un par de lineas para poder conectar, para ello necesitaremos saber la url que nos proporcionó antes el jdeveloper donde se ubica nuestro servicio web, una vez que la tengamos nos quedaría de esta manera:

[java]

public static void main(String[] args) {
try {
AQUI.mypackage.MyWebService1SoapHttpPortClient myPort = new AQUI.mypackage.MyWebService1SoapHttpPortClient();
System.out.println(”calling ” + myPort.getEndpoint());

myPort.setEndpoint( “http://zeus:8990/ServicioWebForo-ServicioWebForo-context-root/MyWebService1SoapHttpPort” );

myPort.setMaintainSession( true );

// Login and authenticate
//boolean hola = myPort.login( “p”, “p” );

//Llamamos a las funciones que queramos de nuestro servicio web
String mensaje = myPort.buscarMensajes(”g”,”g”,”MENSAJE”);
System.out.println(mensaje);

} catch (Exception ex) {
ex.printStackTrace();
}
}

[/java]

Ya está terminado nuestro cliente, ahora cada uno le da forma a su imagen y semejanza, usando la imaginación podremos hacer todo lo que queramos.

Yo añadí una interfaz gráfica con SWING para gestionar todo el cliente, en cuanto tenga un hueco me gustaría subir el código por si alguien lo necesita, de todas maneras la base está aqui, a partir de esto podemos crear lo que más nos guste.