Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

problema con servlet che genera immagine

3 views
Skip to first unread message

marco

unread,
Nov 1, 2001, 6:21:16 AM11/1/01
to
Ciao a tutti.
Ho realizzato una semplice servlet che mi genera un grafico a barre. Sul mio
computer funziona perfettamente (uso tomcat 3.1 e jdk 1.3), mentre sul
server che ospita il mio sito non c'è verso di farla funzionare. Mi viene
risposto il seguente messaggio di errore:

Error: 500
Location: /fantacalc.it/servlet/Grafico
Internal Servlet Error:

java.lang.NoClassDefFoundError: sun/awt/X11GraphicsEnvironment
at java.lang.Class.forName1(Native Method)
at java.lang.Class.forName(Class.java:134)
at
java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment
.java:64)
at java.awt.Window.(Window.java:190)
at java.awt.Frame.(Frame.java:318)
at java.awt.Frame.(Frame.java:265)
at Grafico.doGet(Grafico.java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:405)
.... etc ....

Da cosa può dipendere?
Il problema credo che sorga nella riga 48, in cui viene creata una istanza
della classe Frame, che verrà poi usata per generare l'oggetto image. C'è un
modo alternativo per creare l'oggetto image senza usare la classe Frame? Sul
libro Java Servlet Programming viene accennato che in java 1.2 è possibile
creare un oggetto image usando BufferedImage, ma non dice come si fa.

Ecco il codice completo della servlet. La servlet fa uso della classe
GifEncoder e altre prelevate da www.acme.com

import java.io.*;
import java.awt.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Grafico extends HttpServlet {

private final int larg=260; // larghezza immagine
private final int spaz=20; // spazio tra una barra e l'altra
private final int ds=90; // spazio a sx del grafico
private final int dd=40; // spazio a dx del grafico
private final int spes=8; // spessore barre
private final Color colore=Color.red; // colore barre
private final int fontSize=11;
private final int car=10; // num max caratteri etichetta

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

Frame frame=null;
Graphics g=null;

// lettura parametri
String num=req.getParameter("num");
int i,n;
try {
n=Integer.parseInt(num);
} catch (Exception e) {return;}
String[] nomi=new String[n];
for (i=0;i<n;i++) {
nomi[i]=req.getParameter("n"+i);
if (nomi[i]==null) return;
if (nomi[i].length()>10)
nomi[i]=nomi[i].substring(0,car);
}
String[] v=new String[n];
int[] valori=new int[n];
double d;
for (i=0;i<n;i++) {
v[i]=req.getParameter("v"+i);
if (v[i]==null) return;
try {
d=Double.parseDouble(v[i]);
} catch (Exception e) {return;}
valori[i]=(int) d;
}

// calcolo valore massimo barra
int max=valori[0];
for (i=0;i<n;i++) if (valori[i]>max) max=valori[i];

try {

// generazione oggetto Graphics
frame=new Frame(); // qui c'è l'inghippo!
frame.addNotify();
Image image=frame.createImage(larg,spaz*n);
g=image.getGraphics();

// disegno del grafico
int lm=larg-ds-dd;
int l;
g.setFont(new Font("Serif",Font.BOLD,fontSize));
for (i=0;i<n;i++) {
l=((max==0) ? 0 : ((int) (((double)
lm)*(((double) valori[i])/((double) max)))));
g.setColor(Color.black);
g.drawString(nomi[i],2,10+(i*spaz));
g.setColor(Color.darkGray);
g.fillRect(ds+2,4+(spaz*i),l,spes);
g.setColor(colore);
g.fillRect(ds,2+(spaz*i),l,spes);
g.setColor(Color.black);
g.drawString(v[i],ds+l+5,10+(spaz*i));
}

// invio immagine
res.setContentType("image/gif");
ServletOutputStream out=res.getOutputStream();
GifEncoder encoder=new GifEncoder(image,out);
encoder.encode();
}
finally {
if (g!=null) g.dispose();
if (frame!=null) frame.removeNotify();
}
}
}

Il mio sito:
****************************
* www.fantacalcissimo.it *
****************************


Fabrizio Marini

unread,
Nov 1, 2001, 9:37:42 AM11/1/01
to
Ho letto velocemente ma temo che il tuo sito sia su una macchina unix
sprovvista delle librerie Motif e quindi X11 ...
Il problema e' che usi awt .... ed awt se le va a cercare non essendo al
100% scritto in Java ....
Io feci una cosa del genere con JAI, ma su pc .... prendile e guarda se le
librerie di Jai ti fanno generare una immagine off-line senza bisogno di
usare una frame ....
Capito?

--
Fabrizio Marini
Company Partner

K-Tech S.r.l.
Via Tibullo, 13
00193 - Rome (RM) - Italy
http://www.k-tech.it
http://www.javaportal.it
Phone: +39 (0) 6 68301467
E-mail: f.ma...@k-tech.it / fabry....@mclink.it


"marco" <ocra...@libero.it> wrote in message
news:MeaE7.21215$7A4.1...@news.infostrada.it...

marco

unread,
Nov 2, 2001, 4:22:31 AM11/2/01
to
Penso che hai ragione tu, il mio sito è su una macchina unix. Dove le trovo
queste librerie JAI?


"Fabrizio Marini" <fabry....@mclink.it> ha scritto nel messaggio
news:9rrmqg$18js$1...@newsreader1.mclink.it...

Fabrizio Marini

unread,
Nov 2, 2001, 6:57:03 AM11/2/01
to
su www.javasoft.conm naturalmente...
jai = java advanced imaging
ciao


--
Fabrizio Marini
Company Partner

K-Tech S.r.l.
Via Tibullo, 13
00193 - Rome (RM) - Italy
http://www.k-tech.it
http://www.javaportal.it
Phone: +39 (0) 6 68301467
E-mail: f.ma...@k-tech.it / fabry....@mclink.it


"marco" <ocra...@libero.it> wrote in message

news:rBtE7.27708$7A4.1...@news.infostrada.it...

marco

unread,
Nov 4, 2001, 5:36:35 AM11/4/01
to
Alla fine sono ricorso alla soluzione più semplice: ho trasformato la
servlet in un applet. Non sarà una soluzione molto elegante ma il risultato
visivo è quello cercato!
Ciao!

"Fabrizio Marini" <fabry....@mclink.it> ha scritto nel messaggio

news:9ru1p9$1hng$1...@newsreader1.mclink.it...

0 new messages