Post

Visualizzazione dei post da settembre, 2012

Il Polimorfismo: descrizione ed esempi

DOMANDA: Che cos'è il polimorfismo in Java? RISPOSTA: Uno degli elementi fondamentali della programmazione ad oggetti (e quindi anche di Java) è proprio il polimorfismo . Con questo termine, scomponendo ad intuito, possiamo dedurne il significato: poli - morfismo -> multi-forme (non formalizziamoci sull'etimologia del termine).  Proprio come suggerito dall'intuito, il polimorfismo altro non è che la capacità di un oggetto di poter assumere diverse forme. Il concetto è spesso ostico ai neofiti della programmazione ad oggetti, ma in realtà, con un esempio pratico si può cominciare a capire la potenza di questo sistema. ESEMPIO Un leone, una mucca e un cavallo avranno tutti e tre la capacità di emettere un proprio verso. Vediamolo nel dettaglio: package polimorfismo; public class Leone { public void emettiVerso(){ System.out.println("RUGGITO"); } } package polimorfismo; public class Mucca { public void emettiVerso(){ System.out.pr

Differenza tra jsp:include e @ include file

DOMANDA: Che differenza c'è tra:  <%@ include file="pagina.jsp" %>  e  <jsp:include page="pagina.jsp">? RISPOSTA: Cerchiamo di spiegare brevemente la differenza e subito dopo ne vedremo gli effetti con dei semplici esempi. DIRETTIVA @INCLUDE <%@ include file="pagina.jsp" %> E' una direttiva che richiama il file indicato tra virgolette (nel nostro esempio pagina.jsp ) facendolo diventare parte della pagina in cui è incluso. Detto in parole semplici è come se facessimo un copia e incolla del contenuto del file pagina.jsp in corrispondenza dell'inclusione. Questo implica che non è necessario includere un file specifico, ma viene accettata qualunque tipologia, anche un semplice .txt . DIRETTIVA JSP:INCLUDE <jsp:include page="pagina.jsp"> In questo caso invece non avviene una semplice sostituzione. Il file indicato come valore dell'attributo page, viene compilato separatamente com

Upload di un file in Java con le Servlet 3.0

DOMANDA: Esiste un modo per effettuare l'upload di un file via JSP/Servlet senza utilizzare librerie di terze parti? RISPOSTA: Una delle problematiche che più spesso si presenta a chi progetta siti web è l' upload di un file da un form a una JSP/Servlet. Sino all'avvento delle Servlet 3.0 e all'introduzione dell'annotazione @MultipartConfig era necessario utilizzare le ottime librerie messe a disposizione da O'reilly (COS) o da Apache (FileUpload) . In realtà anche senza librerie di terze parti e Servlet 3.0 era possibile effettuare un upload, ma sicuramente il codice da utilizzare non era dei più puliti. Ve lo dimostro con un esempio vecchia maniera (senza utilizzo di librerie di terze parti) che, dopo aver letto il file dalla request, lo salva sul disco del server: Il form .JSP per l'upload del file: <html> <head><title>Test File Upload</title></head> <body> <form name

Scrivere un file su un percorso di rete (protocollo ftp)

DOMANDA: Come si crea e scrive un file in remoto? RISPOSTA: La scrittura di un file in remoto (su un percorso di rete o share NAS) si può effettuare facilmente attraverso l'utilizzo del protocollo ftp e (naturalmente) Java!  Il seguente snippet costruisce una connessione verso il nostro percorso di rete ed esegue il salvataggio di un file di testo ( prova.txt ) con contenuto ciao mondo! . package rete; public class ScritturaFileRemota { public static void main (String [] args){ URL urlDiRete = new URL("ftp://"+username+":"+password+"@"+percorso_di_rete+"/prova.txt"); URLConnection connessioneDiRete = urlDiRete.openConnection(); connessioneDiRete.setDoOutput(true); BufferedWriter in =  new BufferedWriter(new OutputStreamWriter(connessioneDiRete.getOutputStream())); in.write("ciao mondo!"); in.close(); } } Se l'accesso al vostro percorso di rete è sogge

Catturare le coordinate del Mouse

DOMANDA: Come posso ottenere le coordinate della posizione del puntatore del mouse in Java? RISPOSTA: Per catturare le coordinate del mouse in Java è necessario utilizzare la classe java.awt.MouseInfo che ci mette a disposizione il metodo getPointerInfo() attraverso il quale possiamo ottenere le informazioni riguardo le coordinate del puntatore. Nell'esempio qui di seguito abbiamo la classe CoordinateMouse che ogni 50 millisecondi aggiorna questi due valori mostrandoli sulla console: package mouseclick; import java.awt.MouseInfo; public class CoordinateMouse { public static void main(String[] args) throws InterruptedException{ while(true){ Thread.sleep(50); System.out.print("(x) "+MouseInfo.getPointerInfo().getLocation().x); System.out.print(" - "); System.out.print("(y) "+MouseInfo.getPointerInfo().getLocation().y); System.out.println(); } } } Eseguendo l'esempi

Modificare una riga di un file

DOMANDA: Come si modifica una riga di un file senza creare un file di appoggio duplicato? RISPOSTA: La soluzione più semplice, ma anche più dispendiosa, è quella di leggere ciclicamente dal file di origine una riga, controllare se è quella da modificare e scriverla in un nuovo file continuando sino all' EOF (end-of-file); al termine si cancella il file di origine e si lascia il nuovo. Ovviamente tutta questa procedura è molto laboriosa, in particolare di fronte a file di dimensioni notevoli. L'esempio che vi proponiamo oggi fa in modo di modificare al volo la riga e di scriverle direttamente sullo stesso file di origine : package file; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; public class ModificaFile { public static void main(String[] args) { FileInputStream fstream = null; Data

Meglio JBoss AS o Tomcat?

DOMANDA: E' meglio Apache Tomcat o JBoss Application Server? RISPOSTA: Come tutte le grandi dispute, l'unica vera risposta esatta è: "Dipende!" . In breve Tomcat fornisce un Servlet Container che supporta tutte le specifiche delle servlet (la versione 7 di Tomcat supporta anche le Servlet 3.0). JBoss AS (Application Server) , oltre al supporto delle Servlet 3.0 supporta tutto JEE 6 .  Ad intuito si può quindi capire come Tomcat sia più abbastanza rispetto a JBoss AS e, qualora necessitassimo di altre potenzialità incluse in JEE , abbiamo la facoltà di aggiungere manualmente le varie componenti. Ad esempio, se volessimo aggiungere Hibernate all'interno del nostro Apache Tomcat , basterà scaricare ed aggiungere le giuste librerie al server. Certo, di sicuro è richiesta una certa padronanza e conoscenza del funzionamento di Tomcat, ma non è affatto complicato. Se, invece, la nostra applicazione ha bisogno di un supporto integrato a diverse tec

JSP Error: IllegalStateException

DOMANDA: Quando provo ad effettuare il forward o il sendRedirect di una JSP ad un'altra risorsa ottengo queste IllegalStateException: con il forward: java.io.IOException: Error: Attempt to clear a buffer that's already been flushed java.lang.IllegalStateException: Error: Attempt to clear a buffer that's already been flushed con il sendRedirect: java.lang.IllegalStateException    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:438) RISPOSTA: Inserendo questa riga di codice all'inizio della JSP si risolve il problema: <%@ page autoFlush =" true " buffer =" 1094kb " %>    Vi starete chiedendo perché.  Bene, cerchiamo di spiegarlo brevemente. Quando si inoltra una request ad un'altra risorsa con un forward o un sendRedirect() si ottiene una IllegalStateException qualora la response (o parte di essa) fosse già stata inviata al client. Quindi, quando otteniamo questo errore è molt

Enumerare le interfacce di rete e loro caratteristiche

DOMANDA: Come posso creare un elenco delle interfacce di rete con le relative caratteristiche? RISPOSTA: Rispondo subito con un esempio chiarificatore nella classe ElencoInterfacceDiRete : package interfaccedirete; import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; public class ElencoInterfacceDiRete {    public static void main(String args[]) throws SocketException {       Enumeration<NetworkInterface> interfaces =              NetworkInterface.getNetworkInterfaces();       while (interfaces.hasMoreElements()) {          NetworkInterface netInterf = interfaces.nextElement();          Enumeration<InetAddress> indirizzi = netInterf.getInetAddresses();           while (indirizzi.hasMoreElements()) {             InetAddress inetAddress = indirizzi.nextElement();             System.out.println( "Nome Interfaccia:" + netInterf.get

Java 7: Gestione delle Suppressed Exceptions nel try-with-resources

DOMANDA: Cosa sono e come si gestiscono le Suppressed Exceptions in un try-with-resources? RISPOSTA: Nei post precedenti abbiamo visto lo statement try-with-resources e come creare oggetti autochiudenti grazie alle novità introdotte con Java 7 . Un particolare comportamento delle eccezioni introdotto con il try-with-resources è quello delle Suppressed Exceptions . Come già intuibile dal nome, sono delle eccezioni soppresse dalla JVM. Guardiamo subito un esempio di una risorsa AutoCloseable che lancia due eccezioni, una generica Exception in chiusura e una IOException nel metodo faiQualcosa (): package trywithresources; import java.io.IOException; public class PrimaRisorsa implements AutoCloseable{    public PrimaRisorsa() {       System.out.println( "COSTRUISCO LA RISORSA" );    }    public void faiQualcosa() throws IOException {       System.out.println( "PrimaRisorsa: Faccio qualcosa" );       throw new IOException( &quo

Java 7: Autocloseable e Closeable Objects

DOMANDA: Cosa sono gli oggetti AutoCloseable e Closeable? RISPOSTA: Java 7 ha introdotto una comoda caratteristica che è il try-with-resources di cui abbiamo parlato abbondantemente in questo post . Gli oggetti AutoCloseable e Closeable sono delle classi che implementano rispettivamente java.lang.AutoCloseable e java.io.Closeable . L'unico metodo che l'interfaccia obbliga ad implementare è il close() , chiamato alla fine del blocco try-with-resources . Oltre a tutti gli oggetti che da Java 7 implementano già questa interfaccia, è possibile rendere le proprie classi " autochiudenti " semplicemente implementandola a nostra volta. Guardiamo l'esempio: package trywithresources; public class PrimaRisorsa implements AutoCloseable{    @Override    public void close() throws Exception {       System.out.println( "CHIUDO PrimaRisorsa" );    } } E ora vediamo come funziona con un Test : package trywithresources; import j

Java 7: Statement try-with-resources

DOMANDA: Che cos'è lo Statement try-with-resources introdotto con il rilascio di Java 7? RISPOSTA: Una delle problematiche più comuni ai programmatori è la sistematica chiusura delle risorse e/o connessioni aperte. Capita spesso, infatti, che per dimenticanza o meglio per errori e/o eccezioni impreviste non gestite al meglio, alcune risorse rimangano in attesa di una chiusura che non arriverà mai. Per prevenire questi memory leaks  da Java 7 è stato introdotto lo statement try-with-resources che si occupa di chiudere automaticamente le risorse aperte. Guardiamo come funziona: public String leggiRigaDaFile(String path) throws IOException {     try (BufferedReader br =                     new BufferedReader( new FileReader(path))) {         return br.readLine();     } } La novità è che c'è un blocco try (in questo caso senza catch e finally ) con uno o più argomenti tra parentesi. Questi parametri rappresentano un oggetto risorsa che Java garant

Immagini cliccabili

DOMANDA: Come posso creare un'immagine cliccabile che mostra un messaggio? RISPOSTA: Una maniera efficiente, soprattutto se le immagini sono piccole, è quella di utilizzare i JButton a cui applicare l'immagine desiderata tramite ImageIcon . Dopo di che si apre tramite JOptionPane un dialog che mostra il messaggio definito. Da notare come l'implementazione dell' ActionListener sia una inner class. Se dovesse diventare più complessa, si può spostare in una classe a parte. Vediamo com'è implementata la logica del programma con la classe ImageDialog : package immagini; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; public class ImageDialog {    private JFrame frame ;    public ImageDialog(JFrame frame) {   this . frame = frame;    }    public JButton generateButton(String filename, int x, in

Arrotondamento e troncamento in Java

DOMANDA: Facendo le divisioni tra numeri float o double mi escono cifre decimali lunghissime. Come si arrotonda o si tronca un numero in Java? RISPOSTA: Un esempio in cui questo problema si presenta in modo massivo è durante lo sviluppo applicazioni che hanno a che fare con le valute . Java mette a disposizione differenti metodi di arrotondamento e troncamento per soddisfare un po' tutte le esigenze. Una possibile soluzione ( parziale ) è l'utilizzo della libreria java.lang.Math , in particolare dei suoi 4 metodi elencati di seguito (ricordiamo che Math contiene solo static ): FLOOR - double floor(double d): questo metodo, come si evince dal nome " floor " ( pavimento ) arrotonda il numero alla cifra intera inferiore (il cosiddetto arrotondamento per difetto o troncamento). ESEMPI : double floor(4.4) -> restituisce 4. double floor(4.6) -> restituisce 4. CEIL - double ceil(double d): questo metodo, al contrario di floor si