it.comp.java
Frequently Asked Questions
versione 1.06b
aggiornata a Febbraio 2002
(prima versione: Gennaio 1998)
---------------------------------------------------------------------------
-----
La versione WWW di questa FAQ (se non la state giè leggendo) si trova a
http://space.tin.it/computer/csadun/javafaq.html.
Quest'ultima è sempre la versione più aggiornata. Ci sono dei mirror più o
meno aggiornati a:
http://www.java-net.tv/faq/faq.htm
http://www.freeweb.org/computer/SourceNet/faq_java.htm
http://www.geocities.com/Eureka/9125/i_faq.htm
http://bertola.eu.org/usenet/faq/testi/icj-faq.txt
http://www.programmazione.it/index.php?entity=earticle&idArticle=191&idArea
=18
http://www.mokabyte.it/mokafaq/index.htm (Questo mirror è stato
incorrettamente modificato per indicare erroneamente che la versione più
aggiornata sia quella.. il che non è ;-)
viene inoltre pubblicata periodicamente sui newsgroups it.faq e
it.it.comp.java
Se vuoi, prima di proseguire leggi le note relative a questa FAQ.
---------------------------------------------------------------------------
-----
Questa FAQ in italiano su java e' mantenuta da Cristiano Sadun
(crs...@tin.it), essenzialmente elaborando o copiando le domande/risposte
e i contributi apparsi sul newsgroup it.comp.java. Ovviamente, per motivi
di spazio, non tutti i contributi sono considerati: generalmente, se
possibile, si e' data preferenza ai contributi piu' dettagliati; ad es.,
per la domanda 'Che libro comprare per iniziare', una risposta come 'il
libro X contiene a,b,c,d,...' e' generalmente preferita ad una del tipo
'compra X'. Questa non e', comunque, una regola generale, e i fattori
necessari per l'inserimento sono soprattutto il tempo che ho di leggere le
news, il fatto che abbia fame o meno (e che quindi usi il detto tempo per
mangiare un panino o per scrivere) e, in ultima analisi, il caso :^) ).
Non rispondo, ovviamente, ne' dell'aggiornamento ne' dell'affidabilita'
delle informazioni qui contenute, ne' di eventuali danneggiamenti
conseguenti a qualunque uso delle stesse. Allo stesso modo, nessuna
informazione ha intenzionalmente carattere pubblicitario o qualche effetto
economico su di me o sull'autore del contributo.
Tuttavia, ogni correzione, commento o contributo e' benvenuto: per
comodita', inviateli in email a crs...@tin.it preponendo [JAVA FAQ] al
subject.
La faq e' divisa in sezioni [SEZ], in approssimazione sui tipi di
interventi apparsi sul newsgroup: domande tecniche, opinioni e valutazioni
su strumenti e versioni, newbies-faq, etc. Ciascuna sezione puo' essere
divisa in sottosezioni [SS] piu' dettagliate. Ciascuna sezione/sottosezione
contiene una serie di domande[D]/risposte[R] o un thread [T] interessante
su un argomento specifico.
Mirroring
Chiunque voglia farne un mirror, è benvenuto. L'unica condizione è di
preservare il link alla "versione più aggiornata" nella nota sopra, e i
link agli altri mirror. Se volete comparire nell'elenco più sopra,
mandatemi semplicemente una mail e (tempo permettendo) sarete inclusi.
Siete liberi di modificare la veste grafica a vostro piacimento.
---------------------------------------------------------------------------
-----
Indice
[SEZ1] Principianti
[D1.1] Come scaricare un'applet e metterla nella propria pagina
[D1.2] Si puo' spedire/ricevere email da un'applet?
[D1.3] Si puo' fare FTP da un'applet?
[D1.4] Imparare Java: devo conoscere C/C++?
[D1.5] Voglio imparare - come fare?
[D1.6] Esiste un'applet che...
[D1.7] Java su IE 4.0 ?
[D1.8] Come mai createImage non funziona ?
[D1.9] La mia applet non funziona su Communicator/IE/etc..!!
[D1.10] Esistono risorse in rete per Java (riviste/tutorial/manuali etc) ?
[D1.11] Cos'e' un'architettura three-tier
[D1.12] Come si accede a un database <access,oracle,db2,...> da Java?
[D1.13] Cosa vuol dire rendere daemon un thread?
[D1.14] Come eseguire un semplice programma Java con il JDK?
[D1.15] Riesco a compilare ma non a lanciare il mio programma! Perche?
[D1.16] A che servono le interfacce?
[D1.17] E' vero che Java non ha i puntatori?
[D1.18] Come mai clone() non funziona?
[D1.19] Cos'è una servlet?
[D1.20] Esistono motori servlet free?
[D1.21] Si può realizzare una CGI in Java?
[D1.22] Come faccio a riconoscere il sistema operativo?
[D1.23] Come faccio a lanciare un programma esterno?
[D1.24] Dov'e' classes.zip nel JDK1.2? (o 2, o 1.3 etc) ?
[D1.25] Si puo' accedere alla porta seriale? Come si fa?
[D1.26] Gulp! getenv() è stato deprecato! Che faccio?
[D1.27] Come faccio ad accedere alle variabili d'ambiente?
[D1.28] Swing, come farle funzionare con i browser?
[D1.29] Ho Windows 98 e il cursore del mouse mi pasticcia lo schermo!
[D1.30] C'è un editor che...
[D1.31] Lavorando a caratteri, come posso fare un clearscreen? (pulire lo
schermo?)
[D1.32] Posso scrivere a colori sulla "console" di Java?
[D1.33] Come faccio a posizionare il cursore dove voglio sulla console?
[D1.34] C'è qualcosa di simile alla conio.h del C per controllare lo
schermo a caratteri?
[D1.35] Come si mettono le virgolette (") in una stringa?
[D1.36] Ho un errore Unable to initialize threads: cannot find class
java/lang/Thread! Cos'è?
[D1.37] Nello stack trace di un'eccezione c'è scritto "compiled code"!
[D1.38] Si può usare RMI in Internet Explorer?
[D1.39] RMI funziona in AppletViewer ma non in Internet Explorer!
[D1.40] Usando RMI con Internet Explorer ho un'eccezione
ClassNotFoundException!
[D1.41] È possible accedere ad un database Access (od ODBC) da un'applet?
[D1.42] È possible creare un exe da una classe Java?
[D1.43] Ho cambiato il valore di java.class.path ma la JVM non trova
ugualmente le mie classi!
[D1.44] Come faccio a sapere la directory corrente?
[D1.45] Posso lanciare un'applicazione senza avere aperta la finestra di
console?
[D1.46] Com'e' che le operazioni coi double/float sono sbagliate?
[D1.47] Come mai in Java operazioni coi double/float danno risultati
diversi che in C/C++?
[SEZ2] Domande tecniche
[SS2.0] Varie
[D2.0.1]Visualizzare le proprietà Java predefinite
[D2.0.2]Proprietà di console di Java
[D2.0.3]Come funziona java.class.path?
[D2.0.4]Come funzionano le operazioni con numeri reali (double/float)?
[SS2.1] Socket e comunicazioni
[D2.1.1]Un'applet puo' connettersi a un host (per fare ftp, spedire/leggere
mail, etc) ?
[SS2.2] JDBC
[D2.2.1]Bridge JDBC/ODBC in IE3 e JDK
[D2.2.2]Accedere ad un database Access da remoto via RMI
[SS2.3] Compatibilita' C++
[D2.3.1]E' possibile riusare codice C++ ?
[D2.3.2]Mini-confronto tra Java e C++
[SS2.4] Sicurezza ed applet firmate
[D2.4.1]Applet firmate
[SS2.5] Servlet
[D2.5.1]Cos'è una servlet?
[D2.5.2]Una servlet è un solo oggetto?
[SS2.6] RMI
[D2.6.1]Si può usare RMI con Internet Explorer 4/5?
[SEZ3] Libri
[D3.1]Per Iniziare
[SEZ4] Tools di sviluppo/reportistica
[D4.1.1] Sunsoft Java Workshop
[D4.2.1] Strumenti di reportistica
[D4.3.1]Editor e tools
[SEZ5] Varie
[T5.1] Portabilita' vera e presunta - I
[T5.2] Prerequisiti per imparare Java
[T5.3] Java e C++
[T5.4] Soluzioni di reportistica per Java
---------------------------------------------------------------------------
-----
FAQ
[SEZ1] Principianti
[D1.1] Come scaricare un'applet e metterla nella propria pagina
Subject: Aiuto su applet
Date: Mon, 05 Jan 1998 20:52:16 GMT
From: eri...@mbox.vol.it (Lele)
Organization: Telecom Italia Net
Newsgroups: it.comp.java
Ciao sono un principiante del linguaggio java e sto cercando qualcuno che
mi possa dire come fare per scaricare sul mio computer un pagina contenente
degli applet java(giochi matematici) e poi passarli su una mia pagina
personale. L' indirizzo da cui cerco di scaricare e' www.cut-the-knot.com e
la mia e-mail e' eri...@mbox.vol.it Grazie Lele
[R1.1]
Subject: Re: Aiuto su applet
Date: Tue, 06 Jan 1998 00:27:58 +0100
From: Alexis Paul Bertolini <bert...@promo.it>
Organization: Warehouse Creations
To: Lele <eri...@mbox.vol.it>
Newsgroups: it.comp.java
1) Vai alla pagina che ti serve (nel nostro esempio
http://www.cut-the-knot.com/SimpleGames/Horse.html)
2) Guarda il codice sorgente della pagina
3) A un certo punto trovi il seguente testo:
<APPLET CODE="Horse.class" WIDTH=360 HEIGHT=280>
<param name="fcolor" value="000000">
<param name="bcolor" value="c0dcc0">
</APPLET>
4) Tu necessiti del file Horse.class, disponibile all'URL
http://www.cut-the-knot.com/SimpleGames/
5) Digita questa URL e "track!" ecco il contenuto della directory,
horse.class compreso. Nota che ci sono anche altri .class, e' molto
probabile che ti servano!
Horse.class 20-Oct-97 20:07 2k
Horse.html 01-Jan-98 14:48 3k
HorseCanvas.class 20-Oct-97 22:11 7k
HorsePanel.class 20-Oct-97 20:07 2k
6) Scaricati questi file, falli girare un po', vedi se funziona, inserisci
il codice del punto 3) nella tua pagina preferita, metti i file del punto
5) nella stessa localita' (sito, directory, etc.) e hai passato il gioco
alla tua home!
7) Comunica al sottoscritto l'URL della tua home.
---------------------------------------------------------------------------
-----
[D1.2] Si puo' spedire/ricevere email da un'applet?
[R1.2] [R1.2.1]
Subject: mail in java
Date: Wed, 16 Dec 1998 13:51:58 GMT
From: serg...@iol.it
Organization: Italia Online
Newsgroups: it.comp.java
(Java1.1)
E' possibile con un applet spedire dei messaggi (o megli dei dati acquisiti
con dei TextField) in un indirizzo di posta elettronica?
Per adesso sono limitato a generare un file soltanto nel sito web di
provenienze della mia applet.
JavaMai1.1 (che nel frattempo sto scaricando) può servirmi in questo?
[R1.2]
Subject: Re: mail in java
Date: Thu, 17 Dec 1998 15:30:06 +0100
From: flavio caocci <flavio...@fiatgsa.it>
Organization: Fiat GSA To: serg...@iol.it
Newsgroups: it.comp.java
serg...@iol.it wrote:
E' possibile. Ti allego un esempio che ho avuto da un tecnico Sun
Utilizzare previa installazione di JavaMail
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
/**
* usage: sendmessage to from smtphost multipart
*
* Send a simple text/plain message to the "to"
* address, from the "from" address, using the
* smtphost as the machine with the smtp server
* running.
*
* if multipart is "true" send a multipart message
* else if multipart is "false" send a text/plain
* message.
*/
public class sendmessage {
public static void main(String[] args) {
if (args.length != 4) {
System.out.println( "usage: sendmessage <to> <from> <smtphost>
<true|false>");
System.exit(1);
}
boolean debug = false;
// change to get more information
String msgText = "A body.\nthe second line.";
String msgText2 = "Another body.\nmore lines";
boolean sendmultipart =
Boolean.valueOf(args[3]).booleanValue();
// set the host
Properties props = new Properties();
props.put("mail.smtp.host", args[2]);
// create some properties and get the default Session
Session session = Session.getDefaultInstance(props, null);
session.setDebug(debug);
try { // create a message
Message msg = new MimeMessage(session);
// set the from
InternetAddress from = new InternetAddress(args[1]);
msg.setFrom(from);
InternetAddress[] address = {new
InternetAddress(args[0])};
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject("JavaMail APIs Test");
if (!sendmultipart) { // send a plain text message
msg.setContent(msgText, "text/plain");
} else {
// send a multipart message
// create and fill the first message part
MimeBodyPart mbp1 = new MimeBodyPart();
mbp1.setContent(msgText, "text/plain");
// create and fill the second message part
MimeBodyPart mbp2 = new MimeBodyPart();
mbp2.setContent(msgText2, "text/plain");
// create the Multipart and its parts to it
Multipart mp = new MimeMultipart();
mp.addBodyPart(mbp1);
mp.addBodyPart(mbp2);
// add the Multipart to the message
msg.setContent(mp);
}
Transport.send(msg);
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
[R1.2.1]
Vedi inoltre [R2.1.1]
---------------------------------------------------------------------------
-----
[D1.3] Si puo' fare FTP da un'applet?
[R1.3]
Vedi [R2.1.1] per sapere verso che hosts si può fare FTP.
Per quanto riguarda il come, ci sono vari metodi:
Usare un URL "ftp" per prelevare un file:
try {
URL u = new URL("ftp://pippo.com/mio/file.txt");
URLConnection uc = u.openConnection();
uc.setDoInput(true);
uc.connect();
InputStream is = uc.getInputStream();
...codice che legge lo stream di input
} catch (Exception e) {
e.printStackTrace();
}
Se si usa la JVM Sun, avvalersi del client ftp gia' fornito col JDK (ma
"nascosto" nelle classi implementative Sun) sun.net.ftp.FtpClient.
Usare un client FTP costruito ad hoc. Ecco ad esempio:
Subject: Re: FTP con il JAVA: Come?
Date: 16 Oct 1999 09:53:01 +0200
From: Marco Pozzato
Organization: TIN
Newsgroups: it.comp.java
"tqt" == togliere questo testo writes:
tqt>
tqt> Quale funzione permette di upgradare e/o trasferire file su una
tqt> directory di un dominio
tqt> protetto con password ecc... ecc...?
Ecco quà quello che ti serve.
---------------------------------------------------------------------
//////////////////////////////////////////
/// split here for Linlyn.java //
// At last! Java code to read/write files on the server from an applet!
// This is the famous Linlyn code.
//
// Use:
// compile this file, and have your applet call it as below.
//
// to upload a file:
// Linlyn ftp = new Linlyn( <servername>, <user>, <password> );
// ftp.upload( <directory>, <filename>, <contents of file> );
//
// to download a file:
// Linlyn ftp = new Linlyn( <servername>, <user>, <password> );
// String contents = ftp.download( <directory>, <filename> );
//
// the default is ASCII transfer, an overloaded method does bin.
//
// All parameters and return values are Strings. E.g.
// Linlyn ftp = new Linlyn( "rtfm.mit.edu", "anonymous",
"linden@@" );
// String contents = ftp.download(
// "/pub/usenet-by-group/comp.lang.java.programmer"
// "Java_Programmers_FAQ" );
//
// [the actual values above are not generally valid, substitute
// your own server for your first attempt, see note 1.]
//
// Notes:
// 1. Usual applet security rules apply: you can only get a file
// from the server that served the applet.
// 2. The applet server must also be an FTP server. This is NOT true
// for some ISPs, such as best.com. They have separate FTP and
// http machines. This code may work on such a setup if you put
// the classfiles into the ftp area, and in the HTML file say:
// <applet codebase="ftp:///home/linden/ftp" code="t.class"
// 3. This code does not break Java security.
// It uses FTP to transfer files. If the author of the applet
// has FTP disabled you are out of luck.
// It breaks regular system security however, as it publishes
// (effectively) your ftp password. Only use on an Intranet and
// with authorization.
// 4. Compiling this causes some deprecation warnings. We wanted to
// stick with code that would work in JDK 1.0 browsers.
// 5. Each upload or download creates, uses, and terminates a new
// ftp session. This is intended for low volume transfer, such
// as the ever popular high-score files.
// 6. Look at the source for the methods for binary transfers.
//
// Version 1.0 May 6 1998.
// Version 1.1 May 20 1998. -- added a debugging flag
// Version 1.1a May 26 1998. -- fixed the ASCII/BIN flag inversion
// Version 1.1b May 29 1998. -- added the security warning.
// Version 2.0 Jul 1, 1998. -- Updated to parse multi-string responses
// a la RFC 959
// Version 2.1 Aug 5, 1998. -- Updated to work with VMS ftp servers
// VMS does not send either a ")" OR a
")."
// terminating the IP number, port
sequence
// in response to PASV.
// Version 2.1a Aug 6, 1998 -- more than one line as a "hello"
message.
// (tvalesky@@patriot.net)
//
// Authors:
// Robert Lynch
// Peter van der Linden (Author of "Just Java 1.1" book).
//
// Support:
// Unsupported: That's why we give you the source.
// Help may be available on time & materials basis only.
// You can get copious debug information by changing the
// commented lines in Linlyn.java below and recompiling.
//
// Copyright 1998 Robert Lynch, Peter van der Linden
// This work is distributed under the GNU GPL, version 2.
//
// Those using the code do so at their own risk and the authors
// are not responsible for any costs, loss, or damage which may
// thereby be incurred.
import java.io.*;
import java.net.*;
import java.util.*;
class Linlyn {
// FOR INITIAL DEBUGGING: set the variable to "true"
private boolean DEBUG = false;
// constructor needs servername, username and passwd
public Linlyn(String server, String user, String pass) {
try {
ftpConnect(server);
ftpLogin(user, pass);
} catch(IOException ioe) {ioe.printStackTrace();}
}
public String download(String dir, String file)
throws IOException { return download(dir, file, true); }
public String download(String dir, String file, boolean asc)
throws IOException {
ftpSetDir(dir);
ftpSetTransferType(asc);
dsock = ftpGetDataSock();
InputStream is = dsock.getInputStream();
ftpSendCmd("RETR "+file);
String contents = getAsString(is);
ftpLogout();
return contents;
}
public void upload(String dir, String file, String what)
throws IOException { upload(dir, file, what, true); }
public void upload(String dir, String file, String what, boolean asc)
throws IOException {
ftpSetDir(dir);
ftpSetTransferType(asc);
dsock = ftpGetDataSock();
OutputStream os = dsock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
ftpSendCmd("STOR "+file);
dos.writeBytes(what);
dos.flush();
ftpLogout();
}
///////////////// private fields ////////////////////
private String getAsString(InputStream is) {
int c=0;
char lineBuffer[]=new char[128], buf[]=lineBuffer;
int room= buf.length, offset=0;
try {
loop: while (true) {
// read chars into a buffer which grows as needed
switch (c = is.read() ) {
case -1: break loop;
default: if (--room < 0) {
buf = new char[offset + 128];
room = buf.length - offset - 1;
System.arraycopy(lineBuffer, 0,
buf, 0, offset);
lineBuffer = buf;
}
buf[offset++] = (char) c;
break;
}
}
} catch(IOException ioe) {ioe.printStackTrace();}
if ((c == -1) && (offset == 0)) {
return null;
}
return String.copyValueOf(buf, 0, offset);
}
private void ftpConnect(String server)
throws IOException {
// Set up socket, control streams, connect to ftp server
// Open socket to server control port 21
csock = new Socket(server, CNTRL_PORT);
// Open control streams
InputStream cis = csock.getInputStream();
dcis = new DataInputStream(cis);
OutputStream cos = csock.getOutputStream();
pos = new PrintStream(cos);
// handle more than one line returned
String reply = dcis.readLine();
String numerals = reply.substring(0, 3);
String hyph_test = reply.substring(3, 4);
String next = null;
if(hyph_test.equals("-")) {
boolean done = false;
while(!done) { // read lines til find "" -> last line
next = dcis.readLine();
if(next.substring(0,3).equals(numerals) &&
next.substring(3, 4).equals(" "))
done = true;
}
}
if(numerals.substring(0,3).equals("220")) // ftp server alive
; // System.out.println("Connected to ftp server");
else System.err.println("Error connecting to ftp server.");
}
private void ftpLogin(String user, String pass)
throws IOException {
ftpSendCmd("USER "+user);
ftpSendCmd("PASS "+pass);
}
private void ftpSetDir(String dir)
throws IOException {
// cwd to dir
ftpSendCmd("CWD "+dir);
}
private void ftpSetTransferType(boolean asc)
throws IOException {
// set file transfer type
String ftype = (asc? "A" : "I");
ftpSendCmd("TYPE "+ftype);
}
private Socket ftpGetDataSock()
throws IOException {
// Go to PASV mode, capture server reply, parse for socket setup
// V2.1: generalized port parsing, allows more server variations
String reply = ftpSendCmd("PASV");
// New technique: just find numbers before and after ","!
StringTokenizer st = new StringTokenizer(reply, ",");
String[] parts = new String[6]; // parts, incl. some garbage
int i = 0; // put tokens into String array
while(st.hasMoreElements()) {
// stick pieces of host, port in String array
try {
parts[i] = st.nextToken();
i++;
} catch(NoSuchElementException nope){nope.printStackTrace();}
} // end getting parts of host, port
// Get rid of everything before first "," except digits
String[] diggies = new String[3];
for(int j = 0; j < 3; j++) {
// Get 3 characters, inverse order, check if digit/character
diggies[j] = parts[0].substring(parts[0].length() - (j + 1),
parts[0].length() - j); // next: digit or character?
if(!Character.isDigit(diggies[j].charAt(0)))
diggies[j] = "";
}
parts[0] = diggies[2] + diggies[1] + diggies[0];
// Get only the digits after the last ","
String[] porties = new String[3];
for(int k = 0; k < 3; k++) {
// Get 3 characters, in order, check if digit/character
// May be less than 3 characters
if((k + 1) <= parts[5].length())
porties[k] = parts[5].substring(k, k + 1);
else porties[k] = "FOOBAR"; // definitely not a digit!
// next: digit or character?
if(!Character.isDigit(porties[k].charAt(0)))
porties[k] = "";
} // Have to do this one in order, not inverse order
parts[5] = porties[0] + porties[1] + porties[2];
// Get dotted quad IP number first
String ip = parts[0]+"."+parts[1]+"."+parts[2]+"."+parts[3];
// Determine port
int port = -1;
try { // Get first part of port, shift by 8 bits.
int big = Integer.parseInt(parts[4]) << 8;
int small = Integer.parseInt(parts[5]);
port = big + small; // port number
} catch(NumberFormatException nfe) {nfe.printStackTrace();}
if((ip != null) && (port != -1))
dsock = new Socket(ip, port);
else throw new IOException();
return dsock;
}
private String ftpSendCmd(String cmd)
throws IOException
{ // This sends a dialog string to the server, returns reply
// V2.0 Updated to parse multi-string responses a la RFC 959
// Prints out only last response string of the lot.
pos.print(cmd + "\r\n" );
String reply = dcis.readLine();
String numerals = reply.substring(0, 3);
String hyph_test = reply.substring(3, 4);
String next = null;
if(hyph_test.equals("-")) {
boolean done = false;
while(!done) { // read lines til find "" -> last line
next = dcis.readLine();
if(next.substring(0,3).equals(numerals) &&
next.substring(3, 4).equals(" "))
done = true;
}
if(DEBUG)
System.out.println("Response to: "+cmd+" was: "+next);
return next;
} else
if(DEBUG)
System.out.println("Response to: "+cmd+" was: "+reply);
return reply;
}
private void ftpLogout() {// logout, close streams
try {
if(DEBUG) System.out.println("sending BYE");
pos.print("BYE" + "\r\n" );
pos.flush();
pos.close();
dcis.close();
csock.close();
dsock.close();
} catch(IOException ioe) {ioe.printStackTrace();}
}
private static final int CNTRL_PORT = 21;
private Socket csock = null;
private Socket dsock = null;
private DataInputStream dcis;
private PrintStream pos;
}
---------------------------------------------------------------------------
-----
[D1.4] Imparare Java: devo conoscere C/C++?
[R1.4]
Le opinioni sono diverse. Vedi [T5.2] per una discussione approfondita.
---------------------------------------------------------------------------
-----
[D1.5] Voglio imparare - come fare?
[R1.5]
Le risorse principali per Java si trovano su http://java.sun.com o
http://javasoft.sun.com. E' qui' disponibile un ottimo tutorial (in
inglese). Lo stesso puo' essere scaricato piu' velocemente da uno dei
numerosi SunSite esistenti - ad esempio sunsite.dsi.unimi.it al DSI di
Milano. Per quanto riguarda i libri su Java, vedi la sezione [SEZ3]
---------------------------------------------------------------------------
-----
[D1.6] Esiste un'applet che...
[R1.6]
Esistono in rete numerosi depositi (repository) di applet gia' belle e
pronte.
Uno dei piu' grandi e' "Gamelan" (http://www.gamelan.com), dotato anche di
un efficace motore di ricerca.
Vedi anche [R1.10].
---------------------------------------------------------------------------
-----
[D1.7] Java su IE 4.0 ?
Subject: Jdk 1.1.4 e IE 4.0
Date: Sun, 18 Jan 1998 10:19:41 +0100
From: Alessandro Giovanelli <giov...@abanet.it>
Organization: Italia Com - Il Primo Consorzio di Internet Providers
italiani
Newsgroups: it.comp.java
C'e' nessuno che mi sda dire se esiste un patches per IE 4 per far girare
applet JDK 1.1.4.
Con Comm. 4.0.4 funziona tutto alla perfezione (Swing e JFC comprese) ma
con IE 4.0 ci sono problemi.
[R1.7]
Subject: Re: Jdk 1.1.4 e IE 4.0
Date: Mon, 19 Jan 1998 12:23:51 +0100
From: Francesco Ciacca <fran...@sinapsi.com>
Organization: Sinapsi s.r.l.
Newsgroups: it.comp.java
Alessandro Giovanelli wrote:
Non so se ti puo' andar bene come soluzione , ma adesso Sun distribuisce
free un plug-in per IE (>=3.0) e Netscape (se non mi sbaglio >=3.0,forse la
2.0 ma non ricordo bene)che si sostituisce alla JVM del browser in uso con
una complemetamente jdk 1.1.X (RMI ecc..) compliant.
Questo prodotto (forse e' ancora in beta ma funziona) si chiama Java
Activator [Oggi Java Plugin, -cs], lo trovi su
http://www.javasoft.com/plugin
E' un po' esigente in termini di memoria e non e' velocissimo, ma le
prossime release dovrebbero superare almeno in parte questi problemi.
---------------------------------------------------------------------------
-----
[D1.8] Come mai createImage non funziona ?
Subject: Double buffering
Date: Mon, 19 Jan 1998 09:55:59 +0100
From: Gianluca Maggio <mag...@iesi.ba.cnr.it>
Organization: CNR - Area di Ricerca - Bari,Italy
Newsgroups: it.comp.java
Qualcuno mi sa dire perche' utilizzando il double buffering sono costretto
a creare l'immagine "off-screen" nel metodo update o paint e non nel
costruttore della mia classe? Il problema non e' solo estetico poiche' sono
costretto a effettuare un test del tipo:
if (offScreenImage == null)
offScreebImage = createImage(200,200);
ogni volta che update viene chiamato (nel mio caso dalle 20 alle 40 volte
al secondo).
Perche' se uso createImage nel costruttore ho un null-pointer, o meglio
perche' non mi crea l'immagine?
[R1.8]
Subject: Re: Double buffering
Date: Mon, 19 Jan 1998 17:34:23 +0100
From: "Leonardo Boselli" <bos...@technologist.com>
Organization: TETRACTYS Software
Newsgroups: it.comp.java
Se si tratta di un'applet devi inserire
offScreenImage = createImage(200,200);
nel metodo init(), che viene chiamato per inizializzare l'applet prima di
utilizzare repaint().
---------------------------------------------------------------------------
-----
[D1.9] La mia applet non funziona su Communicator/IE/etc..!!
[R1.9]
Ciascun browser contiene la *propria* JVM (Java Virtual Machine): le
versioni 3.x di IE e Navigator supportano la versione 1.0.2 di Java: le
applet costruite con versioni successive (1.1.x o 1.2) di Java *NON*
possono funzionare. Communicator (anche la versione 4.04) supporta solo
*parzialmente* la versione 1.1, a meno che non sia venga installata la
patch apposita usando SmartUpdate oppure disponbile in
http://developer.netscape.com/software/jdk/download.html#WIN32_MANUAL_INSTA
LL
(courtesy of Hacker Hobos <hacke...@tin.it>).
Per IE4 potete provare l'Activator (cfr. [D1.7]).
---------------------------------------------------------------------------
-----
[D1.10] Esistono risorse in rete per Java (riviste/tutorial/manuali etc) ?
[R1.10] [R1.10.1]
[R1.10]
Il sito ufficiale per java (inglese): http://java.sun.com
Contiene un tutorial inglese fatto molto bene e piuttosto aggiornato
JARS (inglese): http://www.jars.com
Contiene una quantita' notevole di software esistente, freeware, shareware
e dimostrativo
Mokabyte (italiano): http://mokabyte.infomedia.it
Rivista di programmazione
Java Lobby (inglese): http://www.javalobby.org
Il nome dice tutto
Il corso Java di Michele Sciabarrà (italiano): http://www.corsojava.it
Un corso introduttivo in italiano, in HTML. Scaricabile direttamente a
http://www.corsojava.it/corsojava.zip
Thinking in Java (inglese), il libro di Bruce Eckel su java
Uno dei migliori libri introduttivi all'object orientation in generale e a
java in particolare
[R1.10.1]
Subject: Re: All
Date: Sun, 06 Dec 1998 15:10:22 GMT
From: TTIOOT@z.r
Organization: Customer of Flashnet S.p.A. - http://www.flashnet.it
Newsgroups: it.comp.java
>Giorno.. sto cercando una buona guida On-Line per imparare a programmare
in
>Java.
>Premetto che di tale linguaggio di programmazione so meno di zero.
Ti mando il testo di un messaggio da me postato settimane or sono proprio
per chi come te parte da zero.
Spero che queste sintetiche indicazioni siano utili per i molti che,
volendo cimentarsi con Java, non sanno da dove iniziare.
Su www.javasoft.com si trovano tre cose indispensabili e sufficienti per
iniziare:
L' ambiente di sviluppo (JDK)
La documentazione delle classi
Il Tutorial
Vi permetteranno di imparare i fondamentali di Java e di avere una
panoramica esaustiva sul linguaggio.
Su www.mcp.com trovi molti libri di programmazione in formato eletronico
(su Java e su altri linguaggi) che possono esserti utili.
Su www.gamelan.com trovate un repository di applet e applicazioni (molti
sono prodotti commerciali ma non mancano shareware e freeware con sorgenti
a disposizione)
Infine suggerisco le riviste tipo mokabyate (www.mokabyte.it) o
www.javaworld.com.
Efisio Bova
---------------------------------------------------------------------------
-----
[D1.11] Cos'e' un'architettura three-tier
[R1.11]
Subject: Re: Problemi di sicurezza
Date: Tue, 24 Feb 1998 10:48:05 +0100
From: Roberto Lo Giacco <guyb...@siasys.it>
Organization: Excess Software
Newsgroups: it.comp.java
[ho fatto una minima variazione per chiarezza -cris]
Se il server a cui [l'applet] deve collegarsi è diverso da quello dal quale
hai downloadato la pagina html allora la connessione two-tier
(client-server) è impossibile causa tipologia restrizioni di sicurezza
predefinite per le applet ed in questo caso devi sviluppare una
architettura three-tier ossia una applicazione che gira sul server e che
non è altro che un intermediario con il server di prima...
---------- ---------------- ------------
| Applet | <<<--->>> | Applicazione | <<<--->>> | Servizio |
---------- ---------------- ------------
CLIENT STESSA MACCHINA SERVER SERVIZIO
SU CUI GIRA IL
SERVER HTTP
---------------------------------------------------------------------------
-----
[D1.12] Come si accede a un database <access,oracle,db2,...> da Java?
Subject: Java & basi di dati
Date: Wed, 18 Mar 1998 12:28:11 +0100
From: Alberto d'Onofrio <dono...@merlino.iasi.rm.cnr.it>
Organization: IASI CNR
Newsgroups: it.comp.java
Buongiorno,
devo realizzare un programma in Java (che stu studiando alacremente, ma di
cui non posso dirmi certo un esperto) per uso accademico che ha la
necessita' di salvare ed interrogare dei dati. Conosco bene MS Access e
Visual Basic ed avevo pensato a questo tipo di base di dati.
E' possibile far interagire Java con un database Microsoft ? Sono necessari
drivers particolari, come mi sembra di aver capito ?
Che esperienze avete fatto in merito ? Che mi consigliate ?
[R1.12]
Re: Java & basi di dati
Date: Thu, 19 Mar 1998 14:57:17 +0100
From: Cristiano Sadun <n...@spam.grazie>
To: Alberto d'Onofrio <dono...@merlino.iasi.rm.cnr.it>
Newsgroups: it.comp.java
(cfr. anche [D1.41]) JDBC e' l'architettura standard di accesso ad database
per Java. Essa consiste in un insieme di interfacce standard (viste
dall'applicazione), nel package java.sql, per le quali ciascun produttore
di db fornisce un'implementazione (driver JDBC).
JDBC e' *compresa* nelle versioni di Java superiori o uguali alla 1.1 - per
Java 1.0.2 e' necessario aggiungere il supporto JDBC esplcitamente (per
esempio, dal sito dall'intersolv, http://www.intersolv.com).
Nei JDK >= 1.1 viene fornito anche un driver che fa uso di ODBC (detto
'bridge jdbc-odbc'), che permette di accedere direttamente a database ODBC
compliant.
Attenzione: per le applet, sia Netscape che IE possiedono il supporto JDBC,
ma richiedono tecniche diverse per attuarlo (cfr.[D2.2.1]).
Le guide all'uso di JDBC si trovano, come sempre, a java.sun.com.
---------------------------------------------------------------------------
-----
[D1.13] Cosa vuol dire renere daemon un thread?
Subject: Daemon thread
Date: Mon, 19 Oct 1998 17:05:40 +0200
From: David Visicchio <dvisi...@atel.it>
Organization: Centro Servizi Interbusiness
Newsgroups: it.comp.java
Ho creato un'applicazione server che gestisce una connessione via socket.
Ora vorrei trasformare tale applicazione in un demone in modo da poterlo
lanciare in background. [Leggete la risposta! SetDaemon non serve a
questo!] A tal fine ho invocato la funzione setDaemon con true e ho reso la
funzione run senza uscita. Quando lancio l'applicazione però il demone
muore... Riporto di seguito una parte del codice di esempio.
Grazie
[R1.13]
Subject: Re: Daemon thread
Date: Mon, 19 Oct 1998 15:34:13 GMT
From: bos...@to.NOSPAM.it (Bruno Bossola)
Organization: Atos SpA
Newsgroups: it.comp.java
Chiamando la setDaemon(true) fai esattamente l'inverso di quello che
vorresti! ;-D
L'applicazione Java, infatti, termina quando tutti i thread non-demoni sono
terminati e quindi, appena termina il main(), viene concluso l'unico thread
non demone che funzionava (quello che eseguiva il main) e la VM esce!
Se vuoi che la VM stia su se il tuo thread gira, devi fare esattamente il
contrario, ovvero setDaemon(false).
Per poi lanciare l'applicazione come demone, beh, devi usare le
funzionalità offerte dal tuo OS.
---------------------------------------------------------------------------
-----
[D1.14] Come eseguire un semplice programma con il JDK?
Subject: DOMANDA: Come eseguire un semplice programma con il JDK?
Date: Sat, 26 Dec 1998 13:19:06 GMT
From: rinonucara*anti...@mclink.it_antispam
Organization: MC-link The World On Line
Newsgroups: it.comp.java
Ho il seguente software per dos:
Java(tm) Development Kit
JDK(tm) 1.1.1
e ho fatto questo piccolo programma:
class CiaoMondo{
public static void main(String args[]){
system.out.println("Ciao mondo!");
}
}
Quali sono i passi per:
- vedere se ci sono errori
- eseguirlo (magari da solo, non inserito in una pagina)
---------------------------------------------------------------------------
-----
[R1.14]
Subject: Re: AIUTO:come eseguo un programma scritto in Java?
Date: Sat, 26 Dec 1998 17:16:39 +0100
From: "Alex Martelli" <al...@magenta.com>
Organization: None in sight
Newsgroups: it.comp.java
Supponi di avere una "class pippo" in un file sorgente pippo.java, e il suo
metodo static public main che fa cio` che desideri.
Avendo scaricato e istallato il Java Developers Kit (JDK) della Sun,
secondo le istruzioni che lo accompagnano (in particolare, avrai posto
nella PATH della tua utenza, Unix o Windows che sia, il directory degli
eseguibili JDK), vai ad un prompt nel directory dove vive pippo.java (da un
qualsiasi shell in Unix, da un command prompt in Windows) e scrivi il
comando:
javac pippo.java
Questo dovrebbe funzionare (se non hai errori) senza dire nulla, e creare
(verificalo con DIR, o ls) un nuovo file pippo.class. Adesso, sempre in
questo directory, scrivi il comando:
java pippo
e questo eseguira` il metodo main della classe pippo tratto dal file
pippo.class del directory corrente.
Alex
---------------------------------------------------------------------------
-----
[D1.15] Riesco a compilare ma non a lanciare il mio programma! Perche?
[R1.15]
1.
Java 1.0.x e 1.1.x (per 1.2, vedi il punto 3. sotto) richiedono che la
variabile d'ambiente CLASSPATH esista e contenga i paths alle directory
contenenti le classi che componongono il programma che si vuole eseguire.
In alternativa, l'opzione -classpath permette di definire questi path
quando si lancia il programma vero e proprio.
Ad esempio, se
CLASSPATH = c:\jdk1.1.7\lib\classes.zip;c:\mieclassi\;.
indica al programma "java" che la classe che vogliamo far girare si puo'
trovare in c:\jdk1.1.7\lib\classes.zip *oppure* in c:\mieclassi *oppure*
nella directory corrente (.)
2.
Se la classe e' in un package, va usato il nome "fully qualified": se ad
esempio avete definito la classe "MiaApplicazione" nel package
"mie.classi", la COMPILAZIONE avviene (stando nella directory che contiene
MiaApplicazione.java) con
javac MiaApplicazione.java
ma il LANCIO del programma avviene con
java mie.classi.MiaApplicazione
Il CLASSPATH, come in 1., dovra' contenere la directory dove il *package*
e' contenuto.
3.
Le cose cambiano un po' con Java 1.2: le classi vengono cercate prima nel
BOOT CLASS PATH (di cui di solito non dovete preoccuparvi - in ogni caso
sono i files nelle directory di "sistema" di Java, di norma /jre/lib, come
rt.jar e i18n.jar), poi nell'EXTENSION CLASS PATH (di solito la directory
/jre/lib/ext) dove vengono messi i JAR con le estensioni (i package javax);
infine, nell'APPLICATION¨ CLASS PATH, che e' definito da:
- "." per default (il che significa che se le classi sono nella directory
corrente non e' necessario specificare nulla)
- il valore di CLASSPATH (se esiste)
- il valore dato dell'opzione a linea di comando -cp (o -classpath).
- oppure potete specificare un JAR file con -jar (ma TUTTE le classi
applicative devono arrivare da li').
Per maggiori informazioni, vedere
http://java.sun.com/products/jdk/1.2/docs/tooldocs/findingclasses.html
---------------------------------------------------------------------------
-----
[D1.16] A che servono le interfacce?
Sto leggendo un libro sul Java che accenna alle interfacce ma non è molto
chiaro. Cosa sono, a che servono? come si dichiarano?
[R1.16]
Subject: Re: AIUTO: chiarimenti sulle INTERFACCE.
Date: Sat, 2 Jan 1999 21:42:15 +0100
From: "Alex Martelli" <al...@magenta.com>
Organization: None in sight
Newsgroups: it.comp.java
Una "interface" si dichiara nella forma:
interface Nome /* ev. "extends AltraInterfaccia */ {
// dichiarazione di costanti e metodi
// NB SOLA dichiarazione, NON implementazione!
};
A parte le costanti, che sono sostanzialmente cosette "di comodo", una
interfaccia e` sostanzialmente un insieme di _dichiarazioni di metodi_.
Un "codice cliente" puo` ricevere un riferimento ad una interfaccia
(tipicamente come argomento ad un costruttore o altro metodo),
eventualmente salvarselo in qualche variabile d'istanza, e _usarlo_ --
chiamare metodi di quella interfaccia -- *senza* preoccuparsi minimamente
di come quei metodi possano essere stati "implementati".
Una o piu` classi possono poi asserire la clausola "implements Nome", e
sono allora tenute ad avere implementazioni di tutti i metodi della
interfaccia Nome; in questi casi, un riferimento a una di queste classi
puo` essere passato dovunque sia richiesto un riferimento all'interfaccia
Nome, tipicamente in "codice cliente" come appena visto.
La programmazione basata su interfacce e` il piu` puro e produttivo degli
approcci al polimorfismo, e quindi alla programmazione ad oggetti. Grazie
ad essa si "disaccoppia" interamente il "codice cliente", che usa le
interfaccie, dal codice che implementa le interfacce stesse. I vantaggi (in
termini di "pulizia", manutenibilita`, estensibilita`, e quindi, alla fin
fine, di produttivita` a lungo termine) sono veramente enormi.
Alex
---------------------------------------------------------------------------
-----
[D1.17] E' vero che Java non ha i puntatori?
Subject: [Q] Vettori in C e in java
Date: Tue, 13 Apr 1999 23:05:16 GMT
From: cub...@tin.it
Organization: TIN
Newsgroups: it.comp.java
Buongiorno a tutti!
Sto iniziando a programmare in java, e mi trovo di fronte ad un dilemma.
Sto tentando il porting su java di un programma scritto in C, che fa un
forte uso di array allocati dinamicamente e di riferimenti. Mi chiedo ora
se sia possibile utilizzare gli array di java (ma mi sembra di no, visto
che per scelte di progetto i puntatori non esistono) oppure se sia meglio
sfruttare la classe Vector.
Quest'ultima ipotesi mi lascia un po' perplesso per due motivi:
- è una struttura dati esagerata per i miei scopi
- l'implementazione di array a due dimensione mi sembra (ad occhio) un po'
macchinosa
In sostanza, ho il sospetto che la classe Vector vada bene per collezioni
di oggetti, ma male per matrici di reali.
Cosa mi consigliate?
[R1.17]
Subject: Re: [Q] Vettori in C e in java
Date: 14 Apr 1999 09:14:50 GMT
From: crs...@tin.it (Cristiano Sadun)
Newsgroups: it.comp.java
Attenzione: in java non hai l'*aritmetica* dei puntatori (che percio'
tecnicamente si chiamano riferimenti) ma siccome ogni oggetto e' allocato
dinamicamente in modo esplicito (con una new) e' proprio il contrario -
praticamente hai "solo" puntatori. :)
Un array C/C++ a n dimensioni si traduce immediatamente in Java, e la
notazione e' simile; ad es
int a[10][20]; (statico) o
int **a = malloc(10*sizeof(int *));
for(i=0;i<10;i++) a[i]=malloc(20*sizeof(int));
(dinamico, e poi usi a[x][y])
diventa semplicemente
int a [][] = new int[10][20];
con in piu' check statico e dinamico sui boundaries e proprieta' sulla
lunghezza - in java un array e' un oggetto, non una semplice denotazione
per una zona di memoria.
L'array java e' dinamico, cioe' al posto di 10 e 20 ci possono essere
espressioni qualunque che valutate diano un intero.
>- l'implementazione di array a due dimensione mi sembra (ad occhio) >un
po' macchinosa
Si, decisamente. Se ti servono servizi in piu', puoi dare un'occhiata alla
jgl (java generic library www.objectspace.com) che dispone di numerose
collection e ha una filosofia stile STL.
---------------------------------------------------------------------------
-----
[D1.18] Come mai clone() non funziona?
Subject: Object.clone()
Date: 1999/06/29
From: rza...@tiscalinet.it (Roberto Zagni)
Newsgroups: it.comp.java
Per favore potete aiutarmi a capire perchè non riesco a clonare un oggetto?
[...]
Mentre l'errore che ricevo è:
QueryData.java:111: Can't access protected method clone in class
java.lang.Object. java.util.Set is not a subclass of the current class.
[R1.18]
Subject: Re: Object.clone()
Date: 1999/06/29
From: crs...@tin.it (Cristiano Sadun)
Newsgroups: it.comp.java
Be', scusa, il messaggio d'errore e' chiaro: clone() e' un metodo protetto
e quindi puo' essere invocato solo da una classe derivata. Ora, la cosa e'
effettivamente poco intuitiva. Ci sono un po' di ragioni per questo design,
alcune buone e alcune cattive, ma la situazione e' questa - e "Cloneable"
non e' propriamente al centro delle attenzioni del team di design di
Javasoft, credo.. :) comunque un workaround "pulito" e'
public class C implements Cloneable {
public C createCopy() {
try { return clone(); } catch (Exception e) { return null; }
}
}
e usi
C obj = new C();
...
C clonedObj = obj.createCopy();
---------------------------------------------------------------------------
-----
[D1.19] Cosè una servlet? Come si sviluppa?
Subject: Servlet?
Date: 1999/07/16
From: dana...@tin.it (Ambroset Daniele)
Newsgroups: it.comp.java
Una domanda banale...per me non proprio.
Le servlet dovrebbero essere dei programmini che girano all'interno di una
directory del server, come dei cgi soltanto 100% java.
Se ho ben capito per far girare questo programmino c'è bisogno di un altro
programma web server che faccia da ponte ed installato sul server.....(più
o meno come per un accesso ad un data base da parte di un'applet). La mia
domanda è:
devo scaricarmi il programma ponte per poi installarlo nel server dove
mettero' la servlet, oppure i server (ad esempio della tin) hanno già una
directory specifica??
Il servlet è un programma semplicissimo in Java?? ha bisogno di qualche
accortezza nel passare i dati e nel costruirlo?
Ho capito qualche cosa sulle servlet o sono completamente fuori strada??
[R1.19]
Subject: Re: Servlet?
Date: 1999/07/19
From: tarq...@arcaweb.it (Massimiliano Tarquini)
Newsgroups: it.comp.java
L'idea è sicuramente quella giusta, con qualche differenza: servlet girano
come threads all'interno di una Java Virtual Machine e a differenza dei cgi
che hanno un ciclo vitale del tipo:
->Carica il Cgi
->Esegui il Cgi
->Rimuovi Cgi dalla memoria
ad ogni richiesta, [mentre] le servlet java una volta in esecuzione non
muoiono mai, rimangono caricate in memoria consentendo un aumento notevole
nella velocità di esecuzione.
Che io sappia in italia non esistono server che offrono spazi web con la
possibilità di gestire servlet, per il resto la situazione allo stato
attuale è la seguente:
IIS4 : non gestisce servlet
Netscape Web Server 3.5 gestisce servlet, ma usa la versione 1
Apache ha già dei moduli di gestione, ed in futuro verrà fuso con Java
WebServer.
Comunque comunque io ti consiglio di usare il server della w3c "JigSaw"
Puoi trovare tutta la documentazione sul sito della sun
http://java.sun.com/products/
(Cercate "Java Servlet Development Kit" o JSDK -cris)
---------------------------------------------------------------------------
-----
[D1.20] Esistono motori servlet free?
[R1.20.0] [R1.20.1] [R1.20.2] [R1.20.3]
[R1.20.0]
Una lista completa di motori servlet free si trova a
http://directory.google.com/Top/Computers/Software/Internet/Servers/Applica
tion/Java_Servlet/ [thx. Castagna]
Tomcat (un modulo aggiuntivo per Apache, server http open software) è la
scelta di Sun - a cui ha anche demandato lo sviluppo successivo delle
Servlet API.
[R1.20.1]
Subject: Servlet?
Date: 1999/01/15
From: dana...@tin.it (Ambroset Daniele)
Newsgroups: it.comp.java
Ciao
Si, prova il JRun al sito http://www.livesoftware.com/
io lo uso e mi sembra buono.
[R1.20.2]
Subject: Re: Help - Servlet Engine
Date: Tue, 05 Oct 1999 18:15:14 +0200
From: GL
Newsgroups: it.comp.java
A mio modo di vedere il migliore (+ performante) e' JigSaw... del consorzio
W3C.
Lo trovi su www.w3c.org.
[R1.20.3]
Subject: Re: [FAQ] it.comp.java v0.9d
Date: Tue, 6 Jun 2000 13:02:55 +0200
From: "Roberto Corda"
Newsgroups: it.comp.java
Segnalo anche tomcat come motore servlet free e per di piu' open-source,
che puo essere trovato su http://jakarta.apache.org
---------------------------------------------------------------------------
-----
[D1.21] Si può realizzare una CGI in Java?
Subject: Java CGI
Date: 1998/07/03
From: bass...@mailbox.iunet.it (Claudio Carli)
Newsgroups: it.comp.java
Salve a tutti, vorrei sapere se e' possibile realizzare un CGI in Java.
Vorrei realizzare un piccolo programmino che, richiamato da un pulsante di
un form contenuto in una pagina html, acquisisca i valori contenuti in
alcuni campi del form e li scriva in un file di testo sul server.
Tenete presente che il server non lo gestisco io, per cui non posso
compiere operazioni di amministrazione sullo stesso. Ho solo acquistato uno
spazio nel quale posso saricare le mie pagine ed i miei CGI.
[R1.21]
Subject: Re: Java CGI
Date: 1998/08/03
From: alb...@my-dejanews.com
Newsgroups: it.comp.java
Io ti consiglierei di usare le servlet ... e' pero' necessario che sul
server sia installato il JSDK (Java Servlet Development Kit) che si trova
facilmente in rete e anche un programma di amministrazione come ad esempio
il JRUN Administrator scaricabile anch'esso da Internet.
---------------------------------------------------------------------------
-----
[D1.22] Come faccio a riconoscere il sistema operativo?
Come faccio a sapere su che sistema operativo sta girando la mia
applicazione/applet?
[R1.22]
La proprietà "os.name" contiene una denotazione specifica per ciascun
sistema operativo (ad es. "Windows NT", "Solaris", etc). Cfr. [D2.0.1].
---------------------------------------------------------------------------
-----
[D1.23] Come faccio ad esegure un programma esterno? [R1.23a] [R1.23b]
Subject: Eseguire applicazioni esterne
Date: 1998/09/14
From: Stefano Andreani
Newsgroups: it.comp.java
Vorrei sapere come fare per richiamare l'esecuzione di un'applicazione
(java o no) all'interno di un'applicazione java e (1) attenderne
l'esecuzione, oppure (2) lasciarla in background.
[R1.23]
Subject: Re: Eseguire applicazioni esterne
Date: 1998/09/14
From: Alex Martelli
Newsgroups: it.comp.java
Anzitutto:
Runtime rt = Runtime.getRuntime();
ti ritorna un riferimento all'oggetto Runtime associato alla tua
application. L'oggetto Runtime ha vari overload del metodo exec(), che ti
ritornano un oggetto Process:
Process figlio = rt.exec("pippo.exe e suoi argomenti");
Se ignori completamente l'oggetto Process, il processo figlio continua ad
eseguire per conto suo (il tuo caso [2]). Se vuoi aspettare che il processo
figlio termini, chiama sull'oggetto Process il metodo waitFor: tornera'
immediatamente se il processo figlio e' gia' finito, se no blocchera' il
thread chiamante (la tua intera applicazione, se quello e' il suo unico
thread) sino alla terminazione del processo figlio. Per intenderci,
int rc = figlio.waitFor();
L'intero ritornato e' il codice di uscita del processo figlio.
Ciascuna di queste chiamate puo` naturalmente generare opportune eccezioni
che occorrera' gestire con try/catch, ovvero propagare dal metodo che le
chiama.
[R1.23b] (Esempio da castagna@****.it]
---------------------------------------------------[ Runner.java ]---
/*
Runner - Demo of using java.lang.Runtime class
Java Code by Castagna
Semplicissimo esempio che mostra l'uso della classe java.lang.Runtime
Ringrazio Massimo "il pelandrone" di news:it.comp.java
*/
import java.lang.Runtime;
import java.io.IOException;
public class Runner {
public static void main (String args[]) {
Runtime r = java.lang.Runtime.getRuntime();
try {
String[] strArray = new String[2];
strArray[0]="start.exe"; // nome del processo da lanciare
strArray[1]="musica.mp3"; // parametri da linea di comando...
Process p = r.exec (strArray); // esegue il processo
}
catch (IOException e) {
System.err.println ("Error on exec method call.");
System.exit(1);
}
System.exit(0);
} // main
} // Runner
----------------------------------------------------[ Runner.java ]---
---------------------------------------------------------------------------
-----
[D1.24] Dov'e' classes.zip nel JDK1.2? (o 2, o 1.3 etc)
[R1.24]
Nelle versioni successive alla 1.1, l'ambiente di sviluppo (il JDK, Java
Development Kit, che comprende il compilatore, il debugger, etc) è
nettamente distinto dall'ambiente di esecuzione (JRE, Java Runtime
Environment, che comprende le librerie standard, la JVM, etc). Infatti
quando installate il JDK vi vengono installati entrambi.
L'architettura del JRE divide le classi da "trovare" in:
standard: quelle che erano in classes.zip e ora sono in
<$JRE_HOME>/lib/rt.jar e frattaglie varie (dove <$JRE_HOME> è la directory
dove è installato il JRE);
estensioni: ad esempio JavaMail, JavaComm, etc - librerie ed estensioni di
terze parti, che sono contenute in file JAR in <$JRE_HOME>/lib/ext;
classi applicative: la vostra applicazione
Notate che è cambiato anche il meccanismo di caricamento delle classi: non
si ha più un solo ClassLoader che legge la variabile d'ambiente CLASSPATH,
ma diversi: in sequenza, le classi vengono cercate tra quelle standard, tra
le estensioni ed infine tra le classi applicative. Ulteriori informazioni a
http://java.sun.com/products//jdk/1.2/docs/tooldocs/solaris/migration.html#
clspath.
Al posto di CLASSPATH, il modo più efficace di lanciare le vostre
applicazioni è di specificare il path delle vostre classi applicative
usando l'opzione -cp nella linea di comando (win32):
java -cp c:\app_class com.mieclassi.Pippo
farà sì che la classe Pippo (nel package com.mieclassi, e quindi nel path
relativo com\mieclassi\Pippo.class) venga cercata in c:\app_class (e quindi
trovata al path assoluto c:\app_class\com\mieclassi\Pippo.class).
Notate che non è necessario specificare il path nè delle classi standard nè
delle extensions che vengono cercate automaticamente.
---------------------------------------------------------------------------
-----
[D1.25] Si puo' accedere alla porta seriale? Come si fa?
Subject: come accedere alle COM?
Date: 1999/08/01
From: Nicola Vicino
Newsgroups: it.comp.java
Ciao a tutti,
qualcuno sa` come accedere alle porte seriali da Java?
E se porto il programma da win a linux come faccio?
Grazie in anticipo, Nick
[R1.25]
Subject: Re: come accedere alle COM?
Date: 1999/08/02
From: Carlo Emanuele Demontis
Newsgroups: it.comp.java
Sul sito della SUN sono disponibili le COMM, le API per la gestione delle
porte seriali e parallele in Java. Vi e' anche l'implementazione per Sun
solaris e windows, ma credo che vi si trovino anche le implementazioni per
Linux, anche se non sono sicuro.
tieni presente che in Linux, essendo uno Unix piu' che completo,
probabilmente ti puoi limitare ad aprire un file col nome della porta
seriale, esattamente come faresti con un altro linguaggio. comunque, per il
bene della portabilita', scarica le COMM e usa quelle.
---------------------------------------------------------------------------
-----
[D1.26] Gulp!getenv() è stato deprecato! Che faccio?
[R1.26]
Vedi [R1.27].
---------------------------------------------------------------------------
-----
---------------------------------------------------------------------------
-----
[D1.27] Come faccio ad accedere alle variabili d'ambiente?
Subject: Variabili di ambiente ??
Date: Tue, 26 Oct 1999 18:11:49 GMT
From: bard...@tiscalinet.it (AlessandroBardelli)
Newsgroups: it.comp.java
Come si fà ad accedere alle variabili di ambiente : sotto windows quelle
settate in autoexec , tipo classpath , tanto per interdersi , su
piattaforma Linux quelle definite con l'EXPORT ....??
Forse con System..etc.etc. , se si , posso accdere anche alle variabili
settate da me , tipo PIPPOPATH ??:-) e come ??
[R1.27]
Subject: Re: Variabili di ambiente ??
Date: Wed, 27 Oct 1999 07:44:26 GMT
From: Cristiano Sadun
Newsgroups: it.comp.java
No - da Java 1.1 l'accesso alle variabili d'ambiente e' deprecato - dato
che e' intrinsecamente non portabile (in certi s/o non esistono proprio).
Il trucco e' passare le variabili d'ambiente sulla linea di comando, usando
-D: ad esempio, se hai PIPPOPATH puoi scrivere
java -Dpippo.path=$PIPPOPATH Applicazione
(o java -Dpippo.path=%PIPPOPATH Applicazione in Win32)
e nelle proprieta' di sistema (cfr. System.getProperties()) ti troverai un
bel "pippo.path" col valore di PIPPOPATH.
---------------------------------------------------------------------------
-----
[D1.28] Swing, come farle funzionare con i browser?
Subject: [SWING] - come farle funzionare?
Date: Fri, 05 Nov 1999 23:01:40 GMT
From: "Davide Piras"
Newsgroups: it.comp.java
Ciao, immagino sia una domanda da FAQ...
Come diavolo faccio a visualizzare le swing in Internet Explorer 5??
ho fatto un Japplet che con appletviewer funziona benissimo ma, sullo
stesso HTML, Internet Explorer dice class not found...
p.s. Uso Windows NT
[R1.28]
Subject: Re: [SWING] - come farle funzionare?
Date: Sat, 06 Nov 1999 08:41:31 GMT
From: "Scorpio"
Newsgroups: it.comp.java
Devi utilizzare i Plug-In , perchè le classi Swing non sono implementate in
IE5.
Cerca sul sito di Sun per il codice Html da inserire sulla pagina che
contiene l'applet per richiamare i suddetti plug-in di supporto.
(Il plug-in si trova a http://java.sun.com/products/plugin/index.html [CS])
[D1.29] Ho Windows 98 e il cursore del mouse mi pasticcia lo schermo!
Subject: Problemi di refresh sul puntatore del mouse
Date: Thu, 11 Nov 1999 16:09:16 +0100
From: "Roal Zanazzi"
Newsgroups: it.comp.java
Ho [...] PC con Windows 98, mouse e tastiera radio della Logitech.
Riscontro pero' un problema di "refresh" sul rettangolo che contiene il
puntatore del mouse; in pratica quando sposto il mouse dopo un click, nel
rettangolo suddetto rimane l'immagine che compariva _prima_ di eseguire il
click.
[R1.29]
Subject: Re: Problemi di refresh sul puntatore del mouse!
Date: Sun, 14 Nov 1999 17:40:09 +0100
From: "Gabriele Biarese"
Newsgroups: it.comp.java
Avevo anch'io lo stesso problema con Win98 pur senza aver installato il
Microsoft Plus.
Ho fatto vari tentativi anche per quanto riguarda il driver della scheda
video, il numero dei colori visualizzati e la frequenza di refresh.
Alla fine ho trovato la soluzione: è stato sufficiente andare nel pannello
di controllo > mouse > puntatori e impostare la combinazione su "nessuno" o
"windows standard".
In effetti a quanto pare l'emulazione software dei cursori viene fatta
anche senza il Plus installato, è sufficiente che si scelga una
combinazione di cursori animati o 3D.
[Road ha poi riferito che il problema e' probabilmente imputabile al driver
del suo mouse Logitech -cris]
---------------------------------------------------------------------------
-----
[D1.30] C'è un editor che...
[R1.30]
Vedi [D4.3.1] nella [SEZ4].
---------------------------------------------------------------------------
-----
[D1.31] Lavorando a caratteri, come posso fare un clrscr? (pulire lo
schermo?)
Come si fa a pulire lo schermo di un'applicazione Java che non fa uso di
GUI (Graphical User Interface)?
[R1.31]
Vedi [D2.0.2] per le caratteristiche di console di Java.
---------------------------------------------------------------------------
-----
[D1.32] Posso scrivere a colori sulla "console" di Java?
È possible/come si fa a scrivere a colori sullo schermo di console di
un'applicazione Java che non fa uso di GUI (Graphical User Interface)?
[R1.32]
Vedi [D2.0.2] per le caratteristiche di console di Java.
---------------------------------------------------------------------------
-----
[D1.33] Come faccio a posizionare il cursore dove voglio sulla console?
È possible/come si fa a posizionare il cursore sullo schermo di console di
un'applicazione Java che non fa uso di GUI (Graphical User Interface)?
[R1.33]
Vedi [D2.0.2] per le caratteristiche di console di Java.
---------------------------------------------------------------------------
-----
[D1.34] C'è qualcosa di simile alla conio.h del C per controllare lo
schermo a caratteri?
Usando il c, con conio.h potevo contrallare posizionamento e colori dello
schermo! Come faccio in Java?
[R1.34]
Vedi [D2.0.2] per le caratteristiche di console di Java.
[D1.35] Come si mettono le virgolette (") in una stringa?
[R1.35]
Usa la sequenza \". Ad esempio, per visualizzare "Pippo", lo statement è
System.out.println("\"Pippo\"");
[D1.36] Ho un errore Unable to initialize threads: cannot find class
java/lang/Thread! Cos'è?
[R1.36]
La JVM di Jdk1.1.x (java.exe) mantiene le classi "di sistema" (ad esempio,
java.lang.String, java.util.Vector) in un file, chiamato classes.zip, che
normalmente si trova in JDK/lib/classes.zip (dove JDK è la directory dove
avete installato il jdk). Questo file dev'essere in CLASSPATH (vedi
[R1.15]).
Se la JVM non è di trovare classes.zip, non può nemmeno partire, dato che
la classe java.lang.Thread non può essere trovata.
JDK/JRE1.2 (aka Java 2) risolve questo problema usando una locazione fissa
(di solito JRE_HOME/lib/rt.jar se il JRE (java runtime environment) è stato
installato in /JRE, per cui non è più necessario che l'utente includa
classes.zip nel suo classpath.
In conclusione, se usate JDK1.1 e avete una definizione esplicita di
CLASSPATH, questa deve includere classes.zip: ad esempio, Win32 per
compilare su JDK1.1.8 avrete qualcosa del tipo:
CLASSPATH=c:\jdk1.1.8\lib\classes.zip;c:\classes;.
---------------------------------------------------------------------------
-----
[D1.37] Nello stack trace di un'eccezione c'è scritto "compiled code"!
Subject: Exception stackTrace
Date: Tue, 13 Jun 2000 09:40:25 GMT
From: Marco Azzalini
Newsgroups: it.comp.java
Ciao a tutti, qualcuno sa dirmi perchè a volte nello stack trace di una
eccezione anzichè della riga del sorgente c'è un banale:
compiled code?
Mi capita che lo stesso programma genera eccezioni che a volte riportano la
linea del codice srogente altre volte si "rifugiano" dietro l'inutile
"compiled code"
[R1.37]
Subject: Re: Exception stackTrace
Date: Wed, 14 Jun 2000 07:36:15 GMT
From: Bruno Bossola
Newsgroups: it.comp.java
Perche' il codice e' compilato ;-) dal just-in-time compiler a runtime!
Lancia la VM con il parametro -nojit, in modo da disabilitare il just in
time compiler nelle fasi in cui fai test .
---------------------------------------------------------------------------
-----
[D1.38] Si può usare RMI in Internet Explorer?
[R1.38] Vedi [D2.6.1]
[D1.38] RMI funziona in AppletViewer ma non in Internet Explorer!
[R1.39] Vedi [D2.6.1]
[D1.40] Usando RMI con Internet Explorer ho un'eccezione
ClassNotFoundException!
[R1.40] Vedi [D2.6.1]
[D1.41] È possible accedere ad un database Access (od ODBC) da un'applet?
[R1.41] (Cfr. anche [D2.2.2]) Per quanto riguarda un database ODBC, in IE5
l'uso del bridge jdbc-odbc (che richiede il caricamento di una DLL locale)
non è permesso ad un'applet non firmata (cfr. [D2.4.1]). Siccome
generalmente si accede ad un database Access attraverso il bridge, ne segue
che no, non si può accedere direttamente ad un .mdb da un'applet.
Microsoft™ Access è un prodotto proprietario, così come il formato .mdb,
che Microsoft non rilascia pubblicamente, e per cui Microsoft non ha mai
creato un JDBC driver nativo: di conseguenza non c'è un driver pure-java,
type IV. Quindi, se è possible, la soluzione è di abbandonare MSAccess per
un database per cui esistano driver tipo IV (cfr JDBC Driver Types. Se tale
database è poi accessibile via ODBC, potete addirittura continuare ad usare
il client MSAccess per lavorarci - è solo il database engine che cambia.
Se ciò non è possibile, e non potete firmare l'applet, potete usare una
tecnica multi-thier (cfr. [D1.11]), che però necessita di un webserver che
giri sulla stessa macchina dove risiede il database, e un'apposita
servlet/cgi/isapi che faccia da ponte alle vostre richieste:
+======+ +=======+ +==========+
|applet| ---------> |servlet| ---------> |Jet engine|
+======+ +=======+ +==========+
fa richieste carica il e' il database
HTTP alla servlet driver JDBC-ODBC engine di
Access,
tramite le classi in init() ed che legge files
URL e URLConnection esegue l'sql MDB
contenenti il nome in doPost() o
del database e doGet()
l'sql da eseguire
Esiste anche un driver tipo III per Access, a
http://www.atinav.com/products/aveconnect/aveconnect1/access.htm Attenzione
che i driver tipo III necessitano normalmente di un processo cooperatore
nella macchina che contiene il database, quindi questo driver richiede in
ogni caso l'accesso al server contentente l'mdb (non potete cioè mettere un
.mdb su un server su cui non avete la capacita' di installare prodotti e
usare questo driver).
[D1.42] È possible creare un exe da una classe Java?
[R1.42]
Talvolta sì, ma in generale non vale la pena. Se il problema e'
semplicemente impacchettare il vostro software in qualcosa di facile da
usare/installare per l'utente finale, considerate come alternativa l'uso di
pacchetti di installazione che installino il JRE insieme al vostro
software, se necessario. Ce n'e' addirittura uno scritto in Java,
InstallAnywhere che è parecchio usato e funziona perfettamente. Ah, tra gli
output disponibili c'e' pure l'EXE. :)
Tornando all'EXE, perchè non vale la pena? Trascurando del tutto i problemi
"filosofici" per cui trasformando bytecode in eseguibile si perde in
portabilità, I prodotti disponibili tendono ad essere approssimativi, e i
motivi per cui di solito si vuole un eseguibile sono spesso
malcomprensioni; ad esempio:
Volete un'icona/comando/etc per lanciare una certa applicazione
Da Java1.1 esiste la possiblità di creare JAR esegubili, usando la sintassi
(a linea di comando) java -jar BlaBlaBla.jar. Quindi, impachettate le
vostre classi in un Jar, create un'icona (shortcut in windows) e via;
oppure, un batch/shell script (nessun problema con sistemi unixlike, con
windows NT potete usare la sintassi @java -jar BlaBlaBla.jar %* per passare
a Java i parametri di linea di comando).
Volete evitare di installare il JRE.
Il punto e' che il JRE e' il supporto runtime ad un programma Java - ed
dovete portarvelo dietro (lui, o un equivalente) in qualunque formato sia
il vostro programma. Vero, con tecniche di analisi del codice si potrebbero
eliminare le classi standard non usate dal programma, ma la licenza del JRE
lo impedisce esplicitamente. Come qualunque programma "moderno", sono
comunque in genere parecchi megabytes, sia linkati staticamente o come DLL.
Volete aumentare la velocità di esecuzione
In dipendenza da cosa fa il programma, convertire bytecode in codice nativo
può o non può portare significativi incrementi di velocità. Non dimenticate
che gran parte dei JRE moderni usano tecniche JIT che aumentano
notevolmente le prestazioni, quindi lo sforzo per guadagnare ancora una
minima percentuale di prestazioni spessissimo non vale la candela. Una
tecnica possibile e' quella di riscrivere codice java in C/C++ e lasciare
il compito alle ottimizzazioni del compilatore C/C++ (portandosi dietro, in
genere, lo stesso supporto runtime del JRE, a meno che non si voglia
riscrivere anche quello :-): un progetto in tal senso è a
http://www.cs.arizona.edu/sumatra/toba ma è fermo a JDK1.1.
Server side si possono effettivamente ottenere notevoli miglioramenti. Ad
esempio TowerJ è un ben noto prodotto (commerciale) per NT e DG/UX.
In ogni modo, per windows, trovate ad esempio (a pagamento) JET o Jove.
C'è un prodotto sorgente->nativo open source a http://gcc.gnu.org/java/,e
inoltre, ricordo il ben noto jexegen.exe nel Microsoft SDK con Java
(fornito, se non erro, con VJ++), che però è compatibile solo con la JVM
Microsoft (e quindi ferma a Java1.1).
Eccon una lista più esaustiva, a cura di Castagna:
From: Castagna (cast...@infinito.it)
Subject: [links] Hacking java... a cura di Castagna
Newsgroups: it.comp.java
(This is the only article in this thread)
Date: 2001-05-09 23:56:35 PST
Viste le frequenti domande, anche da parte mia, riguardanti compilatori
da .class in codice nativo (.exe), traduttori (da java a c, da c a java,
da java a c++ e viceversa e/o da/verso altri linguaggi), domande
riguardanti
decompilatori, just-in-time compilers, ecc... ho pensato che avreste
gradito.
A mio parere i progetti da tenere sott'occhio sono:
Jad e Jode come decompilatori, GCJ come compilatore, Jikes.
Altri li ho riportati per il loro valore didattico.
Se avete segnalazioni, prego! :)
-------------------------------------------------------------[ Hacking Java
]---
GCJ - http://gcc.gnu.org/Java/
The GNU Compiler for the Java Programming Language, compiles Java source or
bytecode to native machine code. Most APIs are supported, except the AWT,
Swing and RMI. Open Source! Lo si può usare anche sotto Windows con CygWin
http://sources.redhat.com/cygwin/, ma è ancora lontano dall'essere finito.
JCC - http://www.geocities.com/CapeCanaveral/Hangar/4040/jcc.html
A Java to C converter - A direct Java to C translator. Unlike other
translators
JCC does not convert Java class files, but instead processes Java source
code
directly. Completamente free!
JET Deployment Environment - http://www.excelsior-usa.com/jet.html
built around an optimizing Java to native code compiler for Windows.
The compiler produces conventional EXE and DLL files that do not use JVM
during execution from Excelsior. A pagamento.
Jolt -
http://www.meurrens.org/ip-Links/Java/codeEngineering/blackDown/jolt.html
Hackers-only prototype of a Java bytecode to C translator written in Java.
Toba - http://www.cs.arizona.edu/sumatra/toba
Java-to-C Translator: translates Java class files into C source code to
allow
making, fast, directly executable programs that avoid the overhead of
interpretation. For stand-alone applications, not applets.
IBM Jikes - http://oss.software.ibm.com/developerworks/opensource/jikes/
JikesTM is a compiler that translates Java source files as defined in The
Java
Language Specification into the bytecoded instruction set and binary format
defined in The Java Virtual Machine Specification.
Harissa - http://www.irisa.fr/compose/harissa/
Harissa is a Java environment that includes a compiler from Java bytecode
to C
and a Java interpreter. While Harissa is aimed at applications that are
statically configured, such as the Javac compiler, it is also designed to
allow
code to be dynamically loaded in an already compiled application.
Jasmin - http://mrl.nyu.edu/~meyer/jvm/
Jasmin is a Java Assembler Interface. It takes ASCII descriptions for Java
classes, written in a simple assembler-like syntax and using the Java
Virtual
Machine instruction set. It converts them into binary Java class files
suitable
for loading into a JVM implementation.
JToExe - http://www.bravozulu.com/Products/JToExe/jtoexe.html
Lo riporto solo per "completezza"... il dominio è significativo:"bravo
zulù"...
a chi? A chi lo usa! ;)
BeanShell - http://www.beanshell.org/
BeanShell is a small, free, embeddable, Java source interpreter with object
scripting language features, written in Java. BeanShell executes standard
Java statements and expressions, in addition to obvious scripting commands
and syntax. BeanShell supports scripted objects as simple method closures
like those in Perl and JavaScript(tm).
JFlex - http://www.jflex.de/
JFlex is a lexical analyzer generator (also known as scanner generator)
for Java(tm), written in Java(tm). It is also a rewrite of the very useful
tool JLex which was developed by Elliot Berk at Princeton University.
JLex - http://www.cs.princeton.edu/~appel/modern/Java/JLex/
JLex is a lexical analyzer generator, written for Java, in Java.
JLex was developed by Elliot Berk at Princeton University. It is now
maintained by C. Scott Ananian.
Jad - http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
Jad - the fast Java Decompiler. Jad is a Java decompiler, i.e. program that
reads one or more Java class files and converts them into Java source files
which can be compiled again. Jad is a 100% pure C++ program and it
generally
works several times faster than decompilers written in Java.
JODE - http://jode.sourceforge.net/
JODE (Java Optimize and Decompile Environment) is a Java package containing
a decompiler and an optimizer for Java. This package is freely available
under
the GPL.
Delphi2Java - http://www.javadelphi.com/
Creates Java source code from Delphi's Pascal code. Commerciale :(
See also:
http://dmoz.org/Computers/Programming/Languages/Java/Development_Tools/Tran
slators/
Java Code Engineering & Reverse Engineering -
http://www.meurrens.org/ip-Links/Java/codeEngineering/
-------------------------------------------------------------[ Hacking Java
]---
[D1.43] Ho cambiato il valore di java.class.path ma la JVM non trova
ugualmente le mie classi!
[R1.43]
Vedi [D2.0.3].
[D1.44] Come faccio a conoscere la directory corrente?
[R1.44]
Leggete il valore della system property user.dir, con
String curdir=System.getProperty("user.dir");
[D1.45] Posso lanciare un'applicazione senza avere aperta la finestra di
console?
[R1.45]
Sì. Usa javaw per lanciare l'applicazione, invece di java.
[D1.46] Com'e' che le operazioni coi double/float sono sbagliate??
[R1.46]
Vedi [D2.0.4].
[D1.47] Come mai in Java operazioni coi double/float danno risultati
diversi che in C/C++??
[R1.47]
Vedi [D2.0.4].
---------------------------------------------------------------------------
-----
---------------------------------------------------------------------------
-----
[SEZ2] Domande tecniche
[SS2.0] Varie
[D2.0.1] Visualizzare le proprietà Java predefinite
[R2.0.1]
Java pre-definisce un buon numero di properietà accessibili al vostro
programma, tra cui il sistema operativo su cui il programma sta girando, la
versione della JVM, la directory di lancio del programma, il nome
dell'utente su network, etc.
Una proprietà (cfr. java.util.Properties) e' una coppia (nome, valore)
simile alle variabili di environment di sistemi operativi come Unix, DOS,
Windows, etc.
Potete visualizzarle compilando e lanciando questa semplice classe
(mettetela in un file spp.java, compilate con javac spp.java e lanciate con
java spp):
public class spp /** SysPropertiesPrinter */ {
public static void main(String args[]) {
System.getProperties().list(System.out); }
}
Il metodo System.getProperties(), per motivi di sicurezza, è inaccessibile
ad un'applet. Singole proprietà, però, rimangono accessibili (usando
System.getProperty(String propertyName)): ad esempio, "os.name".
[D2.0.2] Proprietà di console di Java
[R2.0.2]
Chiariamo subito una cosa: Java, di per sè, non fa nessuna assunzione sul
terminale a caratteri su cui System.out emette l'output. O meglio, l'unica
assunzione che viene fatta è che il terminale sia in grado di andare 'a
capo'. Di conseguenza, la risposta semplice a tutte le domande su come
emettere output colorato, posizionare il cursore e cancellare lo schermo è
un non c'e' nulla di predefinito, il che dimostra una volta di più che
raramente le risposte semplici sono utili.
In altri termini, in Java non c'e' - nella libreria standard - nulla di
equivalente della libreria conio di C o Pascal sotto MsDos, per intendersi.
Questo perchè Java, in quanto portabile, non può fare assunzioni sul tipo
di terminale su cui effettivamente l'output va a finire.
Questo non significa che - se è noto il tipo di terminale, o altre
informazioni su di esso - non sia possibile usarle. Vediamo degli esempi:
clearscreen(): se conoscete il numero di linee del terminale, una semplice
implementazione di clrscr() per pulire lo schermo è:
for (int i=0;i<LINEE;i++) System.out.println();
Semplice ma efficace. Del resto molti terminali Unix fanno esattamente
questo.
Posizionamento, colori: se il terminale/i su cui state lavorando supporta
posizionamento del cursore e colore dell'output (ad esempio i terminali
ANSI supportano entrambi, i terminali VT100 solo il posizionamento del
cursore) dovete
a) sapere come accedere a tale supporto
b) implementare tale accesso in Java
Ora, normalmente i terminali forniscono tale supporto riconoscendo
determinate sequenze di escape (ovvero il carattere ASCII 27 [ESC]) seguito
da un codice per la funzione voluta più eventualmente i suoi parametri. Le
trovate con qualunque motore di ricerca, ma per (vostra) comodità, ecco un
link ad una tabella parziale.
Una finestra di Console su NT, una finestra MSDOS sui vari Windows (usando
ANSI.SYS in configurazione) e molte implementazioni di Telnet possono
comportarsi come terminali ANSI. Ne segue che, se inviate le corrette
sequenze di escape al terminale (usando codice come questo:
DataOutputStream os = new DataOutputStream(System.out);
os.write(27);
os.write(...);
Librerie: se non avete voglia di rifar tutto da capo, esistono librerie
commerciali e non che fanno gia' parte o tutto il lavoro. Le trovate
cercando in rete; ad esempio, un'ottima emulazione di ANSI e VT100, in
licenza GNU, si trova a http://www.mud.de/se/jta/.
[D2.0.3] Come funziona java.class.path?
[R2.0.3]
java.class.path è una proprietà di sistema che contiene il classpath usato
dal System ClassLoader per caricare le classi. Notate che è semplicemente
una *copia* creata quando la JVM parte, e non è consultato dal ClassLoader.
Quindi, nonostante (come per tutte le system property) sia possibile
cambiarne il valore, questo cambiamento non ha di per se alcun effetto sul
caricamento delle classi.
Se dovete caricare classi da un classpath definito dinamicamente, dovete
creare un ClassLoader ad hoc (o usare java.net.URLClassLoader). Tenete però
presente che ogni classe "ricorda" il ClassLoader con cui è stata caricata,
e per motivi di sicurezza, una classe caricata con un classloader diverso
da quello di sistema può avere meno diritti di una classe "normale" - ad
esempio, in un'applet, solo le classi caricate dal system ClassLoader
possno fare I/O da disco.
[D2.0.4] Come funzionano le operazioni con numeri reali (double/float)?
[R2.0.4] (fonti varie: si ringraziano tutte)
Se avete provato ad effetture operazioni con numeri decimali (variabili di
tipo double of float), vi sarete accorti che i risultati spesso non sono
accurati.
La reazione del programmatore junior o inesperto di fronte ai risultati in
floating point in Java è spesso quella di insultare il linguaggio o pensare
ci siano bugs o qualcosa che non va. Prendete un bel respiro, e
rilassatevi. Anche se bug sono sempre possibile, in genere non ci sono nè
bug nè nulla di sbagliato (anzi, il supporto al floating point di Java è
tra i migliori disponibili e piuttosto flessibile in termini di
costi/prestazioni)... semplicemente, prima di poter lavorare con successo
con calcoli in floating point, dovete imparare un po' di cose, e magare
applicare qualche trucco.
Per prima cosa, tenete a mente che un calcolatore usa rappresentazioni
finite di numeri. Ciò fa si' che, se non si usa particolare cura al
riguardo nell'implementazione di un calcolo, gli errori si possano
accumulare fino a produrre risultati drasticamente sbagliati.
Eliminiamo subito alcune cause semplici:
State mescolando costanti o espressioni intere e valori decimali: 2 e' una
costante intera. 2.0 e' una costante decimale.
Quando fate operazioni decimali, usate la seconda forma e fate attenzione
ai tipi delle variabili coinvolte. In questo modo, evitate che alcuni
risultati intermedi abbiano tipo intero e quindi le relative operazioni
provochino troncamenti: ad esempio un errore tipico è codice come: int
a=5,b=2; double c=a/b dove c viene assegnato con il risultato della
divisione intera tra a e b, che è ovviamente 2, risultando quindi 2.0.
Al contrario di altri linguaggi/librerie (printf o cout in C/C++, ad
esempio), Java non effettua alcuna approssimazione in fase di stampa.
Dovete esplicitamente usare java.text.DecimalFormat.
Se proprio volete, ci sono librerie che riproducono fedelmente il
comportamento di printf, ad esempio
http://sharkysoft.com/software/java/printf/ o http://www.braju.com/.
Vediamo alcuni "trucchi" del mestiere:
Sapere ciò che si sta facendo. :-)
L'area che studia il problema di come effettuare calcoli matematici usando
un calcolatore invece di carta e penna (il "calcolo numerico") è
decisamente grande, e sarebbe ridicolo anche solo accennarne qui. Se fate
qualcosa in più di 2.0+2.0, però, è vitale che ne siate un minimo a
conoscenza. Trovate qui qualche considerazione interessante a proposito del
solo floating point in Java.
Non usare l'operatore == per fare comparazioni.
== vale true solo se gli operandi sono esattamente uguali. Siccome una
delle cose che il calcolo numerico insegna è che, date due computazioni che
producono risultati matematicamente identici, non è detto che le loro
implementazioni producano valori identici (a causa appunto di errori
intrinseci di rappresentazione/approssimazione, l'ordine delle operazioni
può per esempio influire sul risultato finale), e' sempre buona cosa fare
comparazioni "a meno di un epsilon", dove epsilon è un numero piccolo ma
sufficiente per tener conto delle approssimazioni di calcolo.
Ad esempio, dati due double a e b, invece di scrivere if (a == b) { ... }
scrivete if (Math.abs(a-b) < epsilon) { ... }.
Ovviamente perchè ciò serva a qualcosa, è necessario che siate sicuri che
gli errori di approssimazione siano sempre più piccoli di epsilon, per cu
vi serve il punto sopra. ;-)
Usate double invece di float e BigDecimal invece di double per fare i
conti. Fate cast a float o conversioni a double per visualizzare i
risultati.
Dati problemi "buoni" o "stabili" (in cui le caratteristiche di
approssimazione dovute all'algoritmo sono più o meno uniformi su tutto il
dominio del problema, ciò, per dire, non avete errori visibilmente più
grandi solo per certi particolari valori di input), questa è una buona
regola empirica.
In particolare, BigDecimal è utile se proprio non ci state capendo niente.
:-)
Se effettuate operazioni con n+1 decimali significativi, non prendetene più
di n del risultato.
Anche questa è una regola empirica, quindi non valida sempre.
Infine, i riferimenti essenziali - i capitoli sui tipi numerici della Java
Language Specification: 4.2.3 Floating-Point Types, Formats, and Values e
4.2.4 Floating-Point Operations . La discussione lì è tecnica, ma
dettagliata. Del resto, state facendo calcolo numerico (magari senza
saperlo ;-) con rappresentazioni di numeri interi, e un minimo di tecnica
ci vuole.
---------------------------------------------------------------------------
-----
[SS2.1] Socket e comunicazioni
[D2.1.1] Un'applet puo' connettersi a un host (per fare ftp,
spedire/leggere mail, etc) ?
[R2.1.1]
RTFM. Un'applet *non puo'* aprire una socket verso un host diverso da
quello da dove e' stata prelevata, a meno di non richiederne esplicitamente
i diritti, accompagnando la richiesta con una firma digitale (e solo in
Java 1.1, con un browser che supporti le signed applets - leggi
Communicator).
Indi, o piazzi la tua applet su [lo stesso server su cui gira il server di
mail -cs] - oppure *non va*.
---------------------------------------------------------------------------
-----
[SS2.2] JDBC
[D2.2.1] Bridge JDBC/ODBC in IE3 e JDK
[R2.2.1]
Subject: Re: Iexplore e Java
From: s65...@athena.polito.it (Mario Ambrogetti)
Date: 1997/12/15
Newsgroups: it.comp.java
Se si usa JDK 1.1.x della SUN per collegarsi ad un database ODBC sotto
WIN32si utilizza di solito il seguente driver:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Questo diver non e' presente con IE 4.0. Infatti la buona vecchia
Micro$$$soft (grazie BILL senza di te la vita sarebbe piu' facile :-) ) ne
ha creato uno tutto suo:
Class.forName("com.ms.jdbc.odbc.JdbcOdbcDriver");
Se volete scrivere un programma che automaticamente seleziona il driver
infunzione del fabbricante (MS o SUN) basta fare:
String vendor=System.getProperty("java.vendor");
if (vendor.compareTo("Microsoft Corp.")==0)
Class.forName("com.ms.jdbc.odbc.JdbcOdbcDriver");
else // "Sun Microsystems Inc."
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
[D2.2.2] Accedere ad un database Access da remoto via RMI
[R2.2.2]
Subject: Re: Database Remoto
From: Bruno Bossola (bbos...@hotmail.com)
Date: 2001-08-17 04:06:01 PST
Newsgroups: it.comp.java
Per accedere da remoto a un database access ti consiglio RMI-JDBC, un
driver di tipo 3 che
consente via RMI di accedere a qualunque database JDBC su una macchina
remota. E' reperibile su
http://www.objectweb.org/RmiJdbc/RmiJdbcHomePage.htm
In pratica la tua struttura diventa:
-------------------------------
---------------------------------
| Linux Server | | NT Server
|
| | |
|
| ---------- --- | | --- ----------
|
| | | |J| ----------- | | ----------- |J| | JDBC |
|
| | App. | |D| | RMIJDBC | | | | RMIJDBC | |D| | ODBC | |
| | Server | |B| | client |<--------------->| server | |B| | Bridge |
|
| | | |C| ----------- | | ----------- |C| ----------
|
| ---------- --- | | --- |
|
| | | ------------
|
| | | | ACCESS |
|
| | | | DATABASE |
|
| | | ------------
|
| | |
|
-------------------------------
---------------------------------
Quindi: su linux usi il driver JDBC fornito da RMIJDBC, che dialoga via RMI
con l'omonima parte server la quale, attraverso il bridge JDBC-ODBC,
dialoga con il database access.
Se vuoi installare veramente poco sul server NT al limite puoi fare girare
la parte java usando la VM microsoft ed il suo bridge (aggiungendovi anche
le classi di RMI nel classpath) e copiando solo le classi di RMIJDBC. Io
pero' ti consiglio caldamente un bel JRE, e ti consiglio anche di farlo
girare come servizio.
In alternativa, ci sono dei driver di tipo 3 per Access, ma sono
costosetti: vedi su http://industry.java.sun.com/products/jdbc/drivers
---------------------------------------------------------------------------
-----
[SS2.3] Compatibilita' C++
[D2.3.1] E' possibile riusare codice C++ ?
[R2.3.1]
Subject: RETTIFICA !!Re: REQ: Esiste un compilatore che generi codice
machine-dependent?
Date: Mon, 26 Oct 1998 14:04:58 GMT
Newsgroups: it.comp.java
j2c++ NON e' un convertitore, e' un'altra cosa ::
ecco un paste ...
J2C++ is a code generation tool that allows a Java applet or application to
access C++ objects seamlessly by making them appear as if they were
implemented in Java. J2C++ parses a C++ definition file (e.g. an .hpp file)
and generates a mapping layer consisting of Java source and C++ source
which exploits the native method call interface of the Java Virtual Machine
(JVM). A makefile builder (mkmake) simplifies the tasks required to build
the generated source code. Both a Java compiler (javac) and C++ compiler
are needed to build the mapping layer.
---------------------------------------------------------------------------
-----
[D2.3.2] Mini-confronto tra Java e C++
[R2.3.2]
Vedi il thread [T5.3].
---------------------------------------------------------------------------
-----
[SS2.4] Applet firmate e sicurezza
[D2.4.1] Applet Firmate
Subject: Applet firmate: cerco di fare il punto...
Date: 1999/01/28
Newsgroups: it.comp.java
From: Alessandro Valsecchi
Ciao a tutti.mi sembra di capire che uno dei problemi piu' ricorrenti in
questo gruppo sia quello di come firmare le applet per permettergli di
scrivere eleggere files dal web.
Cerco di fare il punto della situazione:le applet possono essere firmate
fondamentalmente in due modi:
- usando il javakey incluso al jdk
- facendosi generare un certificato da una authority a pagamento
Il secondo metodo dovrebbe essere quello piu' efficace (non ho mai provato)
e consente di eseguire le applet che leggono e scrivono dati anche
noninlocale. Per dettagli maggiori leggete l'articolo postato da
mar...@dalia.cselt.it recuperabile anche tramite dejanews
(www.dejanews.com).
Mentre per quanto riguarda il primo metodo ecco quanto ho scoperto:il tool
genera delle chiavi doppie con cui si possono firmare le applet,solo che i
browser non riconoscono questo tipo di firma.
Per poter eseguire le applet dal browser bisogna scaricare un javaplugin
apposito scaricabile dal sito della sun all'indirizzo
java.sun.com/products/pluginquesto plugin dice al browser di non utilizzare
la sua JVRM ma di usare un JRE incluso nel plugin che riconosce le applet
firmate come detto inprecedenza.
Questo plugin ha pero' qualche difetto:
- io ho dovuto provare una settimana prima di riuscire a scaricarlo(~5Mb)
- bisogna aggiungere qualche riga ai propri html per dire al browser dinon
usare l la sua JVRM (ben spiegato nella documentazione del plugin)
- ultimo (e per me molto grave) non e' ancora disponibile per tutte
lemacchine (esiste sicuramente per win9*, win NT, solaris, MAC, linux, ma
io inuniversita' ho una macchina HP.... quindi mi ciuccio il calzino)
Non dovrei aver detto delle bestialita' in caso contrario postate le
correzioni ed eventuali altre info.
Subject: Re: Applet firmate: cerco di fare il punto...
Date: 1999/01/28
Newsgroups: it.comp.java
From: Marina Berati
Il punto fondamentale da capire, secondo me, e' che si vuole che il proprio
applet firmato sia usato davvero dagli utenti, bisogna PER FORZA avere un
certificato vero, rilasciato da una certification authority, altrimenti
chiunque si potrebbe generare i propri certificati in casa, ma allora che
cosa certificherebbero questi certificati? Nulla!
Se usi il plugin della Sun, e lo installi sul tuo browser, accetti di
default tutti i certificati generati col javakey? Se e' cosi', chi si
installa quel plug-in deve essere molto fiducioso, e fa male, se non e'
cosi' ci vuole comunque una CA di mezzo, e il plug-in serve solo per
riconoscere un certificato di un tipo diverso.
Se si intende semplicemente fare un test "in casa" con un applet che esce
dalla sandbox, non occorre firmarlo, ma basta semplicemente aggiungere (a
browser chiuso) la seguente linea al file prefs.js o preferencies.js che
sia:
user_pref("signed.applets.codebase_principal_support", true)
Attenzione, perche' in questo modo tutti gli applet che vengono seguiti
sono considerati "sicuri", da qualunque posto provengano, e quindi conviene
fare questa configurazione solo per un utente di "test", che non esca su
Internet.
Ciao,
Marina
---------------------------------------------------------------------------
-----
[SS2.5] Servlet
[D2.5.1] Cos'è una servlet (vedi risposte a [D1.19])
---------------------------------------------------------------------------
-----
[D2.5.2] Una servlet è un solo oggetto?
Subject: Piccolo dubbio sulle servlet
Date: 1999/02/05
Newsgroups: it.comp.java
From: sman...@sfera.net (Stefano MANIERO)
Una servlet e' un oggetto Java condiviso da piu' processi di connessione, o
sono piu' istanze della stessa classe?
Se e' vero la prima si possono creare in modo forzato piu' istanze della
mesesima classe?
[R2.5.2]
Subject: Re: Piccolo dubbio sulle servlet
Date: 1999/02/10
Newsgroups: it.comp.java
From: sur...@paola.antares.it
Quando un servlet viene chiamato la 1° volta, viene inizializzato dal
metodo di init, ogni sua chiamata successiva non farà + l'init perchè
l'istanza è unica!!!
Infatti se tu dichiari delle variabili globali nel servlet, esse ( i
valori) saranno condivisi da tutti gli utenti che correntemente stanno
utilizzando il servlet!!!
Io ho dovuto lavorare su questo e per avere dei valori diversi
(personalizzati da utente ad utente) ho dovuto creare le variabili
localmente ai metodi. Pensa infatti ad unservlet che si occupa di
controllare l'inserimento corretto di username e password in un sistema
remoto!!!
---------------------------------------------------------------------------
-----
[SS2.6] RMI
[D2.6.1] Si può usare RMI con Internet Explorer 4/5?
[R2.6.1]
Nell'installazione standard, IE4/5 non supporta RMI: le relative classi
mancano proprio, quindi se la vostra applet fa uso di Naming, Remote,
RemoteException, eccetera, tutto quello che otterete tipicamente è una
ClassNotFoundException. Naturalmente il problema non si pone con
AppletViewer, nè con browser interamente compatibili con Java.
Tuttavia, MS ha rilasciato una patch per IE, non supportata ufficialmente,
che semplicemente aggiunge queste classi, supportando RMI1.0 (quindi niente
RMI-IIOP). La patch si trova a partire da
http://www.microsoft.com/Java/resource/misc.htm, più precisamente a
ftp://ftp.microsoft.com/developr/MSDN/UnSup-ed/.
La patch non è supportata, e non ci sono spiegazioni riguardo
all'installazione. Tuttavia, dato che per funzionare le classi RMI in
generale devono essere considerate sicure (e quindi non funziona metterle
semplicemente a disposizione sul server web), è sufficiente decomprimerle
nella directory Java/TrustLib di Windows™ perchè il tutto funzioni
egregiamente. Sono svariati megabyte, quindi la cosa non è probabilmente
proponibile per Internet - ma può venire utile per una intranet.
Un'alternativa è, al solito, il Java Plugin - vedi [D1.7], che offre
compatibilità con Java 1.1, 1.2, 1.3 eccetera.
---------------------------------------------------------------------------
-----
---------------------------------------------------------------------------
-----
[SEZ3] Libri
---------------------------------------------------------------------------
-----
[D3.1] Per Iniziare
Subject: Per Iniziare
Date: 1997/11/25
Newsgroups: it.comp.java
Salve a tutti.
Ho intenzione di imparare a programmare anche in Java, sperando che non sia
difficile, non avendo conoscenze di Oggetti.
Quale libro É il piu' indicato per chi non vuole cominciare proprio da
zero? (diciamo un libro avanzato)
[R3.1]
Ci sono ottimi tutorial/libri gratuiti in rete da scaricare e stampare. Fra
tutti, il 'Java tutorial' a java.sun.com
http://java.sun.com/docs/books/tutorial/intro.html#DOWNLOADING
e 'Thinking in Java' di Bruce Eckel, a www.eckelobjects.com
http://www.EckelObjects.com/javabook.html
ftp://www.mindview.net/pub/eckel/tij11ae.zip
Inoltre un buon repository di tutorial on line si trova a
http://www.icom.com/java/dir_lear/learning.htm
---------------------------------------------------------------------------
-----
Subject: Re: Per Iniziare
From: Alexis Paul Bertolini <bert...@promo.it>
Date: 1997/11/25
Newsgroups: it.comp.java
Io ho iniziato con "Il manuale Java", P.Naughton, McGraw-Hill" e poi con
"Java per Esempi" della Mondadori.
Il primo parte da 0.1, nel senso che presume che tu conosca il C e un po'
di C++, il secondo si concentra molto sull'AWT e non cosi' tanto sulla
tecnica.
Comunque il posto migliore dove iniziare e' dal tutorial sul sunsite piu'
vicino (per me e' sunsite.dsi.unimi.it, all'universita' di Milano).
---------------------------------------------------------------------------
-----
Subject: Re: Per Iniziare
From: mi...@skm.to (Michele Beltrame)
Date: 1997/11/25
Newsgroups: it.comp.java
Ci sono due libri, in inglese, da prendere entrambi:
David Flanagan: Java in a Nutshell (2nd edition) - O'Reilly David Flanagan:
Java Examples in a Nutshell - O'Reilly
Il primo e` una breve introduzione al linguaggio (per chi conosce gia` il C
o il C++) ed un completissimo manuale di riferimento (con esempi) a tutte
le classi. Il secondo contiene esempi a nastro.
In classico stile O'Reilly (http://www.ora.com) i libri costano poco: US$
19.95 ciascuno, che diventano US$ 15.95 su Amazon (http://www.amazon.com) e
su Book Stacks (http://www.books.com).
Subject: Re: Che libro comprare ???
From: "Alessandro Valenti" <a.va...@dial.pipex.com>
Date: 1997/12/13
Newsgroups: it.comp.java
Esistono diversi libri se hai una conoscenza media di Java e conosci bene
c++ ti consiglio solo un libro di riferimento come "Java in a Nutshell"
buon riferimento dell'API. Oppure un libro completo (e da molti considerato
il migliore) "Java 1.1 Unleashed" (contiene anche una copia di J++ e 2
libri "completi" nel CD, molto utili per programmatori avanzati-)
---------------------------------------------------------------------------
-----
---------------------------------------------------------------------------
-----
[SEZ4] Tools di sviluppo
[D4.1.1] Java Workshop
Subject: Java Workshop
From: Bukowsky
Date: 1997/09/09
Newsgroups: it.comp.java
Vorrei cominciare a programmare qualcosina in Java per inserirlo nelle mie
pagine web e per divertimento, mi hanno consigliato questo programma...vale
la pena acquistarlo? Come lo trovate?
[R4.1.1]
Subject: Re: Java Workshop
From: Cristiano Sadun <cr...@NOSPAM.sun6.itim.mi.cnr.it>
Date: 1997/09/10
Newsgroups: it.comp.java
JWS e' un bell'ambiente, innovativo e con un buon debugger. Purtroppo, e'
*estremamente* pesante, di conseguenza te lo sconsiglio se non hai almeno
64Mb di ram e una buona macchina (una sparc 10 o un pentium pro sono il
minimo, a mio parere).
---------------------------------------------------------------------------
-----
[D4.2.1] Strumenti di reportistica
Esistono strumenti di reportistica (stile Crystal Report o simili) per
java?
[R4.2.1]
Vedi la survey di Bruno Bossola [T5.4] di Novembre 1999.
---------------------------------------------------------------------------
-----
[D4.3.1] Editors e wrappers su JDK
Che editor sono comodi da usare per scrivere codice Java?
[R4.3.1]
La domanda è ricorrente. Un editor e' semplicemente uno strumento per
creare/modificare files di testo. Un "wrapper su JDK" è un vero e proprio
ambiente di sviluppo che si appoggia su JDK (che deve essere quindi
installato separatmente). I wrapper hanno in genere più funzionalità, ma
sono più ingombranti.
Cerco di fare un riassunto:
Ultraedit
(http://www.ultraedit.com) Editor. Shareware con licenza di valutazione.
Evidenzia la sintassi. Permette di lanciare la compilazione e l'esecuzione
senza passare da finestra DOS. Gestisce molti files. Salva/riconosce
formato Unix e MS-DOS. Ricerca in files su disco.
Kawa
(http://www.tek-tools.com/kawa/) Wrapper. Shareware con licenza di
valutazione.
Bluette
(http://www.bluette.com/) Wrapper. Shareware con licenza di valutazione.
NetBeans
(http://www.netbeans.com/) Wrapper. Cross-platform. Free.
Emacs
Editor. Molto flessibile, esiste in versioni per ogni piattaforma.
---------------------------------------------------------------------------
-----
---------------------------------------------------------------------------
-----
[SEZ5] Varie
[T5.1] Portabilita' vera e presunta - I
Subject: Re: Write Once and Run Away?? (Portabilita'??) (LUNGO!)
From: Cristiano Sadun <cr...@NOSPAM.sun6.itim.mi.cnr.it>
Date: 1997/09/24
Newsgroups: it.comp.java
Insaccanebbia Fabio wrote:
> Ciao a tutti
>
>Altra piccola questione...
> In questo momento sto lavorando ad un progetto di un
> architettura client - server su Web tramite applet Java
> e mi farebbe molto piacere che le mie Applet funzionino
> nel modo piu' "coerente" possibile su ogni macchina...
> [...]
> e dopo questi test mi chiedo se il famoso slogan
> "Write Once, Run Anywhere" non sia da rivedere...
> Le differenze (non grafiche.. quelle le capisco e le
> sopporto fino all'uscta di una version stabile delle
> JFC) di comportamento del programma mi stupiscono ogni
> volta...
>
> Eventi che vengono intercettati da una VM si e non dall'altra,
> programmi che partono una volta ogni quattro, comportamenti
> pseudo-casuali da parte delle scroll-bar... insomma, forse
> pretendo troppo, ma le VM non dovevano essere scritte tutte
> seguendo le specifiche della Sun per essere considerate
> piattaforme valide??
L'anno scorso fui responsabile del team che realizzo' alcune applicazioni
Java presentate poi a SMAU96, per una societa' di software.
Siccome la portabilita' era ed e' effettivamente la caratteristica piu'
notevole di Java, volevamo dimostrarla facendo girare le applicazioni su
diverse piattaforme contemporaneamente (lo so, lo so, e' marketing.. ma che
ci si puo' fare? ;-) ); nella realizzazione, incontrammo alcuni problemi
simili ai tuoi.
Posso fare solo qualche considerazione:
1. Java, *mediamente* richiede che si pensi in modo "pulito". Cosa strana
per un oggetto di moda, e' dotato di una notevole qualita', ma richiede che
chi ne fa uso sia altrettanto.. notevole, soprattutto in termini di
progettazione. Quindi sfruttane a fondo le caratteristiche (distribuzione
del codice su molte classi, GUI integrata, etc), ma evita come la peste
"trucchi" e porcherie varie nel codice spicciolo - di norma vengono
rifiutate da altre JVM. Usa, applica e fai applicare i modelli teorici e
tecnici corretti - mai come in Java gli "accrocchi" si traducono
velocemente in disastri.
2. In media, Java e' *estrememamente* piu' portabile di qualunque cosa
abbia mai visto (e, non so perche', nel mio lavoro mi sono capitati una
quantita' di porting.. :) ). Cio' non toglie che considerare una buona
mezza giornata per l'adattamento di ogni classe ad un comune denominatore
di funzionamento non sia una stima irragionevole ;^). Rispetto alle
giornate-uomo necessarie in altri contesti, e' comunque un tempo
trascurabile.
3. Attenzione che Sun supporta solo le versioni Win32, Solaris e, se non
erro, MacOS - quindi le altre possono essere meno aggiornate o errate.
4. Porta pazienza. L'ambiente e' nuovo, recentemente arricchito di una
serie di funzionalita' che gli forniscono una potenza decisamente vasta e
quindi necessita ancora di un po' di tuning. Del resto, i buoni affari si
fanno con le novita', no? In effetti, gli unici problemi "veri" (non dovuti
a impostazioni approssimate o ad analisi malfatte) che riscontrammo l'anno
passato (con JDK1.0.2 e versioni di JVM nei vari browser non updated o
semplicemente bacate) erano alla fin fine le & nei menu (che sotto solaris
venivano visualizzate.. come &) e la differente gestione del multithreading
nella versione WIN32 e Solaris.
Detto questo, il mio parere e' che, con un po' di buon senso, di
competenze, di incavolamenti e fatica costruire applicazioni complesse (non
applet da effetto pagina www) e portabili e' molto piu' facile con Java che
con qualunque altra cosa - e il risultato di solito merita lo sforzo.
---------------------------------------------------------------------------
-----
[T5.2] Prerequisiti per imparare Java
Subject: Imparare Java: devo conoscere C?
From: p.fo...@cdc.it (Paolo Fontana)
Date: 1997/12/03
Newsgroups: it.comp.java
Per usare Java è consigliabile già conoscere C o C++? grazie, Paolo
Subject: Re: Imparare Java: devo conoscere C?
From: mi...@skm.to (Michele Beltrame)
Date: 1997/12/03
Newsgroups: it.comp.java
Non e` indispensabile. Ovviamente aiuta. ;-)
Subject: Re: Imparare Java: devo conoscere C?
From: Cristiano Sadun <cr...@NOSPAM.sun6.itim.mi.cnr.it
>
Date: 1997/12/04
Newsgroups: it.comp.java
Non particolarmente. Anzi, imho, se sei abituato al C e' peggio; viceversa,
se conosci bene C++, fai *molto* in fretta.
---------------------------------------------------------------------------
-----
[T5.3] Java e C++
Subject: Java e C++
From: Andrea Baruzzo
Date: 1999/04/08
Newsgroups: it.comp.lang.c++
Salve a tutto il NG.
Vorrei proporre una discussione che confronti java e C++.
C'è qualcuno di voi che, oltre ad avere esperienza in C++, ha sviluppato
anche in java e può comunicarmi le sue impressioni usando i due linguaggi.
Mi interesserebbe sapere dove a vostro giudizio sono i pregi e idifetti
delle due soluzioni. Spero di non essere OT (almeno il 50% deldiscorso è
inerente al NG: si parla comunque di C++, anche se come metro diconfronto
viene proposto poi un altro linguaggio).
Spero di non infastidirenessuno.Grazie a quanti vorranno rispondermi. Se
l'argomento non lo riterrete diutilità per discuterne sul NG potete
mandarmi le vostre impressioni in formaprivata via mail.
Ciao a tutti
Andrea
Subject: Re: Java e C++
From: Marco Sarti
Date: 1999/04/09
Newsgroups: it.comp.lang.c++
A mio parere java ha i seguenti vantaggi:
- la portabilità del codice compilato (ovviamente)
- maggiori soluzioni object oriented rispetto al C++. Appare unlinguaggio
più "moderno" da questo punto di vista
- Notevole supporto per applicazioni orientate alle reti
Gli svantaggi invece sono:
- Mancanza dei puntatori. Qualcuno gioisce per questo, ma i puntatori (e
l'aritmetica dei puntatori) restano una grande potenza del C/C++- Quando
c'è bisogno di applicare soluzioni native bisogna tornare dapapà C/C++ :-)
[a questo proposito cfr. R1.17, -cris]
Java non ti offre nel linguaggio la possibilità di creare codice non
portabile, mentre nel C++ questa può essere una scelta.
Questo è quello che mi viene in mente...
Subject: Re: Java e C++
From: Cristiano Sadun
Date: 1999/04/09
Newsgroups: it.comp.lang.c++
Be', ho sviluppato parecchio in entrambi i linguaggi, e dato che di
mestiere faccio il designer di sw sono quelli che uso comunemente a meno di
vincoli esterni. Sulle differenze tra Java a C++ un paio d'anni fa ci
scrissi sopra una articolo da 15 pagine, e Java aveva un terzo della
potenza che ha adesso :), quindi in breve si puo' dire molto poco. :)
Comunque, Java nasce come una semplificazione di C++ *e* un potenziamento
dello stesso: i vantaggi in brevissimo, a livello di linguaggio, capacita'
espressive, ambienti e librerie (wow :)
- maggiore portabilita'. E' possibilissimo scrivere codice portabile in
C++, almeno finche' non c'e' di mezzo una GUI, ma e' *molto piu'
difficile*.
- supporto nativo al multithreading. C++ si deve appoggiare al s/o.
- supporto nativo al networking. Per C++, come sopra.
- migliore supporto al design OO, con la definizione specifica di
interfacce e classi di implementazioni. C++ ha solo classi astratte come
elementi di modellazione.
- garbage collection. In C++ i memory leaks sono all'ordine del giorno, in
java quasi non esistono.
- non c'e' l'ereditarieta' multipla. Qui si va a gusti, ma la mia
esperienza e' che l'e.m. complica le cose piu' di quanto non le aiuti. Non
entro in dettagli altrimenti faccio un trattato :^)
- gestione esplicita dei package. C++ ha i namespace - ma chiunque abbia
provato a lavorare con librerie diverse e vincoli di contratto sa quanto
possono valere.. :)
- loading dinamico delle classi - il programma non e' quasi-monolitico come
in C++.
- una libreria standard da paura, gratis.
- una curva di apprendimento un pochino meno ripida. Per usarlo
efficacemente ovviamente, tanto quanto C++, bisogna conoscere l'OO -
altrimenti si resta praticoni a vita. ;-)
- supporto obbligatorio alle eccezioni. In C++ sono opzionali (e pochi
programmatori le usano, dato che sono state aggiunte da relativamente
poco), e i risultati sulla qualita' del codice si vedono.
- tempi piu' veloci per lo sviluppo e una generale miglior qualita' del
codice prodotto anche da programmatori non.. sopraffini (nella mia
esperienza, una ratio 3/5gg a favore di java per sw di complessita' media).
C++, d'altro canto:
- e' strutturalmente piu' performante. Alcune caratteristiche di java (gc,
architettura a VM, etc) lo rendono piu' lento.
- e' stato recentemente standardizzato
- non ha un un'unica radice per le gerarchie di oggetti. Io personalmente
non lo vedo come vantaggio, ma c'e' chi lo fa.
- non favorisce il downcast dinamico, che in Java e' una prassi
- ha i template, che a volte sono decisamente comodi
- ha STL, che e' potente e versatile - e soprtattuto ha un sacco di
algoritmi ben fatti gia' pronti
- consente di accedere direttamente al s/o - che a volte e' indispensabile
- non e' facile da reverse-engineering-izzare (lo so e' orrido :) mentre
java e' tutto sommato facilmente decompilabile.
- di java si sono avute almeno 15 versioni in tre anni. Il linguaggio,
anche se imho maturo, e' ancora giovane.
Varie ed eventuali:
- java obbliga (piu' o meno) ad una strutturazione dei moduli "una
classe-un file" (o poche classi *molto* correlate), C++ mantenendo la
struttura header/codice a volte e' un incubo da ricompilare.
- c++ "vive" (anche se in forme e quasi-standard diversi) commercialmente
dai primi anni 80, java da meta' 90. Questo significa che e' piu'
"accettato" anche in ambiti conservatori.. ottenere un contratto nominando
C++, in molti ambiti, e' ancora piu' facile che non nominando java.
Ovviamente ci sarebbe un libro di cose da scrivere.. comunque e' un inizio.
[A tutto questo è seguita un'interessante (imho) discussione sul design
object oriented e sulle features di Java e C++, che e' troppo lunga da
riportare qui. Se volete leggere l'intero thread, usate www.dejanews.com
cercando negli articoli di Aprile 1999 di it.comp.lang.c++ (vari subject),
-cris]
---------------------------------------------------------------------------
-----
[T5.4] Soluzioni di reportistica per Java
Subject: Soluzioni di reportistica per Java (WAS: 'Java e DB2')
From: Bruno Bossola
Date: 1999/11/08
Newsgroups: it.comp.java
Ciao a tutti,
in un altro thread e' uscito fuori il problema "reportistica per java":
siccome a mio parere e' un tema che va messo in evidenza, ecco l'analisi
(vecchia ormai di un mese) svolta dal mio gruppo sui prodotti di report
(non sono in nessun ordine!) disponibili attualmente e che siamo riusciti a
trovare e valutare velocemente.
Nome: JReport Professional
Builder visuale: Si
Costo: 995$
Licensing: 100 Desktop
URL: http://www.jinfonet.com/designer.htm
Commento: molto buono, licenza troppo cara, specialmente server-side
Nome: Enterprise Report Writer
Builder visuale: Si
Costo: 395$
Licensing: 100 Desktop
URL: http://www.enterprisesoft.com/Products/ReportWriter.html
Commento: molto buono, licenza troppo cara, specialmente server-side
Nome: InetSoft Style Report
Builder visuale: No
Costo: 495$
Licensing: Runtime free
URL: http://www.inetsoftcorp.com/report/index.html
Commento: ottimo, licenza poco costosa, potente API, manca pero' di GUI
(presente solo per preparazione report colonnari). Da usare solo con
programmatori
Nome: JJPRint
Builder visuale: No
Costo: ?
Licensing: ?
URL: http://www.finansys.com/jjprint_en.html
Commento: boh, sembra uno scherzo; libreria di API ultra-semplificata
Nome: Parallel Crystal
Builder visuale: Si (usa Crystal Report)
Costo: ?
Licensing: ?
URL: http://www.mobileapps.com/products.htm
Commento: Non 100% Java, funziona inoltre solo con Server NT
Nome: BeanSteet Paper
Builder visuale: No
Costo: ?
Licensing: ?
URL: http://www.beanstreet.com/paper/paper.html
Commento: buono solo per semplici report colonnari
Nome: Crystal-Clear
Builder visuale: Si (usa crystal report)
Costo: ?
Licensing: ?
URL: http://www.inetsoftware.de/English/produkte/crystalclear/
Commento: sembra ottimo, utilizza i report di CRY 6 e 7, disponibile solo
in beta, prevista uscita Q1-2000
Nome: PrintLet
Builder visuale: Si (almeno sembra)
Costo: 300%
Licensing: ?
URL: http://www.palmsoftware.com/
Commento: nessun commento su questo... sarebbe da rivedere
Nome: Jclass
Builder visuale: No (usa template XML)
Costo: 300%
Licensing: ?
URL: whups! manca!
Commento: orientato ai programmatori, sembra buono
Comunque, FYI, noi usiamo Crystal-clear. Molto comodo, permette la
generazione dei report con Crystal Report 6 (strumento collaudato, diciamo
:-)) e funziona a 2/3 livelli con app.server dedicato e modulino da
scaricare sul client. Anche ERW e JReport secondo me sono ottimi, peccato
per i costi :-(
Se avete dei programmatori (e tempo) a disposizione vi consiglio comunque
InetSoft Style Report, sembra veramente ok!
Poi c'e' sempre la vecchia soluzione "artigianale" HTML, da considerare con
attenzione in molti casi.
Postate sul NG altri pareri/soluzioni, e anche commenti aggiuntivi rispetto
ai nostri (molto unilaterali), please!
Ciao,
Bruno.
---------------------------------------------------------------------------
-----
---------------------------------------------------------------------------
-----
NOTA IMPORTANTE Questa versione e' ancora largamente incompleta - ne
faccio il post per avere un po' di feedback e trovare contributi e
...contribuenti!
NOTA: Dopo circa tre anni, questa versione - anche se comunque incompleta
- assume la numerazione 1.0. Gioia, gaudio e champagne - se volete
spedirmelo, chiedetemi l'indirizzo. ;-)
--
Life's something u don't get out alive..
ObjectZone - http://space.tin.it/computer/csadun