mercoledì 28 agosto 2013

Java 7 try with resources

Con Java 7 è stato introdotto il concetto di try with resources.
Essendo comune il problema di chiudere le risorse utilizzate , siano esse connessioni al db piuttosto che BufferedReader etc. etc., Java 7 introduce questa feature proprio per risolvere  queste mancanze.
Vediamo un esempio:

public static void main(String[] args) {
 String url="jdbc:mysql://localhost:3306/";
 String db="addressBook";
 String username="root";
 String password="admin";
 try(Connection connection=DriverManager.getConnection(url+db,username,password)){
     System.out.println("Connessione ok!!!");
 }
 catch(Exception ex){
     ex.printStackTrace();
 }
}

Come possiamo vedere dopo il try, ma prima dell'inizio del blocco try con le parentesi graffe, è creata la connessione.
Automaticamente sarà chiusa alla fine del programma da Java, senza necessità di farlo esplicitamente.
Si possono usare anche con più risorse, scrivendole di seguito alla prima. L'unica regola è che le varie risorse devono essere separate da ; tranne l'ultima.

Esempio:

try (FileWriter fw = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fw)) {
        bw.write(text);
    } catch (IOException ex) {
        // handle ex
    }


Notiamo nell'esempio di recupero connessione che abbiamo utilizzato JDBC 4.0 ; con questa libreria non è più necessario  cercare il driver per la connessione al db tramite l'istruzione Class.forName utilizzata nelle precedenti versioni.
L'importante è che il driver sia nel classpath, se c'è la JVM lo trova da solo e ci risparmia un ulteriore passaggio nel codice , dove bisognava per altro indicare il nome esatto del driver utilizzato (nel caso di Mysql  com.mysql.jdbc.Driver).

martedì 27 agosto 2013

h:panelGrid dare uno stile alle colonne

L' h:panelGrid di JSF si renderizza come una tabella HTML.
Non è possibile utilizzare tuttavia attributi come il colspan, se vogliamo farlo dobbiamo comunque utilizzare una table html.
Ci viene però incontro l'attributo columnClasses che consente di associare ad ogni colonna uno stile css diverso.
All'interno del columnClasses definiamo, separati dal carattere ',' , tanti stili quante sono le colonne del panelgrid.
Esempio:



<h:panelGrid columns="4"  columnClasses="cella1,cella2,cella3,cella4">
<h:outputLabel value="Tipo Persona" style="font-weight:bold" />
.....altre colonnne 
</h:panelGrid>
<style type="text/css">
 .cella1{
 width:15%;
 white-space: nowrap;
   
 }
 .cella2{
 width:35%;
   
 }
.cella3{
 width:15%;
 }
.cella4{
 width:35%;
}
</style> 

giovedì 22 agosto 2013

JSF 2.0 debug online component tree e scoped library

 E' possibile in maniera molto semplice effettuare un debug della struttura della pagina jsf renderizzata e dei componenti presenti nei vari scope (view,request,session).
Per effettuare tale operazione per prima cosa dobbiamo aggiungere nel web.xml il seguente parametro di contesto:


<context-param>
    <param-name>javax.faces.FACELETS_DEVELOPMENT</param-name>
    <param-value>true</param-value>
</context-param>


Quindi nelle pagine di nostro interesse dobbiamo importare la libreria delle facelets (il namespace è xmlns:ui="http://java.sun.com/jsf/facelets" da aggiungere all'interno del nodo html).

E definire il seguente tag:


 <ui:debug hotkey="x" />

Il valore da assegnare all'hotkey è a nostra scelta. Quindi premendo la combinazione di tasti CTRL+SHIFT+X vedremo apparire una finestra di debug con le informazioni ricercate, molto utile per avere a runtime un'evidenza dei dati presenti sulla pagina e negli scope.
Se non si specifica nessun valore per l'hotkey la finestra di debug apparirà una volta premuta la combinazione di tasti CTRL+SHIFT+D.

mercoledì 21 agosto 2013

Jquery accedere ad una cella di una tabella

Per accedere al contenuto di una cella di una tabella html e ad esempio effettuare un test sul valore presente in una certa posizione si può fare così:


var a=$("#datiB").find("tr:eq(1)").find("td:eq(2)").html().substring(2,3);



In questo caso stiamo assegnando alla variabile a la stringa di testo presa dalla tabella con id datiB, nella seconda riga e nella terza colonna. Del valore presente nella stringa interna prendiamo il 3 carattere.

lunedì 12 agosto 2013

JSF leggere proprietà da resource bundle in un backing bean

In questo post avevamo visto come associare un resource bundle alle pagine xhtml, in modo da referenziare con la chiave presente nel file i componenti web senza cablare all'interno le descrizioni.
Se vogliamo effettuare la stessa operazione in un backing bean è sufficiente utilizzare il codice Java solitamente utilizzato per l'internazionalizzazione, ossia la classe java.util.ResourceBundle.
In questo caso non ci serve registrare il file nel faces-config come visto nell'altro post.
Supponiamo di avere il file messages_growl.properties dentro il package resources.
Il codice per accedere alle nostre proprietà sarà il seguente:

ResourceBundle.getBundle("resources.messages_growl").getString("chiavee");



venerdì 9 agosto 2013

Inserire tooltip su h:selectOneMenu

Sfortunatamente il componente JSF h:selectOneMenu, che rappresenta a runtime la classica select HTML, non possiede nella implementazione nativa la proprietà title che serve a fornire un tooltip al passaggio del mouse sul valore selezionato.
Per ovviare a questa lacuna si può o utilizzare la p:selectOneMenu di primefaces (che di default consente di legare il tooltip all'itemDescription).
Per ovviare al problema senza inserire una nuova libreria ho trovato una soluzione un pò rozza  via javascript con questo metodo:


function aggiungiTooltip(idComponente){
  var options = document.getElementById(idComponente).options;
 for(var i = 0; i < options.length; i++) {
                options[i].title = options[i].value;
         }

    }



Questo metodo mi serviva in alcuni casi in cui nel value della combo avevo il testo esteso mentre nel text l'abbreviazione.

Se si vuole aggiungere il testo a video della combo come tooltip basta sostituire options[i].value con options[i].text. In Firefox funziona anche con la proprietà options[i].innerHTML , ma questa proprietà non funziona con IE 10.

L'ideale sarebbe richiamare il metodo all'onload della pagina, altrimenti si può collegare anche al metodo onmouseover del componente stesso.