Archive for the ‘Java’ Category

Suggerimenti, consigli, tips&tricks nati dall’esperienza dello sviluppo in Java

02
giu

Questa settimana mi è stato richiesto di progettare un modulo CRM, in particolare legato al solo aspetto di Customer Support, che attraverso un sistema di ticketing permettesse di tener traccia di tutte le attività correlate alle comunicazioni con i clienti. Allo stesso tempo il modulo deve essere in grado di registrare anche richieste provenienti da contatti di qualunque genere che in futuro potrebbero trasformarsi in clienti.

Qui non voglio discutere della progettazione, che mi pare troppo specifica al caso trattato. Parlerò invece delle scelte che andrò ad effettuare circa i singoli componenti legati all’interfaccia utente. Ritengo infatti che per rendere questa soluzione efficace sia necessario fornire il miglior supporto possibile a chi lo sta utilizzando che potrebbe trovarsi di fronte al cliente al quale deve dare risposte immediate e precise.

Giusto per mettere qualche paletto, il sistema sarà basato su uno schema MVC nel quale Model e Controller saranno realizzati in JAVA (J2EE) mentre la View sarà prodotta in HTML usando pagine JSP (utilizzerò componenti EJB ed il framework Struts).

Tornando all’interfaccia utente l’idea è quella di integrare componenti AJAX per svolgere tutte le principali funzionalità. Ciò che il cliente mi ha richiesto, in particolare, è la possibilità di realizzare quanto segue:

  • Creazione ticket
  • Assegnazione del ticket
  • Rilevazione della qualità del lavoro svolto
  • Possibilità di allegare documenti e file al ticket
  • Registrazione delle attività e dei tempi sul ticket
  • Possibilità di trasformare in automatico i file in formato PDF standard (PDF/A-1)
  • Invio segnalazione via email al destinatario del ticket
  • Invio di questionario soddisfazione via email al cliente quando il ticket viene risolto (chius0)
  • Apertura di documenti e procedure direttamente dal ticket (questo aspetto è legato al software ERP Bizbrain Core installato in azienda)
  • Riepilogo ticket con pannelli che permettono di controllare tutta la vita dello stesso e cosa ne è scaturito

Nel prossimo appuntamento farò un elenco dei componenti che ritengo necessario integrare e del perché sono stati scelti. Parlerò anche della loro integrazione nel progetto. Sono però aperto anche a suggerimenti da parte vostra…

,

30
apr

Quando si programma in JAVA (ma lo stesso vale anche per altri linguaggi) può capitare di dover invocare in maniera dinamica un determinato metodo di una determinata classe. Tanto per fare un esempio banale, supponiamo di voler costruire una applicazione calcolatrice dove sono presenti due campi per inserire le cifre ed una combo con le 4 operazioni matematiche (somma, sottrazione, divisione, moltiplicazione). Quello che si vuole è che ad ogni elemento della combo sia associata una funzione che faccia, appunto, l’operazione di somma, sottrazione, divisione o moltiplicazione.

Il problema potrebbe essere risolto banalmente – ma oserei dire anche nella maniera più “brutta” – con un costrutto switch-case (if (somma) -> fai la somma else if (differenza) -> fai la differenza, …) oppure utilizzando una invocazione dinamica delle funzioni somma, sottrazione, divisione o moltiplicazione. Per i nostri scopi supponiamo di avere la classe OperazioniMatematiche nella quale sono state create le suddette funzioni come metodi pubblici.

More »

,

17
apr

SUN ha scoperto una nuova vulnerabilità nella virtual machine JAVA ma a differenza dei tempi in cui l’azienda vagava solitaria l’ha risolta in tempi assolutamente da record, meno di una settimana. Evidentemente da Oracle avranno dato disposizioni per un cambiamento di rotta che potrebbe essere stato causa anche della rottura con la vecchia guardia. Oppure l’aver accelerato sui tempi potrebbe essere dipeso solo dal fatto che qualche hacker pare abbia già trovato il modo di sfruttare la falla a proprio vantaggio.

Il bug, presente nelle versioni Windows e Linux della JVM, riguarda la tecnica di filtraggio degli indirizzi URL nei quali potrebbe essere passato un parametro che permette di avviare un’applet JAVA locale per eseguire del codice arbitrario. La Version 6 Update 20 è disponibile sul sito web java.com per il download.

,

20
mag

Se in JAVA dovete arrotondare un numero con la virgola all’intero più vicino o comunque ad un numero decimale ma con le cifre (la precisione) da noi decisa, potete utilizzare questa funzione:

/**
* Arrotonda eventualmente un double all'intero più vicino<BR>
* Esempi:<BR>
* rounder(3.99, 1e-2) -> 4.0
* rounder(3.99, 1e-3) -> 3.99
* @param value valore da arrotondare
* @param precision precisione; ad esempio, 1e-7 indica che vogliamo 7 cifre decimali max dopo la virgola
* @return il valore eventualmente arrotondato
*/
public static double roundToInteger(double value, double precision) {
if (value>=0)
return 1.0-(value-Math.floor(value)) < precision ? Math.ceil(value) : value;
else
return 1.0-(Math.ceil(value)-value) < precision ? Math.floor(value) : value;
}

, , ,

13
mag

Torniamo sulla questione delle date in JAVA e vediamo come estrarre il giorno da una data:

public String getGiorno(Date d) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
String giorno = sdf.format(d);
return giorno;
}
catch (Exception e) {
e.printStackTrace();
return "";
}
}

,

11
mag

Quando si lavora con Struts può essere necessario inviare a video un messaggio per l’utente che indica il tipo di errore che magari egli ha commesso nell’inserimento di un dato oppure come risposta ad un errore del sistema stesso. In questo caso si può utilizzare ActionErrors. Nella action Java dove elaborate le informazioni dovrete creare queste quattro linee di codice:

ActionErrors errors = new ActionErrors();
ActionError error = new ActionError("error.nomeNonPresente");
errors.add(ActionErrors.GLOBAL_ERROR, error);
saveErrors(request, errors);

dove error.nomeNonPresente è stato definito nell’ApplicationResources.properties.

Nella pagina dove volete visualizzare l’errore dovrete invece inserire quanto segue:

<html:messages id="error">
<c:out value="${error}"/>
</html:messages>

Non dimenticate di includere nella pagina stessa la chiamata alle giuste taglib (nel nostro caso abbiamo usato quelle di Struts):

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>

, , , , ,

09
mag

Oggi pubblichiamo un piccolo articolo al di fuori dei consueti schemi. Ci preme parlare di Open Source in quanto, anche a causa della crisi economica nella quale versa tutto il mondo, notiamo che sempre più aziende scelgono tale strada per la gestione della propria attività.

Nella nostra esperienza quotidiana, infatti, incontriamo non solo aziende di piccole e medie dimensioni, ma anche realtà più grandi e complesse che stanno migrando verso prodotti aperti: di questi si apprezza non solo il basso costo della licenza ma anche l’ormai maturità dei prodotti. Oggi la situazione è molto evoluta rispetto a qualche anno fa e non è difficile trovare sistemi operativi, DBMS, software di controllo di gestione, fatturazione, CMS, CMR e così via stabili, performanti, aderenti alle specifiche necessità e sviluppati con licenza Open Source.

A tal proposito RedHat ha organizzato un interessante convegno, un Open Source Day, che cerca di diffondere il più possibile il software libero:

Il convegno, con area espositiva, si prefigge di rispondere ad alcuni quesiti del mercato e di fornire una panoramica sulle novità tecnologiche e sui vantaggi economici e strategici apportati dall’utilizzo di soluzioni Open Source.

Appuntamento a Roma, il 9 Giugno 09. Maggiori informazioni sono disponibili sul sito http://www.redhat.it/promo/opensourceday/.

, ,

06
mag

Quando abbiamo la necessità di formattare un numero per mostrarlo a video non sempre è così immediato farlo. Ecco una funzione JAVA adatta allo scopo:

/**
* Formatta un double in formato stringa con un numero di cifre decimali dato da precision
* @param d valore da formattare
* @param precision la precisione desiderata
* @return una stringa
*/
public static String numberFormat(double d,  int precision) {
NumberFormat nf = NumberFormat.getNumberInstance(Locale.ITALY);
nf.setMinimumFractionDigits(precision);
nf.setMaximumFractionDigits(precision);
return nf.format(d);
}

, ,

30
apr

Quello delle date i JAVA è un problema abbastanza intricato da venirne facilmente fuori. Ecco dunque, per la serie ‘funzioni che possono sempre servire’, un modo per calcolare il numero di ore fra due date e tornarle con una stringa formattata:

/**
* Calcula il numero di ore fra due date.
*
* @param d1    La prima data.
* @param d2    La seconda data.
*
* @return  Numero di ore fra le due date in una stringa formattata hh:mm:ss.
*/
public static String getOreFraDate (java.util.Date d1, java.util.Date d2) {
// scambia le date se ce ne fosse la necessitÃ
if (d1.after(d2)) {
Date swap = d1;
d1 = d2;
d2 = swap;
}
double tempoTotale = d2.getTime() - d1.getTime();
int h = (int)(tempoTotale / (1000 * 60 * 60));
tempoTotale = tempoTotale - (h * 1000 * 60 * 60);
int m = (int)(tempoTotale / (1000 * 60));
tempoTotale = tempoTotale - (m * 1000 * 60);
int s = (int)(tempoTotale / (1000));
return h + ":" + m + ":" + s;
}

,

29
apr

Torniamo ancora sull’argomento Validator di Struts. Purtroppo quello dei numeri e delle date è un campo nel quale la validazione trova molti ostacoli a causa delle diverse convenzioni internazionali. Per poter validare un numero come un buon italiano lo scriverebbe occorre dunque ricorrere a qualche stratagemma e di certo le Espressioni Regolari possono venirci incontro. Per essere più precisi vogliamo validare un qualunque numero nella forma nnn.nnn.nnn,nn come ad esempio 1.230,54. Possiamo dunque usare una espressione regolare come questa:

^[0-9]*[.,]?[0-9]+$

…ed integrarla nel file validation.xml di Struts in questo modo:

<field depends="mask" indexedListProperty="rows" property="speseViaggio">
<arg0 key="label.speseViaggio"/>
<var><var-name>mask</var-name><var-value>^[0-9]*[.,]?[0-9]+$</var-value></var>
</field>

, , ,