Iniciando com Servlet == problemas

4 respostas
E

Olá!!!
Estou com um problema, e não consigo resolver porque estou aprendendo servlets agora :oops:

To criando um aservlet que gera um grafico do JFreeChart do tipo Meter, mas ai quero passar alguns parâmetros, para criar mais de um gráfico. (Classe1)

Tenho outra servlet que vai colocar a imagem no html. Faco um for (de teste) para criar a iteração e imprimir elas.

Ocorre este erro:
java.lang.IllegalStateException: getWriter() has already been called for this response

O metodo da classe 1 esta separado dentro da classe.

A unica coisa que quero é conseguir colocar no html vários gráficos. Existe uma maneira mais fácil de fazer isso?

Classe1
public synchronized JFreeChart geraMeter(Double nValorDial, Double nRangeMin, Double nRangeMax, int nTipo, String sLink, HttpServletRequest request, HttpServletResponse response)
    {
        
        DefaultValueDataset oValorDataset = new DefaultValueDataset(nValorDial);
        
        MeterPlot oMeter = new MeterPlot(oValorDataset);
        
        Range range = new Range(nRangeMin, nRangeMax);
        
        oMeter.setRange(range);
        oMeter.setDialShape(DialShape.PIE);
        oMeter.setUnits("");
        oMeter.setValuePaint(Color.WHITE);
        oMeter.setDialBackgroundPaint(Color.WHITE);
        oMeter.setDialOutlinePaint(Color.LIGHT_GRAY);
        oMeter.setNeedlePaint(Color.GRAY);
        
        // se o Meter é do tipo 1 ele será quanto maior melhor, entãos seta a label e as cores necessárias
        if (nTipo == 1)
        {
            MeterInterval interval1 = new MeterInterval("Minimo", new Range(nRangeMin, 40.0), Color.GRAY, new BasicStroke(1), Color.GREEN);
            MeterInterval interval2 = new MeterInterval("Medio", new Range(40.0, 80.0), Color.GRAY, new BasicStroke(1), Color.YELLOW);
            MeterInterval interval3 = new MeterInterval("Maximo", new Range(80.0, nRangeMax), Color.GRAY, new BasicStroke(1), Color.RED);
            
            oMeter.addInterval(interval1);
            oMeter.addInterval(interval2);
            oMeter.addInterval(interval3);
        }
        else
        {
            MeterInterval interval1 = new MeterInterval("Minimo", new Range(80.0, nRangeMax), Color.GRAY, new BasicStroke(1), Color.RED);
            MeterInterval interval2 = new MeterInterval("Medio", new Range(40.0, 80.0), Color.GRAY, new BasicStroke(1), Color.YELLOW);
            MeterInterval interval3 = new MeterInterval("Maximo", new Range(nRangeMin, 40.0), Color.GRAY, new BasicStroke(1), Color.GREEN);
            
            oMeter.addInterval(interval1);
            oMeter.addInterval(interval2);
            oMeter.addInterval(interval3);
        }
        
        oMeter.setTickLabelsVisible(false);
        
        JFreeChart oJChart = new JFreeChart(oMeter);
        oJChart.removeLegend();
        oJChart.setBackgroundPaint(Color.WHITE);
        
        try
        {
            OutputStream out = response.getOutputStream();
            
            String type = request.getParameter("grafico");
            
            response.setContentType("image/png");
            
            ChartUtilities.writeChartAsPNG(out, oJChart, 100, 100);
            
            out.close();
            
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
        return oJChart;
    }
Classe2
protected synchronized void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
        PrintWriter out = new PrintWriter(response.getWriter());
        
        ArrayList oArray = new ArrayList();
        oArray.add(50.0);
        oArray.add(98.0);
        oArray.add(34.0);
        oArray.add(90.0);
        
        response.setContentType("text/html");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Meters</title>");
        out.println("</head>");
        out.println("<body>");
        
        for (int i = 0; i < oArray.size(); i++)
        {
            Double nValorDial = (Double) oArray.get(i);
            Double nRangeMin = 0.0;
            Double nRangeMax = 100.0;
            int nTipo = 1;
            String sLink = "http://teste.com.br";
            
            wsqoGraficoMeter oMeter = new wsqoGraficoMeter();
            JFreeChart chart = oMeter.geraMeter(nValorDial, nRangeMin, nRangeMax, nTipo, sLink, request, response);
            
            try
            {
                String param = request.getParameter("grafico");
                out.println("<p>");
                out.println("<img src=\"wsqoGraficoMeter?tipo=" + chart + "\" border=0 width=400 heigth=300/>");
                out.println("    ");
            }
            catch (Exception e)
            {
                System.err.println("*************** ERRO ***************");
                System.err.println(e.toString());
            }
        }
        
        out.println("</body>");
        out.println("</html>");
        out.flush();
        out.close();
    }

Abraços!

4 Respostas

B

Ola,

O problema é simples… em http vc só pode ter um tipo de resposta… então na classe2, vc seta um contentType no response… faz os procedimentos, legal, mas depois vc chame o geraMeter que seta outro contentType… ae dá erro.

E

OK, mas como resolver???
Não adianta eu remover o contentType do grafico, ai é que ele não vai aparecer na outra servlet como imagem mesmo…
Mesmo removendo o contentType do getMeter(…) continua ocorrendo o mesmo erro!

B

Ola,

Continua acontecendo pq no getMeter vc fecha o output, e no metodo que chama o getMeter vc continua escrevendo no mesmo output :wink: , o jeito para resolver isto… talves seria vc gerar a imagem e guardar num local temporário no seu servidor… e colocar as tags de inclusão de imagens no html… acho que resolve… mas deixa a pergunta ae, tem gente aqui no PJ que saca bam mais de web que eu…

Eu tb tô estudando, voltando, depois de um longo tempo longe… :wink:

B

Ola,

Continua acontecendo pq no getMeter vc fecha o output, e no metodo que chama o getMeter vc continua escrevendo no mesmo output :wink: , o jeito para resolver isto… talves seria vc gerar a imagem e guardar num local temporário no seu servidor… e colocar as tags de inclusão de imagens no html… acho que resolve… mas deixa a pergunta ae, tem gente aqui no PJ que saca bam mais de web que eu…

Eu tb tô estudando, voltando, depois de um longo tempo longe… :wink:

Criado 30 de novembro de 2006
Ultima resposta 30 de nov. de 2006
Respostas 4
Participantes 2