MokaFAQ
|
||||
|
|
le FAQ di it.comp.java |
||
|
|
|
||
Questa è sempre la versione più aggiornata. Ci sono dei mirror più o meno aggiornati a:
http://bertola.eu.org/usenet/faq/testi/icj-faq.txt http://www.programmazione.it/linguaggi/java/faqs/index.htm Questa FAQ in italiano su java e' mantenuta da Cristiano Sadun (crsadun@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 crsadun@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. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Indice
FAQ
[D1.1] Come scaricare un'applet e metterla nella propria pagina
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' erikait@mbox.vol.it Grazie Lele
1) Vai alla pagina
che ti serve (nel nostro esempio http://www.cut-the-knot.com/SimpleGames/Horse.html)
<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 2k6) 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?
(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?
sergiolc@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? Vedi [R2.1.1] per sapere verso che hosts si può fare FTP. Per quanto riguarda il come, ci sono vari metodi:
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(); }
"tqt" == togliere
questo testo 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++? Le opinioni sono diverse. Vedi [T5.2] per una discussione approfondita.
[D1.5] Voglio imparare - come fare? 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... Esistono in rete
numerosi depositi (repository) di applet gia' belle e pronte.
[D1.7] Java su IE 4.0 ?
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.
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, lo trovi su http://www.javasoft.com 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 ?
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?
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..!! 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_INSTALL
Per IE4 potete provare l'Activator (cfr. [D1.7]).
[D1.10] Esistono risorse in rete per Java (riviste/tutorial/manuali etc) ?
Contiene un tutorial inglese fatto molto bene e piuttosto aggiornato Un mirror italiano e' http://javasoft-mirror.java.tin.it/ Contiene una quantita' notevole di software esistente, freeware, shareware e dimostrativo Rivista di programmazione Il nome dice tutto Uno dei migliori libri introduttivi all'object orientation in generale e a java in particolare
>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:
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
[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?
Buongiorno,
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 ?
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] Come si fa a rendere "daemon" un processo?
Ho creato un'applicazione
server che gestisce una connessione via socket.
Grazie
Chiamando la
setDaemon(true) fai esattamente l'inverso di quello che vorresti! ;-D
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?
Ho il seguente software per dos: Java(tm) Development
Kit
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)
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? 1.
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.
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.
- "." per default
(il che significa che se le classi sono nella directory corrente non e'
necessario specificare nulla)
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?
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?
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
Cosa mi consigliate?
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?
Per favore potete aiutarmi a capire perchè non riesco a clonare un oggetto? [...] Mentre l'errore
che ricevo è:
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 intutiva. 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?
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.
Ho capito qualche cosa sulle servlet o sono completamente fuori strada??
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
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
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?
Ciao Si, prova il JRun al sito http://www.livesoftware.com/ io lo uso e mi sembra buono.
A mio modo di
vedere il migliore (+ performante) e' JigSaw... del consorzio W3C.
[D1.21] Si può realizzare una CGI in 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.
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? 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 eseguire un programma esterno?
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.
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.
[D1.24] Dov'e' classes.zip nel JDK1.2? (o 2, o 1.3 etc) 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.
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.Pippofarà 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?
Ciao a tutti,
Grazie in anticipo, Nick
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.
[D2.0.1] Visualizzare le proprietà Java predefinite 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.1.1] Un'applet puo' connettersi a un host (per fare ftp, spedire/leggere mail, etc) ? 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).
[D2.2.1] Bridge JDBC/ODBC in IE3 e JDK
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.3.1] E' possibile riusare codice C++ ?
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++ Vedi il thread [T5.3].
[D2.4.1] Applet Firmate
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:
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 marina@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:
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,
[D2.5.1] Cos'è una servlet (vedi risposte a [D1.19])
[D2.5.2] Una servlet è un solo oggetto?
Una servlet e'
un oggetto Java condiviso da piu' processi di connessione, o sono piu'
istanze della stessa classe?
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!!!
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!!!
[D3.1] Per Iniziare
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) 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
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).
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).
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-)
[D4.1.1] Java Workshop
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?
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).
[T5.1] Portabilita' vera e presunta - I
Insaccanebbia
Fabio wrote:
> Ciao a tutti
L'anno scorso
fui responsabile del team che realizzo' alcune applicazioni Java presentate
poi a SMAU96, per una societa' di software.
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
Per usare Java è consigliabile già conoscere C o C++? grazie, Paolo
Non e` indispensabile. Ovviamente aiuta. ;-)
Non particolarmente. Anzi, imho, se sei abituato al C e' peggio; viceversa, se conosci bene C++, fai *molto* in fretta.
Salve a tutto
il NG.
Ciao a tutti Andrea
A mio parere java ha i seguenti vantaggi: - la portabilità
del codice compilato (ovviamente)
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]
Questo è quello che mi viene in mente...
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*.
C++, d'altro canto: - e' strutturalmente
piu' performante. Alcune caratteristiche di java (gc, architettura a VM,
etc) lo rendono piu' lento.
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.
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] |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Consigli utili per il programmatore Java www.mokabyte.it/mokahints |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|