Un gráfico bajo JSP con Cewolf en NetBeans

15.8.08. Por ooscarr (ooscarr)

Netbeans

Traduje las instrucciones del tutorial de la página de Cewolf y consideré que se merecía un post, digamos, para actualizarlo/corregirlo.

Primero, para qué sirve Cewolf

Cewolf puede ser usado dentro de una aplicación basada en Servlet/JSP para insertar gráficos complejos de todo tipo (p.e. lineales, de torta o pastel o circular o 100%, de barras, histogramas, diagramas de caja, etc.) en una página web. Además provee una completa librería de etiquetas (tags) para definir todas las propiedades del gráfico (colores, rayas, leyendas, etc.). De este modo el JSP que incluye el gráfico no queda lleno de código java. Todo es descrito con etiquetas XML válidas.

Cewolf está basado en JFreeChart y usa su motor de renderizado para renderizar la imagen del gráfico final al flujo de respuesta de los clientes. Ningún archivo es creado en el lado del servidor. Todo está basado en objetos de sesiones livianas y análisis de datos dinámico. Cewolf consiste de un servlet el cual maneja el renderizado de los gráficos y una librería de etiquetas (Tag Library) que traduce la definición del gráfico incluida en el JSP a una etiqueta img que consulta al servlet de renderizado para la obtención del gráfico apropiado.

Cewolf

Completamente gratis, libre y abierto

  • Licencia LGPL
  • Sin cargos
  • Sin restrictions
  • Todos los archivos fuentes documentados y disponibles
  • Soporte las 48 horas en los foros de SourceForge
  • Rápido desarrollo y ciclos de mejores versiones

100% Java

  • sin uso de librerías nativas
  • debería correr en todo servidor compatible con J2EE o en contenedores servlet
  • uso extenso de proyectos open source disponibles

Completa librería de etiquetas para gráficos

  • Sin necesidad de código java dentro del JSP
  • Descripción XML de un gráfico
  • Validación de etiquetas de gráficas en tiempo de diseño
  • Extensa documentación de las etiquetas

Enorme número de diferentes gráficas

  • Lineal [XY]
  • Torta [3D]
  • Barras horizontales [3D]
  • Barras [XY] Verticales [3D]
  • [3D] Barras verticales apiladas
  • De área [XY]
  • Gráfico disperso
  • Gráfico de velas
  • Alto Bajo
  • Gantt
  • Sobrepuestos
  • Combinados

Antes

Antes de empezar, asegúrate:

Hola, mundo

PASO 1: Instalamos las librerías

  1. Creamos un Nuevo proyecto de tipo Aplicación Web
    Captura de pantalla del asistente para crear un Nuevo proyecto en Netbeans
  2. Elejimos un nombre
    Captura de pantalla del asistente para crear una Nueva Aplicación Web
  3. Usamos una carpeta dedicada para los archivos JAR
    Use dedicated library folder for server JAR files
  4. Ahora, en la parte de los proyectos, seleccionamos Propiedades. Y en el panel de propiedades, sección Librerías presionamos el botón de Agregar JAR
    Libraries > Add JAR/Folder
  5. Aquí tenemos que abrir la carpeta del Cewolf recién descargada y dentro de la carpeta /lib/ seleccionar todos los archivos .jar que aparecezcan, marcar la opción Copiar a la carpeta de librerías y presionar Seleccionar.
    Copy to Libraries Folder
  6. OK
    Panel de Propiedades del proyecto en Netbeans para Mac OS X con el botón OK focalizado
    No se olviden también de agregar la librería JSTL con el botón Agregar Librería, o sino no va a funcionar nada.

PASO 2: Nos ponemos desagradables

Ahora que están las librerías, debemos preparar la aplicación.

Primero debemos mover o copiar la carpeta /etc/ que viene en Cewolf a nuestra carpeta /WEB-INF

Captura de pantalla que muestra cómo se arrastra una carpeta del panel Favoritos al panel de archivos del proyecto en Netbeans
Para ver nuestras carpetas locales en Netbeans, debemos seleccionar el menú Ventana > Favoritos (o Window > Favorites, si tienes el Netbeans en inglés).

web.xml

Ahora editamos el archivo web.xml que hizo un cameo en la imagen anterior, en el modo XML y le metemos el siguiente código antes que se cierre la etiqueta </web-app>

<servlet>
 <servlet-name>CewolfServlet</servlet-name>
 <servlet-class>
  de.laures.cewolf.CewolfRenderer
 </servlet-class>
 <!-- sets storage implementation -->
 <init-param>
  <param-name>storage</param-name>
  <param-value>
  de.laures.cewolf.storage.TransientSessionStorage
  </param-value>
 </init-param>
 <!-- sets overlib.js location relative to webapp -->
 <init-param>
  <param-name>overliburl</param-name>
  <param-value>etc/overlib.js</param-value>
 </init-param>
 <!-- turn on or off debugging logging -->
 <init-param>
  <param-name>debug</param-name>
  <param-value>true</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
 <servlet-name>CewolfServlet</servlet-name>
 <url-pattern>/cewolf/*</url-pattern>
</servlet-mapping>

Para probar, prueba ejecutar la aplicación web (o presionar el botón Play) y visitar la carpeta /cewolf como en el siguiente ejemplo:

http://localhost:8080/ejemplo/cewolf?state

Y debería aparecer:

Cewolf servlet up and running.
Requests served so far: 0

O sino, te equivocaste de puerto (prueba el :8084).

PASO 3: Java

Con Cewolf, todavía se debe escribir la parte de los datos de JFreeChart con código Java. Lo que sucede es que una clase se encarga de preparar los datos y a través de un bean se accede a ellos desde la JSP.

  1. Para crear la clase, vamos a Nuevo archivo > Java > Java Class
    Panel de nuevo archivo de Netbeans en Mac OS X
  2. Le ponemos un nombre a la clase, en este caso NumeroDeVisitas; y al paquete (Package) le podríamos llamar datos
    Captura de pantalla del panel de nueva clase java en Netbeans para Mac OS X
  3. Luego de presionar el botón Finalizar, el archivo debería aparecer dentro de la carpeta Source Packages en nuestro proyecto.

    Captura de pantalla con el árbol de archivos en Netbeans mostrando el archivo ejemplo > Source Packages > datos > NumeroDeVisitas.java

Códigos fuentes

Y en ese archivo escribamos, por ejemplo, el siguiente código java que he traducido especialmente para ti:

NumeroDevisitas.java
package datos;

import java.io.Serializable;
import java.util.Date;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

import de.laures.cewolf.DatasetProduceException;
import de.laures.cewolf.DatasetProducer;
import de.laures.cewolf.links.CategoryItemLinkGenerator;
import de.laures.cewolf.tooltips.CategoryToolTipGenerator;

/**
 * Un ejempplo de productor de datos.
 * @author  Guido Laures
 * Traducido por Oscar Fernández
 */

public class NumeroDeVisitas implements DatasetProducer,
 CategoryToolTipGenerator, CategoryItemLinkGenerator, Serializable{

 private static final Log log=LogFactory.getLog(NumeroDeVisitas.class);

 // Estos valores normalmente no se deberían escribir
 // sino producidos por algún tipo de fuente de datos
 // como una base de datos o un archivo
 private final String[] categories={"Lun","Mar","Mié","Jue","Vie","Sáb","Dom"};
 private final String[] seriesNames={"Portada","Noticias","Foros","Buscador"};

 //Produce datos aleatorios
 public Object produceDataset(Map params) throws DatasetProduceException{
  log.debug("produciendo datos.");
  DefaultCategoryDataset dataset=new DefaultCategoryDataset(){
   // @see java.lang.Object#finalize()
   protected void finalize() throws Throwable {
    super.finalize();
    log.debug(this +" terminado.");
   }
  };
  for(int series=0;series<seriesNames.length;series ++){
   int lastY=(int)(Math.random()*1000+1000);
   for(int i=0;i<categories.length;i++){
    final int y=lastY+(int)(Math.random()*200-100);
    lastY=y;
    dataset.addValue(y,seriesNames[series],categories[i]);
   }
  }
  return dataset;
 }

 /**
  * Estos datos producidos son invalidados después de 5 segundos.
  * Por este método el productor puede influenciar el comportamiento
  * de caché de Cewolf de la forma que quiera.
  */
 public boolean hasExpired(Map params,Date since){
  log.debug(getClass().getName()+"hasExpired()");
  return(System.currentTimeMillis()-since.getTime())>5000;
 }

 // Retorna un ID único para este DatasetProducer
 public String getProducerId(){
  return "NumeroDeVisitas DatasetProducer";
 }

 // Retorna un link target para un item de datos especial.
 public String generateLink(Object data,int series,Object category){
  return seriesNames[series];
 }

 // @see java.lang.Object#finalize()
 protected void finalize() throws Throwable{
  super.finalize();
  log.debug(this+" finalized.");
 }

 /**
  * @see org.jfree.chart.tooltips.CategoryToolTipGenerator#generateToolTip(CategoryDataset, int, int)
  */
 public String generateToolTip(CategoryDataset arg0,int series,int arg2){
  return seriesNames[series];
 }
}
index.jsp

Ya. Ahora que la parte complicada está hecha, para llamar al gráfico desde la JSP, escribimos:


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri='/WEB-INF/etc/cewolf.tld' prefix='cewolf' %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
  <title>Hola, mundo</title>
 </head>
 <body>
  <jsp:useBean id="visitas" class="datos.NumeroDeVisitas"/>
  <cewolf:chart
   id="line"
   title="Estadísticas de visitas al sitio"
   type="line"
   xaxislabel="Página"
   yaxislabel="Número de Visitas">
   <cewolf:data>
    <cewolf:producer id="visitas"/>
   </cewolf:data>
  </cewolf:chart>

  <h1>Hola, mundo!</h1>
  <p><jsp:element name="img">
   <jsp:attribute name="src">
    <cewolf:imgurl
    chartid="line"
    renderer="cewolf"
    width="400"
    height="300"></cewolf:imgurl>
   </jsp:attribute>
   <jsp:attribute name="alt">Gráfico</jsp:attribute>
  </jsp:element></p>
 </body>
</html>

Para que funcione, se debe poner atención a las partes marcadas del código.

¡Y listo!

Ahora al visitar la página recién editada, debería aparecer algo así:

ver index.jsp.
* Las líneas del gráfico lineal pueden ser diferentes, ya que, como se vio en el código java, corresponden a datos aleatorios que cambian cada vez que se refresca la página.
** La página es de referencia

Referencias

Etiquetas: , , ,

19 comentarios (RSS ATOM) :

  1. A las 13/12/08 18:59  

    Anonymous Anónimo ha dicho...

    Hola....tu articulo me ha sido de gran ayuda...
    pude hacer este ejemplo sin problema...

    Al intentar ponerlo en mi jsp, me llevo una sorpresa..si muestra el marco del grafico, pero no me muestra las graficas...que podria ser...

  2. A las 13/12/08 21:55  

    OpenID elblog ha dicho...

    Revisa la dirección de la imagen

  3. A las 6/1/09 12:25  

    Anonymous Anónimo ha dicho...

    La dirección de la imagen???
    IMG BORDER="0" HEIGHT="300" WIDTH="700" ALT="" USEMAP="#graficosBarrasV3D" src="cewolf;jsessionid=8561CBC584EDEF46C2C187762766B354?img=998663231&width=700&height=300&iehack=.png"...
    Esta parte de codigo que me genera??

  4. A las 23/1/09 11:48  

    OpenID elblog ha dicho...

    Con el botón derecho, en el navegador, sobre la imagen, con la opción "Ver imagen" la dirección o URL aparece completa, más o menos así: http://localhost:8084/ejemplo/cewolf;jsessionid=BCE5D0...

    al abrir esa página en el navegador, podría aparecer la descripción del error en vez de la imagen, razón por la que sólo aparece el marco.

    También he actualizado el artículo con un nuevo JSP que utiliza el tag <jsp:element> y cambié el nombre del paquete de de.laures... etc a simplemente datos

  5. A las 26/1/09 02:23  

    Anonymous cany94 ha dicho...

    Muy buen artículo, sólo hace
    falta agregar en el index.jsp
    la fuente de los datos dentro
    de la etiqueta cewolf data...

    así(falta abrir y cerrar <>)

    cewolf:producer id="visitas"/


    Gracias.


    atte.
    Canay'94

  6. A las 4/2/09 10:46  

    Anonymous Anónimo ha dicho...

    aun sigue el error :( antes funcionaba bien :S

    ahora no se que pasoo :S

    esta muy bueno y claro el articulo... de primera me funciono perfectamente pero ahora no... no entiendo por que eso del tag visitas no se como ponerlo

    me pueden ayudar?? atte
    alejandro astorga

    muchas gracias :D

  7. A las 4/2/09 10:48  

    Anonymous Anónimo ha dicho...

    ahora me funciono :D gracias

    alejandro astorga :d

  8. A las 18/2/09 16:25  

    Anonymous Anónimo ha dicho...

    hey hola!!! Excelente el articulo.... Pero necesito ayuda.... cuando corro la pagina solo me aparece:

    Hola, Mundo!

    Grafico

    O sea que en vez del grafico me aparece la palabra "Grafico".... no se que pueda ser y como soy nuevo en esto no he podido encontrar el error si me pudieras ayudar lo agradeceria...

  9. A las 18/2/09 16:27  

    Anonymous Anónimo ha dicho...

    hey hola muy buen articulo.... pero tengo un problema, cuando cargo la pagina me aparece esto:

    Hola, Mundo!

    Grafico

    Osea en vez del grafico me aparece la palabra "Grafico" le agradeseria su ayuda....

  10. A las 25/2/09 15:32  

    Anonymous Anónimo ha dicho...

    Excelentisimo articulo !!!

    Solo tengo un problema al incorporarlo con struts ya que en el return del modulo produceDataset necesito regresar forzosamente un String ("SUCCESS") para que el xwork.xml sepa a que pagina redireccionar. La pregunta es, como puedo hacer para que cwolf tome el dataset ? ya que me presenta el siguiente error y en el web browser solo visualizo el HOLA MUNDO.



    Nota: estoy trabajando con struts2, java ee y tomcat 6




    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: Cewolf request:
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: Actual Request values:
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: Request Parameter -> height Value -> 300
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: Request Parameter -> img Value -> 1907955754
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: Request Parameter -> iehack Value -> .png
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: Request Parameter -> width Value -> 400
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: user-agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; es-es) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: referer: http://localhost:8080/zimag-web/loggin.html
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: cache-control: max-age=0
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: accept: */*
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: accept-language: es-es
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: accept-encoding: gzip, deflate
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: cookie: JSESSIONID=2E0F6FCBF4E4555835DEF53B49ED181D; style=default
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: connection: keep-alive
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    INFO: CewolfServlet: host: localhost:8080
    25-feb-2009 12:15:15 org.apache.catalina.core.ApplicationContext log
    GRAVE: CewolfServlet: you need to specifiy a producer for the data of the chart.
    de.laures.cewolf.util.Assert$AssertionException: you need to specifiy a producer for the data of the chart.
    at de.laures.cewolf.util.Assert.check(Assert.java:39)
    at de.laures.cewolf.taglib.DataContainer.getDataset(DataContainer.java:49)
    at de.laures.cewolf.taglib.SimpleChartDefinition.getDataset(SimpleChartDefinition.java:34)
    at de.laures.cewolf.taglib.SimpleChartDefinition.produceChart(SimpleChartDefinition.java:30)
    at de.laures.cewolf.taglib.AbstractChartDefinition.getChart(AbstractChartDefinition.java:121)
    at de.laures.cewolf.taglib.ChartImageDefinition.ensureRendered(ChartImageDefinition.java:137)
    at de.laures.cewolf.taglib.ChartImageDefinition.getSize(ChartImageDefinition.java:146)
    at de.laures.cewolf.CewolfRenderer.doGet(CewolfRenderer.java:153)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.opensymphony.webwork.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
    at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at zimag.web.web.MessageFilter.doFilter(MessageFilter.java:32)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:613)
    DEBUG - UserAction.finalize(175) | zimag.web.web.UserAction@6fae04 finalized.
    DEBUG - UserAction$2.finalize(196) | zimag.web.web.UserAction$2@fd54d4b4 terminado.
    DEBUG - UserAction.finalize(175) | zimag.web.web.UserAction@f1a75d finalized.





    De antemano gracias !!!!!!

  11. A las 26/2/09 12:43  

    Anonymous Anónimo ha dicho...

    Okay, ya lo he logrado.
    Gracias a aquellos que lo leyeron, y por si a alguien le sirve la solución fue agregar un producer dentro de la jsp. Esto es:

    < cewolf:data >
    < cewolf:producer id="produceDataset"/ >
    < /cewolf:data >


    Donde el action retornará efectivamente el dataSet


    Saludos !!

  12. A las 14/5/09 07:21  

    Anonymous Anónimo ha dicho...

    Hola!!!
    Tengo un problema similar al de Alejandro, al mostrar la pagina JSP por el navegador, carga, pero en el lugar donde debería ir el grafico sale un recuadro blanco (como que no carga la imagen), al darle al boton derecho (mostrar imagen) me salta la excepcion:

    HTTP Status 500 -

    --------------------------------------------------------------------------------

    type Exception report

    message

    description The server encountered an internal error () that prevented it from fulfilling this request.

    exception

    javax.servlet.ServletException: Servlet execution threw an exception
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:222)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:146)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:209)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)

    etc, etc...

    Ya no se que mas probar. Si tienes alguna idea, me seia de gran ayuda.

    Muchas gracias.

    Esther

  13. A las 14/5/09 10:22  

    OpenID elblog ha dicho...

    Perdón. No sé por qué no pegué la parte del data producer en index.jsp. Asunto arreglado.

  14. A las 15/5/09 06:40  

    Anonymous Anónimo ha dicho...

    Hola!!!

    Ese no es mi problema ya que yo si que tengo el data producer en el .jsp. Ademas este codigo ya me funciona en otra maquina en la que lo tengo instalado pero ahora lo estoy intentando instalar en un Solaris10(la otra era Solaris8) y no funciona. No se xq sera ya que todo esta igual que en la otra pero no consigo q cargue la imagen. Alguna idea?
    Muxas gracias

  15. A las 25/5/09 14:01  

    Hola
    felicitaciones !!!!! me funciono perfecto oye de causualidad tu tienes un ejemplo de como hacer lo mismo pero apartir de consultas que se le haga a una bd
    gracias, utillizo postgresql

    mi correo es caroljohanar@gmail.com

  16. A las 15/9/09 12:33  

    Blogger Christian Ortega ha dicho...

    Que va bobo hijueputa, ud se lo copió del tutorial de cewolf: http://cewolf.sourceforge.net/new/index.html. Sólo le agregó lo de NetBeans. debería haber mencionado que el ejemplo es de la página de CeWolf o bien heberse inventado uno.

    A propósito, ¿no sabe cómo carajo hacer un overlaidchart?....es que no encuentro por ningún lado esa maricada.

  17. A las 15/9/09 13:31  

    Blogger ooscarr ha dicho...

    En el primer párrafo dice con negrita que lo traduje de la página de Cewolf. Algunas partes del código cambiaron.

    Para hacer un overlaidchart, revisa el código fuente de http://code.google.com/p/werp/source/browse/trunk/suporte/WEB-INF/cewolf.tld

    Nunca lo he hecho, hace tiempo que no uso Cewolf. Perdón y saludos.

  18. A las 27/11/09 18:56  

    Anonymous Anónimo ha dicho...

    Excelente garcias por compartirlo.

  19. A las 3/2/10 13:31  

    Anonymous Anónimo ha dicho...

    hola disculpa ese articulo esta muy bueno es gusto lo q necesito y porsiacaso hay en pdf para descarga me lo podrias enviar gracias................

Página principal

Publicidad