2009-08-10 17 views
5

Estoy intentando generar gráficos dinámicamente utilizando JFreeChart como resultado de algunas casillas de verificación que el usuario selecciona, pero no puedo encontrar la mejor forma de obtener los conjuntos de datos generados en forma de gráfico (tengo un código que crea gráficos a partir de estos, pero necesita producir pngs) y en la vista JSP. Actualmente, solo puedo pensar en enviar los conjuntos de datos al JSP, pero no puedo pensar qué hacer a partir de ahí ... ¿Cómo hago para que el usuario envíe el formulario a servlet, el servlet genere conjuntos de datos, los gráficos producidos a partir de los conjuntos de datos , pngs de los charts y finalmente pngs enviados a jsp? O algo por el estilo.Genere dinámicamente JFreeChart en el servlet

public void doPost(HttpServletRequest request, 
        HttpServletResponse response) 
        throws IOException, ServletException{ 

    String[] metrics  = request.getParameterValues("metrics"); 
    String[] fileNames = request.getParameterValues("files"); 

    List<CategoryDataset> results = new ArrayList<CategoryDataset>(); 
    DMCalc calculator = new DMCalc(metrics, fileNames); 
    calculator.calculateResults(); 
    results.add(calculator.getEditDistanceDataset()); 
    results.add(calculator.getSimilarityDataset()); 
    results.add(calculator.getTimeChartDataset()); 

    request.setAttribute("results", results); 
    RequestDispatcher view = request.getRequestDispatcher("metricResult.jsp"); 

    view.forward(request, response); 
} 

UPDATE:

Al tener el método doPost generar los conjuntos de datos desde el puesto de usuario, que entonces se puede almacenar en los campos, posteriormente la RequestDispatcher reenvía al usuario de la JSP que luego llama al método doGet del servlet en una etiqueta img, que utiliza los conjuntos de datos almacenados anteriormente en los campos para producir un png y que luego se muestra por el HTML en el JSP.

+1

Suena como su solución se romperá tan pronto como dos usuarios están utilizando la página a la vez - ¡no es seguro almacenar nada en los campos de una clase servlet! –

+0

ah, está bien, ¿hay alguna manera de lograr lo mismo? – Robert

+0

La solución fácil es el objeto HttpSession. Hacer HttpSession session = request.getSession(); y luego session.setAttribute ("resultados", resultados); en el formulario servlet, y session.getAttribute ("results") en el servlet del gráfico. –

Respuesta

4

Haga que su archivo JSP incluya una etiqueta donde el atributo src es el nombre de su servlet. A continuación, sólo tiene el servlet devuelve la tabla de PNG:

OutputStream out = response.getOutputStream(); 
    response.setContentType("image/png"); 
    ChartUtilities.writeChartAsPNG(out, chart, width, height); 

páginas JSP son realmente sólo pretenden salida HTML u otros datos de texto. Aunque podría obligar al JSP a generar el PNG, no hay ningún beneficio en hacerlo de esa manera.

Parece que desea crear una página dinámica que se actualice en función de un cambio de estado del menú desplegable. Para esto, necesita usar Javascript que se activa cuando el menú cambia, y actualiza el valor del atributo src de la etiqueta img. Luego, el navegador volverá a cargar la imagen de su servlet con un nuevo gráfico.

+0

¿Cómo lo hago para que: el usuario envíe el formulario a servlet, el servlet genere datasets, los gráficos producidos a partir de datasets, los pngs de los gráficos y finalmente los png enviados a jsp? – Robert

+0

Este servlet solo hace una cosa: crea la imagen PNG de un gráfico. Aún necesitará tener una página JSP separada para contener la etiqueta . No se necesita RequestDispatcher para esto. –

+0

permítanme expresarlo de manera diferente: no puedo mostrar los png sin los conjuntos de datos, que deben ser generados por el formulario enviado por el usuario. Podría hacer un servlet que solo maneje una cosa, produciendo un PNG, pero ¿cómo le daría el conjunto de datos para poder hacer eso, ya que es generado por el formulario enviado? – Robert

5

Le sugiero que utilice la clase ServletUtilities. Se guarda en el tempdir Java Y se limpia cuando la sesión se invalida. :) Otra sugerencia para mostrar el archivo es usar el servlet DisplayChart para obtener sus imágenes. Esto va en web.xml

 <servlet> 
    <servlet-name>DisplayChart</servlet-name> 
    <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>DisplayChart</servlet-name> 
     <url-pattern>/servlet/DisplayChart</url-pattern> 
    </servlet-mapping> 

Ésta es entonces cómo aparece la imagen usando jstl:

<img src="<c:url value='/servlet/DisplayChart?'><c:param name='filename' value='${yourFileNameHERE}' /></c:url>" alt=""/>