Post

Visualizzazione dei post da 2013

HttpComponents - Invocazione di una Servlet da un Client Java

DOMANDA: Posso invocare una servlet da un client Java? RISPOSTA: E' possibile stabilire una connessione con un endpoint attraverso le famose API del framework  HttpClient . Purtroppo, come si può notare dalla seguente frase riportata nella home page ufficiale della libreria "The Commons HttpClient project is now end of life, and is no longer being developed. It has been replaced by the  Apache HttpComponents  project " HttpClient è stato sostituito da HttpComponents . Per garantire vita lunga al nostro software, in questo post descriveremo un esempio di utilizzo proprio utilizzando la nuova libreria HttpComponents per eseguire una richiesta POST verso una Servlet . Innanzitutto eseguiamo il download dei jar di HttpComponents dal link HttpComponents v4.3 .  Apriamo quindi Eclipse, creiamo un nuovo progetto Java e, prima di scrivere codice, aggiungiamo al build path i jar appena scaricati. Creiamo la classe MyHttpClient : import java.io.IOException

Recuperare programmaticamente i campi di un oggetto

DOMANDA: Come posso recuperare tutti i campi di un oggetto programmaticamente? RISPOSTA: Per recuperare tutti gli attributi/campi di un oggetto è sufficiente usare la Reflection di Java con un po' di ricorsione.  Definiamo una classe User con delle proprietà: package lancill.objectfields.pojo; import java.util.List; public class User extends Person{ private String mail; private String userid; private List<String> contacts; private List<User> friends; public User(){} public User(String name){ super(name); } public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } public String getUserid() { return userid; } public void setUserid(String userid) { this.userid = userid; } public List<String> getContacts() { return contacts; } public void setContacts(List<String> contacts) { this.contacts = contacts; } public List<User> getFriends() { return friends; } p

Come definire e utilizzare a runtime delle custom Annotation

DOMANDA: Come si definiscono delle Annotation custom per utilizzarle nel mio programma? RISPOSTA: Le Annotation introdotte in Java 5 consentono di definire dei metadata per tre diversi livelli di scoping : SOURCE - Annotation disponibile solo nello scope del sorgente e viene ignorato dal compilatore CLASS - Annotation disponibile nello scope dal compilatore in fase di compilazione, ma viene ignorata dalla Java Virtual Machine (JVM) RUNTIME - Annotation disponibile nello scope della JVM in modo che possa essere utilizzato da l'ambiente di runtime Le Annotation NON aggiungono logica all'applicazione e non sono uno strumento per programmare componenti. Sono invece in grado di fornire delle informazioni (metadati) per capire meglio il tipo di codice che stiamo eseguendo ed eventualmente intraprendere delle azioni o eseguire delle configurazioni ). In questo post ci concentreremo sulle Annotation di tipo RUNTIME per riuscire ad eseguire delle azioni durante l'esec

Abilitazione Cross Application Scope in Tomcat per condivisione dati tra webapp

DOMANDA: Come posso condividere dati tra diverse webapp utilizzando l'Application Scope? RISPOSTA: Di default l' Application Scope è utilizzato per memorizzare oggetti a livello di web application. Questo livello di scope è il più alto rispetto ai classici scope di Request e Session Nome Scope Durata Request Singola richiesta, verso il server Fino a quando la risposta non viene inviata al client Session Tutte le richieste inviate dallo stesso browser Fino a quando non scade il timeout della sessione o l'ID di sessione non viene invalidato (ad es. chiusura del browser) Application Tutte le richieste inviate a una stessa Web Application Container Per poter recuperare un oggetto memorizzato a livello di Application Scope è necessario utilizzare il ServletContext . Se vogliamo recuperare un oggetto memorizzato nell'Application Scope della WebAppA dalla WebAppB è necessario fare attenzione ai seguenti

La ricorsione in Java

Immagine
DOMANDA: Che cos'è la ricorsione? RISPOSTA: La ricorsione è forse una delle prime cose che si studiano in programmazione e, diciamoci la verità, non è così intuitiva per chi è alle prime armi. A cosa serve la ricorsione ? A creare dei cicli (o chiamate cicliche) in maniera alternativa al classico for. In questo post cerchiamo di semplificarne il concetto utilizzando Java, ma è praticamente uguale in tutti i linguaggi di programmazione. Guardiamo subito un esempio a scopo puramente didattico: package ricorsione; public class RicorsioneTest { public static void main(String[] args) { int variabile = metodoRicorsivo(); } public static int metodoRicorsivo(){ return metodoRicorsivo(); } } Cosa succede eseguendo questo frammento di codice? Innanzitutto  sconsiglio di eseguirlo dato che sarà un'inconclusiva Exception a Runtime ( java.lang.StackOverflowErrorloop )! In pratica l'unica riga di codice del main richiama un metodo che richiama se stess

Realizzare un servizio REST con JAX-RS 2.0 e Jersey 2.0

DOMANDA: Come realizzo un servizio REST 2.0 e un client per testarlo? RISPOSTA: Per addentrarsi nel mondo REST consiglio di leggere il post REST 2.0: Definizione e configurazione con il framework Jersey . Il post spiega brevemente i concetti REST e cosa occorre per configurare un ambiente che lo utilizzi. La lettura servirà anche per conoscere quali sono i jar da includere nei progetti che stiamo per realizzare. In questo post creeremo un Servizio REST  che risponderà, con un semplice "echo", alle richieste di un Client. Partiamo con la programmazione del Servizio. Creiamo un nuovo Dynamic Web Project in Eclipse denominato RESTfulService e ricordiamoci di selezionare, nell'ultimo step del wizard, di creazione la checkbox " Generate web.xml deployment descriptor ".  Questa opzione ci permetterà di avere a disposizione un web.xml di base creato da Eclipse da modificare secondo le nostre preferenze (ovviamente non è un passo obbligatorio, ma di sicur

REST 2.0: Definizione e configurazione con il framework Jersey

DOMANDA: Cos'è REST e come configurare un ambiente per utilizzarlo? RISPOSTA: REST ( RE presentational S tate T ransfer ) è un paradigma per la definizione di architetture distribuite.  I suoi principi si basano sulla leggerezza e sull'utilizzo dei metodi offerti dal protocollo HTTP : Ogni entità/operazione viene rappresentata come una Risorsa Per l'invocazione si utilizzano i metodi HTTP  (GET,PUT,POST,DELETE) La rappresentazione dei dati è snella (es. JSON ) REST non è un concetto nuovo: un sito web rispetta i principi REST, cosi come un feed RSS. Di recente si sta estendendo il concetto REST alle architetture orientate ai servizi, oggi principalmente basate su HTTP/SOAP. Una funzionalità/servizio che rispetta i principi REST è denominata  RESTful . In Java esiste la specifica JAX-RS (JSR-339) che regola l'utilizzo di REST. L'ultima release di JAX-RS è la 1.1 ma è in fase di approvazione la versione 2.0 che introduce migliorame

ClassCastException con oggetto in ClassLoader diversi

Immagine
DOMANDA: Perchè ricevo un errore di ClassCastException se dalla mia webapp recupero lo stesso oggetto creato da un'altra webapp? RISPOSTA: Di solito questo errore si verifica quando stiamo utilizzando un oggetto in due class loader diversi . Ad esempio ho una webapp A che utilizza un oggetto X del jar X.jar presente nella sua WEB-INF/lib . Decido di recuperare l'oggetto X dalla webapp B che avrà anch'essa nella sua WEB-INF/lib il jar X.jar . In questo caso è vero che l'oggetto X è lo stesso ma viene caricato sia nel class loader di A che in quello di B. Ciò comporta la generazione di un errore di ClassCastException quando si tenta di recuperare l'oggetto X da B. Per ovviare facilmente a questo errore si potrebbe decidere di inserire il jar X.jar in un class loader condiviso tra le due webapp A e B (ad esempio il class loader dell'Application Server). Una soluzione più elegante, che offre una serie di vantaggi e rispetta le tecniche d

Rappresentare le Date in Java con Apache Commons DateFormatUtils

Immagine
DOMANDA: Come posso personalizzare le date in Java? RISPOSTA: Dopo aver visto come utilizzare le date con il SimpleDateFormat , passiamo a vedere una possibile alternativa fornita da un package di Apache Commons  contenente l'oggetto DateFormatUtils . Per utilizzarlo è necessario scaricare commons-lang3-3.1.jar (versione testata in questo post). Dopo aver settato il build path del progetto ed importato il jar appena scaricato, guardiamo nell'esempio come rappresentare le date in maniera semplice e veloce: package date; import java.util.Calendar; import java.util.Date; import org.apache.commons.lang3.time.DateFormatUtils; public class DateFormatUtilsTest { public static void main(String[] args) { // utilizziamo DateFormatUtils con la data odierna String dataOdierna = DateFormatUtils.format((new java.util.Date()), "MM/dd"); System.out.println("dataOdierna = " + dataOdierna); // impostiamo la data a nostro pi

Rappresentare le Date in Java con SimpleDateFormat

Immagine
DOMANDA: Come posso rappresentare le date in Java? RISPOSTA: Java ha una molteplicità di oggetti che gestiscono le date , qualcuno con un funzionamento intuitivo, altri meno. Un tentativo di semplificare la loro gestione è fornito dalla classe SimpleDateFormat ( java.text.SimpleDateFormat ). Vediamo come funziona con il seguente esempio SimpleDateFormatTest : package date; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class SimpleDateFormatTest { public static void main(String[] args) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat(); // creo l'oggetto // primo pattern: 2009, 12, 09 sdf.applyPattern("yyyy, MM, dd"); Date data = sdf.parse("2009, 12, 9"); String dataStringa = sdf.format(data); System.out.println(dataStringa); // modifico il pattern: 2009-12-09 sdf.applyPattern("yyyy-MM-dd");

Ordinamento HashMap basato su proprietà custom

DOMANDA: Come posso ordinare un HashMap basandomi su una proprietà degli oggetti che contiene? RISPOSTA: E' possibile eseguire un ordinamento di un HashMap basato su una proprietà dei suoi oggetti attraverso l'utilizzo di due elementi: Comparator TreeMap Innanzitutto creiamo un bean per rappresentare gli elementi da ordinare in base ad una proprietà. Il bean sarà Tab e la proprietà position . Come avrete intuito, faremo l'ordinamento di una serie di tab come quelli che troviamo in quasi tutte le interfacce grafiche dei moderni siti web. La nostra lista di tab (non ordinata) sarà la seguente: Portfolio Home Contatti Chi siamo Da ordinare nel seguente modo: Home Chi siamo Portfolio Contatti Innanzitutto creiamo il bean Tab : public class Tab { private int position; public Tab(int position) { this.position=position; } public int getPosition() { return position; } public void setPosition(int position) { this.position