miércoles, mayo 28, 2008

Error en Netbeans con WebServices



Los Web Services son una herramienta fundamental en el desarrollo de aplicaciones SOA, pues le da a terceros la posibilidad de llamar a alguna parte de nuestro sistema.

En Netbeans es facil crear un nuevo WebService... sin embargo, a raiz de la actualizacion de un modulo... no estan funcionando bien, al menos a mi, no me generaba el archivo jaxws-build.xml ni me lo incluia en el build.xml.

Bueno lo que tuve que hacer fue escribir estos archivos a mano.... pero como la neta no se nada de ANT... ( debo de empezar a meterme a Eclipse..) pues me base en otros archivos que ya tenia... asi que su archivo debe quedar de la siguiente manera

jaxws-build.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns:xalan="http://xml.apache.org/xslt"
  3. xmlns:webproject2="http://www.netbeans.org/ns/web-project/2"
  4. xmlns:jaxws="http://www.netbeans.org/ns/jax-ws/1">
  5. <target name="wsgen-init" depends="init, -do-compile">
  6. <mkdir dir="${build.generated.dir}/wsgen/service"/>
  7. <mkdir dir="${build.generated.dir}/wsgen/service/resources/"/>
  8. <mkdir dir="${build.generated.dir}/wsgen/binaries"/>
  9. <mkdir dir="${build.classes.dir}"/>
  10. <taskdef name="wsgen" classname="com.sun.tools.ws.ant.WsGen">
  11. <classpath
  12. path="${java.home}/../lib/tools.jar:${build.classes.dir}:${j2ee.platform.wsgen.classpath}:${javac.classpath}"/>
  13. </taskdef>
  14. </target>
  15. <target name="wsgen-nombreDelWebService" depends="wsgen-init">
  16. <wsgen fork="true" xendorsed="true"
  17. sourcedestdir="${build.generated.dir}/wsgen/service"
  18. resourcedestdir="${build.generated.dir}/wsgen/service/resources/"
  19. destdir="${build.generated.dir}/wsgen/binaries" keep="true" genwsdl="true"
  20. sei="com.core.web">
  21. <classpath
  22. path="${java.home}/../lib/tools.jar:${build.classes.dir}:${j2ee.platform.wsgen.classpath}:${javac.classpath}"/>
  23. <jvmarg value="-Djava.endorsed.dirs=${jaxws.endorsed.dir}"/>
  24. </wsgen>
  25. </target>
  26. <target name="wsgen-service-compile" depends="wsgen-nombreDelWebService">
  27. <webproject2:javac srcdir="${build.generated.dir}/wsgen/service"
  28. classpath="${j2ee.platform.wsimport.classpath}:${javac.classpath}"
  29. destdir="${build.classes.dir}"/>
  30. </target>
  31. </project>

Luego tenemos que poner este otro codigo en el archivo build.xml, escribo las lineas de arriba y de abajo como referencia, va casi cuando inicia el documento

  1. <project ...
  2. <import file="jaxws-build.xml"/>
  3. <import file="ant-deploy.xml"/>


Esto va en compilation section, en mi caso solo decia -post-compile y no dependia de wsgen-service-compile

  1. <target depends="wsgen-service-compile" name="-post-compile">
  2. <!-- Empty placeholder for easier customization. -->
  3. <!-- You can override this target in the ../build.xml file. -->
  4. </target>


Espero que le haya servido a alguien, por que realmente esto me atraso unos dias...

lunes, mayo 19, 2008

JSF + Hibernate + JPA + Netbeans + ZK (Configuracion)

Bueno ya despues de mucho... publicare la primera parte completa del minitutorial de como integrar todas las tecnologias antes mencionadas.... primero vamos a ver la configuracion.... y despues explicare el funcionamiento de cada uno...

Bueno primero crearemos las librerias de NetBeans nos vamos a Tools-> Libraries y seleccionamos New, escribimos Hibernate JPA, y seleccionamos Add JAR/Folder, ahora buscamos todos los JAR ok? dije JAR!!!! no folders... que les pedi en la parte pasada del tutorial... ahora bien... hacemos lo mismo para ZK y ZK JSF, solo queremos los JAR que estan dentro de la carpeta libs para ZK y ZK JSF.

Bueno.. creemos una base de datos sencilla con dos tablas... tiene MySQL cierto??, si no busquen como instalarlo para su propia distribucion de linux... por que tienen linux verdad??? jejeje bueno.. como sea... instalen MySQL... para este tutorial... no entrare en detalles de como lo instalamos... y asumire que son expertos en la materia... despues posteare algo sobre MySQL...

entramos a MySQL, y crearemos una pequeña base de datos de escuelas...

Para crear una base de datos
CREATE DATABASE escuela;

Para crear las tablas
CREATE TABLE instituto (id_inst int primary key auto_increment, nombre varchar(20), direccion varchar(20)) ENGINE=InnoDB;
CREATE TABLE profesor (id_prof int primary key auto_increment, nombre varchar(20),id_inst int) ENGINE=InnoDB;

Para crear la relacion
Todo es una sola linea..
ALTER TABLE profesor
ADD CONSTRAINT profesor_instituto
FOREIGN KEY (id_inst)
REFERENCES instituto (id_inst)
ON DELETE RESTRICT
ON UPDATE CASCADE;


Ahora nos vamos a File->New Proyect y seleccionamos Web | Web Application, le ponemos escuela al proyecto, seleccionamos tomcat como servidor y seleccionamos JavaServer Faces.




En source proyects creamos un nuevo paquete y le llamamos DataBase, hacemos clic derecho seleccionamos New y despues DataBase, despues seleccionamos New Other para elegir Persistence | Entity Classes from Database, en DataSource seleccionamos New DataSource, ahi seleccionamos DataBase Connection-> new database connection, nos aparecera un dialogo para conectarnos con MySQL seleccionamos MySQL connector, el driver nos vale...pero en DataBase URL escribimos jdbc:mysql://127.0.0.1/escuela, pongan 127.0.0.1 por que luego en unas distros no funciona el localhost por que traen una configuracion rara... y no me voy a poner a decir como quitarselas ahorita.. jeje







Debe aparecernos que la conexion fue existosa.. si no... algo escribiste mal.. o no tienes levantado mysql... /etc/init.d/mysql start lo levanta.. :D

Seleccionamos las dos clases que antes hemos creado... Instituto aparecera de manera rara por que fue incluida ya que hay una clave foranea hacia ella.

Ahora hay que crear una unidad persistente, seleccionamos CREATE PERSISTENCE UNIT, nos creare una unidad persistente solo falta seleccionar Hibernate como nuestro manejador,


De todos modos les dejo mi persistence.xml


<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xsi="http://www.w3.org/2001/XMLSchema-instance" schemalocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

<persistence-unit name="tiempoairePU" type="RESOURCE_LOCAL">

<provider>org.hibernate.ejb.HibernatePersistence</provider>

<properties>

<property name="hibernate.connection.username" value="usuario">

<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver">

<property name="hibernate.connection.password" value="password">

<property name="hibernate.connection.url" value="jdbc:mysql://127.0.0.1/escuela">

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect">

<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider">

<property name="hibernate.c3p0.acquire_increment" value="3">

<property name="hibernate.c3p0.idle_test_period" value="14400">

<property name="hibernate.c3p0.timeout" value="25200">

<property name="hibernate.c3p0.max_size" value="15">

<property name="hibernate.c3p0.min_size" value="3">

<property name="hibernate.c3p0.max_statements" value="0">

<property name="hibernate.c3p0.preferredTestQuery" value="select 1;">

</property>

</property>

</property>



Automaticamente tenemos nuestras clases mapeadas... si nos marca error tenemos que entrar a las propiedades del proyecto, clic derecho Properties, Libraries Add Library y seleccionamos HibernateJPA la libreria que antes creamos, junto con ZK y ZK JSF.

AUTONUMERICO HIBERNATE

Aqui hay un error con la generacion de NetBeans puesto que como usamos autonumerico... necesitamos agregar unas lineas para que nos respeten el autonumerico, si todo salio bien deberia estar en Instituto .java despues de la linea @Id debemos escribir @GeneratedValue, y debemos importar javax.persistence.GeneratedValue; en Instituo y Profesor, ahora no tenemos problemas...

Bien ahora configuramos NetBeans para usar ZK en Configuration Files nos vamos a Web.xml y escrimos estas lineas en el apartado donde veas los listener




<listener>

<description>Para limpiar la basura de las sesiones</description>

<display-name>ZK Session Cleaner</display-name>

<listener-class>org.zkoss.zk.ui.http.HttpSessionListener</listener-class></listener>



Y en donde veas las tags de servlet escribe estas.. (de preferencia antes de las de JSF)


<servlet>

<description>ZK cargador para pagimas ZUML</description>

<servlet-name>zkLoader</servlet-name>

<servlet-class>org.zkoss.zk.ui.http.DHtmlLayoutServlet</servlet-class>

<init-param>

<param-name>update-uri</param-name>

<param-value>/zkau</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet>

<description>Engine para la actualizacion asincrona</description>

<servlet-name>auEngine</servlet-name>

<servlet-class>org.zkoss.zk.au.http.DHtmlUpdateServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>zkLoader</servlet-name>

<url-pattern>*.zul</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>zkLoader</servlet-name>

<url-pattern>*.zhtml</url-pattern>

</servlet-mapping>


Ahora ya estamos listos para usar ZK, tenemos que entrar en nuestro archivo WelcomeJSF.jsp

Agregamos nuestra TAG


<%@taglib prefix="z" uri="http://www.zkoss.org/jsf/zul" %>


esto nos permite usar ZK en JSF... y va donde van todas las demas tags casi hasta el principio

<z:page>

<z:window title="Hola" border="normal">

Hola

</z:window>

</z:page>




Bueno ya esta funcionando despues veremos acerca del binding

viernes, mayo 16, 2008

Hola

Bueno pues ya le voy a dedica un poco mas de tiempo a esto... pues me he topado con muchos problemas a la hora de aprender.. no hay muchos tutoriales buenos... y menos en español... a eso sumenle... que luego ya no los vuelvo a encontrar y no me acuerdo.. asi que hare una referencia rapida de lo que vaya encontrando.. ok?... por cierto... Netbeans y ZK... hacen una maravilla.. jeje.. nada mas que los dos son demasiado lentos... hay que aumentar la memoria RAM del servidor y la maquina de desarrollo para que funcionen bien...