<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DEcCQHg-cSp7ImA9WhRWF0w.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524</id><updated>2012-01-04T23:27:41.659+01:00</updated><category term="software design" /><category term="web programming" /><category term="jee" /><category term="j2se" /><title>Java Programming</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://programmarejava.blogspot.com/" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/swrSE" /><feedburner:info uri="blogspot/swrse" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A0IDRns5fSp7ImA9WxNRFEw.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-5638519338883467521</id><published>2009-09-07T16:48:00.001+02:00</published><updated>2009-09-08T16:19:37.525+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-08T16:19:37.525+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web programming" /><title>Google Visualization API</title><content type="html">&lt;div&gt;&lt;div style="text-align: justify;"&gt;Google mette a disposizione degli sviluppatori di applicazioni web una serie di API AJAX liberamente utilizzabili all'interno delle pagine HTML. Tali API permettono di arricchire in modo semplice le funzionalita di una pagina, per esempio, aggiungere mappe (&lt;a title="Google Maps API" href="http://code.google.com/apis/maps/" id="cndm"&gt;Google Maps API&lt;/a&gt;), inserire la funzione di ricerca di google (&lt;a title="Google AJAX Search API" href="http://code.google.com/apis/ajaxsearch/" id="bny_"&gt;Google AJAX Search API&lt;/a&gt;) oppure un meccanismo di traduzione all'interno delle proprie pagine web tramite &lt;a title="Google AJAX Language API" href="http://code.google.com/apis/ajaxlanguage/" id="p78v"&gt;Google AJAX Language API&lt;/a&gt;. E' disponibile una&amp;nbsp;&lt;a title="lista completa" href="http://code.google.com/apis/ajax/documentation/" id="z:sm"&gt;lista completa&lt;/a&gt; di tutte le AJAX API di google. &lt;br&gt;&lt;br&gt;Le &lt;a title="Google Visualization API" href="http://code.google.com/apis/visualization/" id="arh."&gt;Google Visualization API&lt;/a&gt;, appartenenti anch'esse alle Google AJAX API, permettono di creare e visualizzare in modo molto semplice grafici di reportistica relativi a dati presenti in una qualsiasi sorgente di dati accessibile tramite il web e compatibile con le Visualization API. I dati da visualizzare possono essere strutturati in grafici, tabelle, mappe, grafi, etc...&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;img src="http://code.google.com/apis/visualization/documentation/gallery/images/icon-areachart.png" alt="Area Chart" height="60" width="120"&gt;&lt;img src="http://code.google.com/apis/visualization/documentation/gallery/images/icon-piechart.png" alt="Pie Chart" height="60" width="120"&gt;&lt;img src="http://code.google.com/apis/visualization/documentation/gallery/images/icon-intensitymap.png" alt="Intensity map" height="60" width="120"&gt;&lt;img src="http://code.google.com/apis/visualization/documentation/gallery/images/icon-orgchart.png" alt="Org chart" height="61" width="120"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Tali oggetti possono eventualmente catturare eventi, per esempio il click del mouse, e contenere dei link, permettendo di creare pagine ricche e interattive.&lt;br&gt;Per utilizzare le Visualization API è necessario seguire alcuni semplici passi:&lt;br&gt;&lt;/div&gt;&lt;br&gt;1) Importare, nella sezione &amp;lt;head&amp;gt; della nostra pagina web, tramite il tag &amp;lt;script&amp;gt; il file JavaScript &lt;a title="http://www.google.com/jsapi" href="http://www.google.com/jsapi" id="ady5"&gt;http://www.google.com/jsapi&lt;/a&gt; che definisce il 'core' delle Google AJAX API:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;div&gt;&lt;div&gt;&lt;table style="text-align: left; margin-left: auto; margin-right: auto;" class="" id="s1xa" border="1" bordercolor="#000000" cellpadding="3" cellspacing="0" height="152" width="774"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: left;" width="100%"&gt;&lt;pre class="prettyprint"&gt;&lt;span class="pun"&gt;&amp;lt;html&amp;gt;&lt;br&gt; &amp;lt;head&amp;gt;&lt;br&gt;&lt;b style="color: rgb(255, 0, 0);"&gt;  &lt;span style="color: rgb(56, 118, 29);"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b style="color: rgb(56, 118, 29);"&gt;&lt;span class="tag"&gt;script&lt;/span&gt; &lt;span class="atn"&gt;type&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="atv"&gt;"text/javascript"&lt;/span&gt; &lt;span class="atn"&gt;src&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="atv"&gt;"http://www.google.com/jsapi"&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;script&lt;/span&gt;&lt;/b&gt;&lt;span class="pun"&gt;&lt;b style="color: rgb(56, 118, 29);"&gt;&amp;gt;&lt;/b&gt;&lt;br&gt;  ...&lt;br&gt; &amp;lt;/head&amp;gt;&lt;br&gt; &amp;lt;body&amp;gt;&lt;br&gt;  ...&lt;br&gt; &amp;lt;/body&amp;gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;2) Caricare, sempre nella sezione &amp;lt;head&amp;gt; della nostra pagina web, tramite il tag &amp;lt;script&amp;gt; le Google Visualization API e definire il tipo di visualizzazione che si vuole usare (es.: grafici a torta, grafici a barre, mappe, ...)&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;table style="text-align: left; margin-left: auto; margin-right: auto;" class="" id="lmny" border="1" bordercolor="#000000" cellpadding="3" cellspacing="0" height="228" width="808"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: left;" width="100%"&gt;&lt;pre class="prettyprint"&gt;&lt;span class="pun"&gt;&amp;lt;html&amp;gt;&lt;br&gt; &amp;lt;head&amp;gt;&lt;/span&gt;&lt;span class="pun"&gt;&lt;br&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;  &lt;span style="color: rgb(56, 118, 29);"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br style="color: rgb(56, 118, 29);"&gt;&lt;span style="color: rgb(56, 118, 29);"&gt;   //Carica le Visualization API e la visualizzazione a grafico di torta di Google&lt;/span&gt;&lt;br style="color: rgb(56, 118, 29);"&gt;  &lt;b style="color: rgb(56, 118, 29);"&gt; google.load('visualization', '1', {'packages':['piechart']});&lt;/b&gt;&lt;br style="color: rgb(56, 118, 29);"&gt;&lt;span style="color: rgb(56, 118, 29);"&gt;  &amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br style="color: rgb(56, 118, 29);"&gt;&lt;span style="color: rgb(56, 118, 29);"&gt;  &amp;lt;!--Carica la visualizzazione messa a disposizione da altri sviluppatori--&amp;gt;&lt;/span&gt;&lt;br style="color: rgb(56, 118, 29);"&gt;&lt;b style="color: rgb(56, 118, 29);"&gt;  &amp;lt;script type="text/javascript" src="http://www.example.com/fabulous_extension.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/b&gt;&lt;br&gt;  ... &lt;br&gt; &amp;lt;/head&amp;gt;&lt;br&gt; &amp;lt;body&amp;gt;&lt;br&gt;  ...&lt;br&gt; &amp;lt;/body&amp;gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;/div&gt;3) Registrare un gestore di inizializzazione e visualizzazione di dati tramite una funzione che si occupa di (usando la funzione onLoad()):&lt;ul style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;preparare i dati da visualizzare: ad ogni oggetto Visualization è associato un oggetto (di tipo &lt;a href="http://code.google.com/apis/visualization/documentation/reference.html#DataTable"&gt;DataTable&lt;/a&gt; ) che contiene 'fisicamente' i dati da visualizare. Un DataTable è una tabella bidimensionale, con righe, colonne e celle. Tutte le celle di una stessa colonna devono contenere dati omogenei (tipicamente stringhe o numeri)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: center;"&gt;&lt;table style="text-align: left; margin-left: auto; margin-right: auto;" class="" id="ixrp" border="1" bordercolor="#000000" cellpadding="3" cellspacing="0" height="216" width="895"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="100%"&gt;&lt;pre class="prettyprint"&gt;&lt;span class="kwd"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(56, 118, 29);"&gt;var&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt; data &lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;=&lt;/span&gt; &lt;span style="color: rgb(56, 118, 29);" class="kwd"&gt;new&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt; google&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;.&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;visualization&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;.&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="typ"&gt;DataTable&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;();&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="com"&gt;// Declare columns and rows.&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;.&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;addColumn&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;(&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="str"&gt;'string'&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;,&lt;/span&gt; &lt;span style="color: rgb(56, 118, 29);" class="str"&gt;'Task'&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;);&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt; &amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="com"&gt;// Column 0 is type string and has label "Task".&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;.&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;addColumn&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;(&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="str"&gt;'number'&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;,&lt;/span&gt; &lt;span style="color: rgb(56, 118, 29);" class="str"&gt;'Hours per Day'&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;);&lt;/span&gt; &lt;span style="color: rgb(56, 118, 29);" class="com"&gt;// Column 1 is type number and has label "Hours per Day".&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="com"&gt;// Add data.&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;.&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;addRows&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;([&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;[&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="str"&gt;'Work'&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;,&lt;/span&gt; &lt;span style="color: rgb(56, 118, 29);" class="lit"&gt;11&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;],&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;[&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="str"&gt;'Eat'&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;,&lt;/span&gt; &lt;span style="color: rgb(56, 118, 29);" class="lit"&gt;2&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;],&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;[&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="str"&gt;'Commute'&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;,&lt;/span&gt; &lt;span style="color: rgb(56, 118, 29);" class="lit"&gt;2&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;],&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;[&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="str"&gt;'Watch TV'&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;,&lt;/span&gt; &lt;span style="color: rgb(56, 118, 29);" class="lit"&gt;2&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;],&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;[&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="str"&gt;'Sleep'&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;,&lt;/span&gt; &lt;span style="color: rgb(56, 118, 29);" class="lit"&gt;7&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;]&lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(56, 118, 29);" class="pun"&gt;]);&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;ul style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;creare un istanza dell'oggetto Visualization (nel seguente listato &lt;span class="str"&gt;'chart_div&lt;/span&gt;' è l'ID del &amp;lt;div&amp;gt; all'interno della pagina HTML in cui verra posizionato l'oggetto visualization, &amp;lt;div id="chart_div"&amp;gt; &amp;lt;/div&amp;gt;)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br&gt;&lt;br&gt;&lt;div style="color: rgb(56, 118, 29); text-align: center;"&gt;&lt;table style="text-align: left; margin-left: auto; margin-right: auto;" class="" id="t5q6" border="1" bordercolor="#000000" cellpadding="3" cellspacing="0" height="56" width="700"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="100%"&gt;&lt;pre class="prettyprint"&gt;&lt;span class="kwd"&gt;var&lt;/span&gt;&lt;span class="pln"&gt; chart &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt; &lt;span class="kwd"&gt;new&lt;/span&gt;&lt;span class="pln"&gt; google&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;visualization&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;PieChart&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;document&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;getElementById&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;'chart_div'&lt;/span&gt;&lt;span class="pun"&gt;));&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;ul style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;registrare e ricevere eventi: tali eventi possono essere generati dall'utente, per esempio click o
passaggio del mouse, oppure automatici, generati per esempio da un
timer&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br&gt;&lt;br&gt;&lt;ul style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;visualizzare i dati (è possbile definire alcune proprieta dell'immagine visualizzata, per esempio il titolo e le dimensioni)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br&gt;&lt;br&gt;&lt;div style="color: rgb(56, 118, 29); text-align: center;"&gt;&lt;table style="text-align: left; margin-left: auto; margin-right: auto;" class="" id="zi3f" border="1" bordercolor="#000000" cellpadding="3" cellspacing="0" height="61" width="804"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="100%"&gt;&lt;pre class="prettyprint"&gt;&lt;span class="prettyprint"&gt;&lt;span class="pln"&gt;chart&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;draw&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;data&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt; &lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;width&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt; &lt;span class="lit"&gt;400&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; height&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt; &lt;span class="lit"&gt;240&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; is3D&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt; &lt;span class="kwd"&gt;true&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt;&lt;span class="pln"&gt; title&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt; &lt;span class="str"&gt;'My Daily Activities'&lt;/span&gt;&lt;span class="pun"&gt;});&lt;/span&gt; &lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;pre class="prettyprint"&gt;&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;4) visualizzare eventuali messaggi di errori in modo 'user-friendly' (&lt;a title="ulteriori dettagli sulla visualizzazione di messaggi di errore" href="http://code.google.com/apis/visualization/documentation/reference.html#errordisplay" id="hq3g"&gt;ulteriori dettagli sulla visualizzazione di messaggi di errore&lt;/a&gt;).&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-5638519338883467521?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nNudPOpxDp-jve9H5KQwPdLUhIs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nNudPOpxDp-jve9H5KQwPdLUhIs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nNudPOpxDp-jve9H5KQwPdLUhIs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nNudPOpxDp-jve9H5KQwPdLUhIs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/ceX191Y1fc8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/5638519338883467521/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=5638519338883467521" title="1 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/5638519338883467521?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/5638519338883467521?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/ceX191Y1fc8/google-visualization-api.html" title="Google Visualization API" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2009/09/google-visualization-api.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcNQ389eSp7ImA9WxJVGUo.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-1913454908106459562</id><published>2009-06-26T16:31:00.001+02:00</published><updated>2009-07-07T16:31:32.161+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T16:31:32.161+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web programming" /><title>Google Kaptcha</title><content type="html">&lt;div style="text-align: justify;"&gt;Nell'ambito dell'informatica con il termine captcha ("&lt;b&gt;C&lt;/b&gt;ompletely &lt;b&gt;A&lt;/b&gt;utomated &lt;b&gt;P&lt;/b&gt;ublic &lt;b&gt;T&lt;/b&gt;uring test to tell &lt;b&gt;C&lt;/b&gt;omputers and &lt;b&gt;H&lt;/b&gt;umans &lt;b&gt;A&lt;/b&gt;part") si intende un test volto a determinare se l'utente di un sistema informatico è un umano o un computer (comunemente detto 'bot'). Un test &lt;i&gt;captcha&lt;/i&gt; tipicamente utilizzato è quello in cui si
richiede ad un utente di scrivere quali siano le lettere o numeri
presenti in una sequenza di lettere o numeri che appaiono distorti o
offuscati sullo schermo (operaizone difficile, anche se non impossibile, per un bot). &lt;br&gt;&lt;br&gt;&lt;img src="http://kaptcha.googlecode.com/svn/wiki/images/kaptcha-example.jpg"&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;Nello sviluppo di un applicazione web può essere utile prevedere un test captcha per esempio quando si vuole evitare che un sistema automatico crei degli account fittizzi per un sistema informatico riempendo delle form attraverso un bot.&lt;br&gt;Google mette a disposizione degli sviluppatori WEB java (JSP) delle librerie pronte all'uso che implementano un meccanismo di captcha. L'uso basico di tali librerie è molto semplice: &lt;br&gt;&lt;ol&gt;&lt;li&gt;occorre innanzitutto aggiungere delle &lt;a title="librerie" href="http://kaptcha.googlecode.com/files/kaptcha-2.3.zip" id="utex"&gt;librerie&lt;/a&gt; all'applicazione web, nella cartella WEB-INF/lib del file .war,&amp;nbsp;&lt;/li&gt;&lt;li&gt;inserire all'interno della form un tag &amp;lt;img src="..."&amp;gt; il cui valore src matcha con l'url-pattern relativo alla servlet &lt;a name="Details"&gt;&lt;span class="pln"&gt;com.google.code.kaptcha.servlet.KaptchaServlet&lt;/span&gt; &lt;/a&gt;definito nel web.xml &lt;br&gt;&lt;/li&gt;&lt;li&gt;creare un riferimento alla servlet kaptcha nel descrittore web.xml,&lt;div&gt;&lt;table class="" id="zqm3" border="1" bordercolor="#000000" cellpadding="3" cellspacing="0" height="135" width="724"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="100%"&gt;&lt;pre class="prettyprint"&gt;&lt;a name="Details"&gt;&lt;span class="pun"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;servlet&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;servlet-name&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;Kaptcha&lt;/span&gt;&lt;span class="pun"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;servlet-name&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;servlet-class&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;com.google.code.kaptcha.servlet.KaptchaServlet&lt;/span&gt;&lt;span class="pun"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;servlet-class&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="pun"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;servlet&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="pun"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;servlet-mapping&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;servlet-name&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;Kaptcha&lt;/span&gt;&lt;span class="pun"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;servlet-name&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;url-pattern&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;/kaptcha.jpg&lt;/span&gt;&lt;span class="pun"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;url-pattern&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="pun"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;servlet-mapping&lt;/span&gt;&lt;span class="pun"&gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;controllare, all'interno della servlet che gestisce i valori inviati con la form, che il valore captcha generato e messo all'interno della sessione web corrisponda con il valore inviato attraverso la form.&lt;div&gt;&lt;table class="" id="d_qa" border="1" bordercolor="#000000" cellpadding="3" cellspacing="0" height="136" width="721"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="100%"&gt;&lt;pre class="prettyprint"&gt;&lt;a name="Details"&gt;&lt;span class="typ"&gt;String&lt;/span&gt;&lt;span class="pln"&gt; kaptchaExpected &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt; &lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="typ"&gt;String&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;request&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;getSession&lt;/span&gt;&lt;span class="pun"&gt;()&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;getAttribute&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;com&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;google&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;code&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;kaptcha&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="typ"&gt;Constants&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;KAPTCHA_SESSION_KEY&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class="typ"&gt;String&lt;/span&gt;&lt;span class="pln"&gt; kaptchaReceived &lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt; request&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;getParameter&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"kaptcha"&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class="kwd"&gt;if&lt;/span&gt; &lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;kaptchaReceived &lt;/span&gt;&lt;span class="pun"&gt;==&lt;/span&gt; &lt;span class="kwd"&gt;null&lt;/span&gt; &lt;span class="pun"&gt;||&lt;/span&gt; &lt;span class="pun"&gt;!&lt;/span&gt;&lt;span class="pln"&gt;kaptchaReceived&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;equalsIgnoreCase&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;kaptchaExpected&lt;/span&gt;&lt;span class="pun"&gt;))&lt;/span&gt;&lt;br&gt;&lt;span class="pun"&gt;{&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; setError&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="str"&gt;"kaptcha"&lt;/span&gt;&lt;span class="pun"&gt;,&lt;/span&gt; &lt;span class="str"&gt;"Invalid validation code."&lt;/span&gt;&lt;span class="pun"&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class="pun"&gt;}&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;E' possbile aumentare la complessita dell'immagine generata settando opportunamente alcuni parametri (&lt;a title="http://code.google.com/p/kaptcha/wiki/ConfigParameters" href="http://code.google.com/p/kaptcha/wiki/ConfigParameters" id="y7yh"&gt;http://code.google.com/p/kaptcha/wiki/ConfigParameters&lt;/a&gt;) nel file web.xml:&lt;br&gt;&lt;br&gt;&lt;div style="text-align: center;"&gt;&lt;table style="text-align: left; margin-left: auto; margin-right: auto;" class="" id="gjkl" border="1" bordercolor="#000000" cellpadding="3" cellspacing="0" height="71" width="381"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="100%"&gt;&lt;font face="Courier New"&gt;&lt;a name="Introduction"&gt;&lt;span class="tag"&gt;&amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;param-name&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;kaptcha.border&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/param-name&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;param-value&amp;gt;&lt;/span&gt;&lt;span class="pln"&gt;yes&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/param-value&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class="tag"&gt;&amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;img alt=""&gt;URL correlati:&lt;br&gt;&lt;a title="http://code.google.com/p/kaptcha/wiki/HowToUse" href="http://code.google.com/p/kaptcha/wiki/HowToUse" id="x1ci"&gt;http://code.google.com/p/kaptcha/wiki/HowToUse&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-1913454908106459562?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Fcqnf7XiC4SMZLSmhw5QbFFXcts/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Fcqnf7XiC4SMZLSmhw5QbFFXcts/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Fcqnf7XiC4SMZLSmhw5QbFFXcts/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Fcqnf7XiC4SMZLSmhw5QbFFXcts/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/U1Red5kdcOI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/1913454908106459562/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=1913454908106459562" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/1913454908106459562?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/1913454908106459562?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/U1Red5kdcOI/google-kaptcha.html" title="Google Kaptcha" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2009/06/google-kaptcha.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkANRHc5eCp7ImA9WxJREkQ.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-4492310537094332141</id><published>2009-05-14T11:51:00.001+02:00</published><updated>2009-05-14T11:53:15.920+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-14T11:53:15.920+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jee" /><title>EJBTimer</title><content type="html">Gli EJB Timer&amp;nbsp; sono oggetti tipicamente creati da stateless o message-drive session bean (la creazione all'interno di uno statefull session bean genera IllegalStateException). Per creare un oggetto Timer è necessario seguire i seguenti passi:&lt;br&gt;&lt;ol&gt;&lt;li&gt;Ottenere un riferimento all'oggetto EJBContext (SessionContext e MessageDrivenContext rispettivamente per gli stateless e message-driven bean)&lt;/li&gt;&lt;li&gt;Ottenere un riferimento a TimerService attraverso l'EJBContext del punto precedente&lt;/li&gt;&lt;li&gt;Creare il Timer attraverso TimerService &lt;br&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;&lt;b&gt;1. Ottenere un riferimento all'EJBContext:&lt;/b&gt;&lt;br&gt;Le specifiche EJB 3.0 permettono di ottenere tale riferimento attraverso la tecnica della Dependency Injection&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table style="text-align: left; margin-left: auto; margin-right: auto;" class="" id="k9w4" border="1" bordercolor="#000000" cellpadding="3" cellspacing="0" height="89" width="440"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="100%"&gt;&lt;pre&gt;@Resource&lt;br&gt;private SessionContext sessionCtx;&lt;br&gt;@Resource&lt;br&gt;private MessageDrivenContext messageDrivenCtx;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: center;"&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;Quando il container crea un' istanza di un enterprise bean processa tutte le relative annotazioni ed esegue le Dependency Injection. Quindi il risultato è che i riferimenti di &lt;span style="font-family: Courier New;"&gt;sessionCtx&lt;/span&gt; e &lt;span style="font-family: Courier New;"&gt;messageDrivenCtx&lt;/span&gt; sono popolati con un istanza rispettivamente di&amp;nbsp; &lt;span style="font-family: Courier New;"&gt;SessionContext&lt;/span&gt; e &lt;span style="font-family: Courier New;"&gt;MessageDrivenContext&lt;/span&gt;.&lt;br&gt;&lt;br&gt;&lt;b&gt;2. Ottenre un riferimento a TimerService:&lt;/b&gt;&lt;br&gt;Questa è un'operazione relativamente semplice e intuitiva&lt;br&gt;&lt;br&gt;&lt;div style="text-align: center;"&gt;&lt;table style="text-align: left; margin-left: auto; margin-right: auto;" class="" id="gc92" border="1" bordercolor="#000000" cellpadding="3" cellspacing="0" height="39" width="523"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="100%"&gt;&lt;pre&gt;TimerService timerService = sessionCtx.getTimerService();&lt;br&gt;TimerService timerService = messageDrivenCtx.getTimerService();&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;b&gt;3. Creazione&amp;nbsp; del Timer:&lt;/b&gt;&lt;br&gt;Esistono due tipologie di Timer: ad azione singola e ad intervallo, a seconda delle esigenze&lt;br&gt;&lt;br&gt;&lt;table style="text-align: left; margin-left: auto; margin-right: auto;" class="" id="bv.j" border="1" bordercolor="#000000" cellpadding="3" cellspacing="0" height="107" width="782"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="100%"&gt;&lt;pre&gt;Calendar now = Calendar.getInstance();&lt;br&gt;Timer singleExpirationTimer = timerService.createTimer(now.getTimeInMillis() + (10 * 1000), null);&lt;br&gt;long oneWeek = (7 * 24 * 60 * 60 * 1000);&lt;br&gt;Timer intervalExpirationTimer = timerService.createTimer(firstMarch2007, oneWeek, null);&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: center;"&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;Un timer può essere eliminato nei seguenit casi:&lt;br&gt;&lt;ul&gt;&lt;li&gt;invocando esplicitamente il metodo di eliminazione: &lt;span style="font-family: Courier New;"&gt;timer.cancel();&lt;/span&gt;&lt;/li&gt;&lt;li&gt;quando il tempo di scedulazione scade (per i Timer ad azione singola)&lt;/li&gt;&lt;/ul&gt;I timer sono degli oggetti persistenti gestiti da un DBMS la cui creazione e cancellazione avvengono all'interno di una
transazione, per cui se tale transazione va in roll-back anche la
creazione o cancellazione viene annullata.&lt;br&gt;La tabella di gestione dei timer deve &lt;u&gt;necessariamente&lt;/u&gt; definire una tabella &lt;i&gt;EJB__TIMER__TBL&lt;/i&gt; (tipicamente Glassfish, l'application server di riferimento della SUN, usa un DBMS Derby) definita dal seguente listato SQL:&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table style="text-align: left; margin-left: auto; margin-right: auto;" class="" id="zte7" border="1" bordercolor="#000000" cellpadding="3" cellspacing="0" height="231" width="478"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="100%"&gt;CREATE &lt;b&gt;TABLE EJB__TIMER__TBL&lt;/b&gt; (&lt;br&gt;CREATIONTIMERAW&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BIGINT&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br&gt;BLOB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BLOB(2G)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&lt;br&gt;TIMERID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VARCHAR(255)&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br&gt;CONTAINERID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BIGINT&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br&gt;OWNERID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VARCHAR(255)&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br&gt;STATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br&gt;PKHASHCODE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTEGER &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br&gt;INTERVALDURATION&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BIGINT &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br&gt;INITIALEXPIRATIONRAW BIGINT&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br&gt;LASTEXPIRATIONRAW&amp;nbsp;&amp;nbsp;&amp;nbsp; BIGINT&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br&gt;CONSTRAINT PK_EJB__TIMER__TBL PRIMARY KEY (TIMERID) &lt;br&gt;) ;&lt;br&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: center;"&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;Può essere necessario tuttavia definire un database su un altro DBMS, per esempio MySQL, quando si vuole gestire uno stesso timer da parte di due o piu Application Server che operano all'interno di un cluster.&lt;br&gt;Per fare cio è necessario:&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;creare un connection pool (&lt;i&gt;mysqltimerpool&lt;/i&gt;) che faccia riferimento al database creato su MySQL&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;div id="eu_-" style="text-align: left;"&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://docs.google.com/File?id=dfkfxq22_69cmb55vd7_b" height="355" width="800"&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;creare una risorsa JDBC (&lt;i&gt;mysqltimer&lt;/i&gt;) relativa al connection pool del punto precedente&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;div id="cf2c" style="text-align: left;"&gt;&lt;div style="text-align: center;"&gt;&lt;img style="width: 648px; height: 258.281px;" src="http://docs.google.com/File?id=dfkfxq22_70cwqrgpqm_b"&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;istruire il container circa la risorsa JDBC da usare per la gestione del Timer Service&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;div id="bo87" style="text-align: center;"&gt;&lt;img style="width: 648px; height: 345.028px;" src="http://docs.google.com/File?id=dfkfxq22_71cgksxghg_b"&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;a title="http://www.javabeat.net/articles/3-ejb-30-timer-services-an-overview-2.html" href="http://www.javabeat.net/articles/3-ejb-30-timer-services-an-overview-2.html" id="wvo5"&gt;http://www.javabeat.net/articles/3-ejb-30-timer-services-an-overview-2.html&lt;/a&gt; &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-4492310537094332141?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WRQKCPS1YFSSVTwl_2FsxTuE7Es/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WRQKCPS1YFSSVTwl_2FsxTuE7Es/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WRQKCPS1YFSSVTwl_2FsxTuE7Es/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WRQKCPS1YFSSVTwl_2FsxTuE7Es/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/vpXedidqN3M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/4492310537094332141/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=4492310537094332141" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/4492310537094332141?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/4492310537094332141?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/vpXedidqN3M/ejbtimer.html" title="EJBTimer" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2009/05/ejbtimer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ANQnYzcSp7ImA9WxVbEkg.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-6449807316910114515</id><published>2009-03-28T16:55:00.001+01:00</published><updated>2009-03-28T16:56:33.889+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-28T16:56:33.889+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web programming" /><title>Virtual Hosting</title><content type="html">&lt;div style="text-align: justify;"&gt;Il &lt;i&gt;&lt;b&gt;Virtual Hosting &lt;/b&gt;&lt;/i&gt;(o &lt;i&gt;&lt;b&gt;Shared IP Hosting&lt;/b&gt;&lt;/i&gt;) è la tecnica che permette di avere più siti web (domini) in esecuzione su una singolo web server fisico, con un unico indirizzo IP statico a disposizione. Nel virtual hosting basato sui nomi di dominio (&lt;b&gt;name-based&lt;/b&gt;), esiste una relazione biunivoca tra host-name&amp;nbsp; (dominio) e &lt;b&gt;virtual server&lt;/b&gt;, e le richieste in arrivo al server fisico vengono instradate opportunamente ad un particolare virtual server, in base all'host name definito nell'URL di richiesta. L' URL di richiesta è l'URL usato da uno User-Agent per richiedere ad un server una risorsa; in genere un web server può risopndere a richieste con URL di richiesta differenti (e tipicamente si tiene traccia di tali URL nel file di log delle richieste). Le seguenti due richieste hanno URL request differente, anche se la risposta sarà probabilmente la stessa:&lt;br&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: center;" id="g06p"&gt;&lt;img style="width: 201px; height: 41px;" src="http://docs.google.com/File?id=dfkfxq22_51fczfmvd7_b"&gt;&lt;/div&gt;&lt;div id="koel" style="text-align: left;"&gt;&lt;div style="text-align: center;" id="mlqc"&gt;&lt;img style="width: 201px; height: 41px;" src="http://docs.google.com/File?id=dfkfxq22_53ff8bpbgc_b"&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;Consideriamo la seguente tabella di mapping delle richieste in arrivo all'IP 127.0.0.1:&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;table style="text-align: left; margin-left: auto; margin-right: auto; width: 452px; height: 85px;" class="" id="pg45" border="1" bordercolor="#000000" cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;" width="25%"&gt;&lt;b&gt;Protocollo&lt;br&gt;&lt;/b&gt;&lt;/td&gt;&lt;td style="text-align: center;" width="25%"&gt;&lt;b&gt;Dominio&lt;br&gt;&lt;/b&gt;&lt;/td&gt;&lt;td style="text-align: center;" width="25%"&gt;&lt;b&gt;Porta&lt;br&gt;&lt;/b&gt;&lt;/td&gt;&lt;td style="text-align: center;" width="25%"&gt;&lt;b&gt;Virtual Server&lt;br&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="25%"&gt;http&lt;br&gt;&lt;/td&gt;&lt;td width="25%"&gt;localhost&lt;br&gt;&lt;/td&gt;&lt;td width="25%"&gt;80&lt;br&gt;&lt;/td&gt;&lt;td width="25%"&gt;server&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="25%"&gt;http&lt;br&gt;&lt;/td&gt;&lt;td width="25%"&gt;localhost1&lt;/td&gt;&lt;td width="25%"&gt;81&lt;br&gt;&lt;/td&gt;&lt;td width="25%"&gt;server1&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;In un contesto JEE, disponendo per esempio di un server Glassfish, sarà sufficiente inserire nel file &lt;i&gt;&amp;lt;glassfish-domain-path&amp;gt;/config/domain.xml&lt;/i&gt; quanto segue:&lt;br&gt;&lt;/div&gt;&lt;br&gt;...&lt;br&gt;&amp;lt;http-listener id="&lt;b&gt;http-listener-80&lt;/b&gt;" port"80"&amp;gt;&lt;br&gt;&amp;lt;http-listener id="&lt;b&gt;http-listener-81&lt;/b&gt;" port"81"&amp;gt;&lt;br&gt;...&lt;br&gt;&amp;lt;virtual-server id="&lt;b&gt;server&lt;/b&gt;" hosts="localhost" http-listeners="&lt;b&gt;http-listener-80&lt;/b&gt;"&amp;gt;&lt;br&gt;
&amp;lt;virtual-server id="&lt;b&gt;server1&lt;/b&gt;" hosts="localhost1" http-listeners="&lt;b&gt;http-listener-81&lt;/b&gt;"&amp;gt;&lt;br&gt;...&lt;br&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;Tramite la console di amministrazione di Glassfish è facimente possibile creare nuovi http-listener &lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;div id="iifi" style="text-align: left;"&gt;&lt;img style="width: 593px; height: 540px;" src="http://docs.google.com/File?id=dfkfxq22_54gjfzvq6b_b"&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;e virtual server:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div id="iwtm" style="text-align: left;"&gt;&lt;div id="mb9v" style="text-align: left;"&gt;&lt;img style="width: 593px; height: 523px;" src="http://docs.google.com/File?id=dfkfxq22_56hq5dffhg_b"&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;Data la configurazione della tabella precedente, per una richiesta "http://localhost1" il server restituisce HTTP-CODE=&lt;b&gt;404&lt;/b&gt;(risorsa non trovata), perchè tutte le richieste http in arrivo sulla porta 80(quella di default per le richieste http) vengono intercettate da &lt;b&gt;http-listener-80&lt;/b&gt; e non esiste un binding tra questo http-listener e il virtual server &lt;b&gt;server1&lt;/b&gt;, che serve tutte e solo le richieste le cui URL request sono del tipo "http://localhost1:81/...".&lt;br&gt;&lt;br&gt;Su un computer locale è possibile sperimentare tale situazione. &lt;br&gt;In ambiente Windows il file &lt;span style="font-family: Courier New;"&gt;&amp;lt;WINDOWS_PATH&amp;gt;\system32\drivers\etc\hosts&lt;/span&gt;, che ha funzioni molto simili a quelle del DNS, opportunamente configurato permette di instradare tutte le richieste di tipo "&lt;i&gt;&amp;lt;PROTOCOLLO&amp;gt;://localhost&lt;/i&gt;" e "&lt;i&gt;&amp;lt;PROTOCOLLO&amp;gt;://localhost&lt;/i&gt;1" sull'host il cui IP è 127.0.0.1, cioè il computer locale:&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div id="xn2s" style="text-align: center;"&gt;&lt;img style="width: 636px; height: 351px;" src="http://docs.google.com/File?id=dfkfxq22_50swpzsjgg_b"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;in genere la riga "&lt;b&gt;&lt;i&gt;127.0.0.1&amp;nbsp;&amp;nbsp;&amp;nbsp; localhost&lt;/i&gt;&lt;/b&gt;" viene inserita di default in fase di installazione del S.O., quindi per il nostro esempio è sufficiente inserire la riga evidenziata in giallo.&lt;br&gt;&lt;br&gt;In fase di deploy di un applicazione web (o enterprise) tramite la console di amministrazione è possibile specificare su quale virtual server debba essere deployata un'applicazione:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div id="la50" style="text-align: left;"&gt;&lt;div id="vpif" style="text-align: left;"&gt;&lt;img style="width: 648px; height: 544.479px;" src="http://docs.google.com/File?id=dfkfxq22_58g57mbcfj_b"&gt;&lt;/div&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;In altrenativa è possibile usare il comando &lt;span style="font-family: Courier New;"&gt;asadmin deploy&lt;/span&gt; con l opzione &lt;span style="font-family: Courier New;"&gt;--virtualservers&lt;/span&gt;, come riportato nella &lt;a title="documentazione ufficiale" href="http://developers.sun.com/appserver/reference/techart/deployment.html" id="ge3m"&gt;documentazione ufficiale&lt;/a&gt;. Per chi usa ambienti di sviluppo integrato è possibile effettuare il deploy direttamente su un particolare virtual server. Per esempio, usando Netbeans IDE e sfruttando le potenzialità di ANT, è possibile modificare il file &lt;i&gt;&amp;lt;project-home&amp;gt;/nbproject/ant-deploy.xml&lt;/i&gt; inserendo un attributo nella tag &lt;span style="font-family: Courier New;"&gt;&amp;lt;sun-appserv-deploy&amp;gt;&lt;/span&gt;:&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div id="l5_x" style="text-align: left;"&gt;&lt;img style="width: 648px; height: 272.038px;" src="http://docs.google.com/File?id=dfkfxq22_59f69rtrdk_b"&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;Settando in maniera opportuna le &lt;a title="proprietà" href="http://docs.sun.com/app/docs/doc/820-4338/abhfg?a=view" id="pkqu"&gt;proprietà&lt;/a&gt;  di un virtual server è possibile, tra l'altro, impedire l'accesso a tale virtual server (e quindi a tutte le applicazioni in esecuzione su di esso) alle richieste provenienti da particolari indirizzi IP,&amp;nbsp; attraverso le proprietà denyRemoteAddress e allowRemoteAddress.&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;Ulteriori dettagli sull'utilizzo dei virtual server in ambiente JEE:&lt;br&gt;&lt;a title="http://docs.sun.com/app/docs/doc/820-4507/abhfg?a=view" href="http://docs.sun.com/app/docs/doc/820-4507/abhfg?a=view" id="jjkj"&gt;http://docs.sun.com/app/docs/doc/820-4507/abhfg?a=view&lt;/a&gt; &lt;br&gt;&lt;a title="http://blogs.sun.com/jluehe/entry/virtual_hosting_features_in_glassfish" href="http://blogs.sun.com/jluehe/entry/virtual_hosting_features_in_glassfish" id="pddb"&gt;http://blogs.sun.com/jluehe/entry/virtual_hosting_features_in_glassfish&lt;/a&gt; &lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-6449807316910114515?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/a4nUHVisazcSurz5_rIHt7NsVJQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a4nUHVisazcSurz5_rIHt7NsVJQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/a4nUHVisazcSurz5_rIHt7NsVJQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a4nUHVisazcSurz5_rIHt7NsVJQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/DG6a0ZLBuxM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/6449807316910114515/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=6449807316910114515" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/6449807316910114515?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/6449807316910114515?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/DG6a0ZLBuxM/virtual-hosting.html" title="Virtual Hosting" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2009/03/virtual-hosting.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcCSX06fCp7ImA9WxVUGE0.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-6033502186110235520</id><published>2009-03-23T11:25:00.001+01:00</published><updated>2009-03-23T11:27:48.314+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-23T11:27:48.314+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web programming" /><title>Inserire immagine favicon</title><content type="html">&lt;div style="text-align: justify;"&gt;

 
 
 
In questo articolo ci occupiamo di come definire una &lt;b&gt;favicon&lt;/b&gt; per un'applicazione web scritta in java. La favicon è la piccola immagine che viene visualizzata sul browser nella barra degli indirizzi a sinistra di un URL e che facilita l'individuazione del nostro sito quando viene aggiunto ai preferiti. Un classico esempio di favicon è l'icona che compare a sinisra dell' URL quando si accede alla home page di &lt;a title="google" href="http://www.google.com" id="h:-j"&gt;google&lt;/a&gt;.&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div id="vt_c" style="padding: 1em 0pt; text-align: center;"&gt;&lt;img style="width: 261px; height: 41px;" src="http://docs.google.com/File?id=dfkfxq22_45fb7vrwfb_b"&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;Per rendere disponibile e visibile tale icona dobbiamo rispettare le seguenti specifiche:&lt;br&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;il nome dell'immagine deve essere &lt;b&gt;favicon.ico&lt;/b&gt; (non è sufficiente rinominare una gif, bmp, o altro, ma bisogna necessariamente disporre di un programma specifico per la generazione di immagini con estensione .ico, per esempio &lt;a title="irfanview" href="http://www.irfanview.com/" id="yd3t"&gt;irfanview&lt;/a&gt;, liberamente scaricabile)&lt;/li&gt;&lt;li&gt;avere dimensioni 16x16 pixel&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: center;"&gt;&lt;img style="width: 377px; height: 247px;" src="http://docs.google.com/File?id=dfkfxq22_476md43wf5_b"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;l'immagine deve essere disponibile all'URL http://&amp;lt;miosito.it&amp;gt;/favicon.ico. Per esempio se si usa Glassfish, l'application server realizzato da Sun Microsystems come &lt;i&gt;implementazione di riferimento&lt;/i&gt; della specifica Java EE 5, bisognerà collocare l'icona in &lt;b&gt;&amp;lt;glassfish_domain_path&amp;gt;\docroot&lt;/b&gt;, e non semplicemente nella root della nostra applicazione. L'icona sarà applicata a tutte le applicazioni che girano sul dominio &lt;b&gt;glassfish_domain_path&lt;/b&gt;.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;In alternativa, soprattutto se si vuole definire una favicon diversa per ognua delle applicazioni definite nello stesso dominio, nella sezione &amp;lt;head&amp;gt; delle pagine web in cui si voglia visualizzare la favicon deve essere inserita una tag &lt;i&gt;link&lt;/i&gt; con attributi &lt;i&gt;rel&lt;/i&gt; e &lt;i&gt;href&lt;/i&gt; opportunamente definiti, al seguente modo:&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;table style="text-align: left; margin-left: auto; margin-right: auto;" class="zeroBorder" id="po0t" border="0" cellpadding="3" cellspacing="0" height="26" width="495"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="100%"&gt;&amp;lt;html&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;head&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&amp;lt;link rel="shortcut icon" href="favicon.ico"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .....&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;body&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .....&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;br&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;Per evitare l'operazione ripetitiva di dover definire in ogni pagina la tag &lt;i&gt;link&lt;/i&gt;, è possibile utilizzare il meccanismo delle proprieta di gruppo di JSP(mediante &lt;a title="&amp;lt;jsp-property-group&amp;gt;" href="http://java.sun.com/javaee/5/docs/tutorial/backup/doc/JSPIntro13.html" id="b19s"&gt;&amp;lt;jsp-property-group&amp;gt;&lt;/a&gt;  in web.xml). Per come abbiamo definito il contenuto di &lt;i&gt;href&lt;/i&gt; nel nostro esempio è necessario che il file favicon.ico ora si trovi nella root della nostra applicazione, ma è comunque possibile collocare il file anche in una sottodirectory, per esempio &lt;i&gt;/res&lt;/i&gt;, cambiando adeguatamente il valore di &lt;i&gt;href&lt;/i&gt;:&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div id="robs" style="padding: 1em 0pt; text-align: center;"&gt;&lt;img style="width: 213px; height: 200px;" src="http://docs.google.com/File?id=dfkfxq22_48fw79xjdq_b"&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: center;"&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Trattandosi di un'icona è opportuno, ma non necessario, istruire il container circa il mime-type del file favicon.ico. In un contesto di programmazione java lato server ciò si traduce nell'aggiunta di un nuovo &lt;b&gt;&amp;lt;mime-mapping&amp;gt;&lt;/b&gt; nel descrittore web.xml:&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;table style="text-align: left; margin-left: auto; margin-right: auto;" class="zeroBorder" id="hk9e" border="0" cellpadding="3" cellspacing="0" height="155" width="558"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="100%"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br&gt;&amp;lt;web-app version="2.5" xmlns="..." xmlns:xsi="..." xsi:schemaLocation="..."&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .....&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mime-mapping&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;extension&amp;gt;&lt;b&gt;ico&lt;/b&gt;&amp;lt;/extension&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mime-type&amp;gt;&lt;b&gt;image/x-icon&lt;/b&gt;&amp;lt;/mime-type&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mime-mapping&amp;gt;&lt;br&gt;&amp;lt;/web-app&amp;gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-6033502186110235520?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7pBxuhGZ1kdVgVsc8cncW-zu-7I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7pBxuhGZ1kdVgVsc8cncW-zu-7I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7pBxuhGZ1kdVgVsc8cncW-zu-7I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7pBxuhGZ1kdVgVsc8cncW-zu-7I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/dQ1OBVNA3Pc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/6033502186110235520/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=6033502186110235520" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/6033502186110235520?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/6033502186110235520?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/dQ1OBVNA3Pc/inserire-immagine-favicon.html" title="Inserire immagine favicon" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2009/03/inserire-immagine-favicon.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcESHw9cCp7ImA9WxVWEEg.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-8541001284529451446</id><published>2009-02-14T16:15:00.001+01:00</published><updated>2009-02-19T16:06:49.268+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-19T16:06:49.268+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="j2se" /><title>Java Reflection</title><content type="html">

 
 
 
&lt;font style="color: rgb(255, 0, 0);" size="5"&gt;Java Reflection&lt;/font&gt;&lt;br&gt;&lt;br&gt;La reflection permette di esaminare o modificare il comportamento run-time di un applicazione java&amp;nbsp; eseguita nella JVM. Questa proprietà avanzata è applicata, tra l'altro, nei seguenti casi:&lt;br&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;b&gt;Caratteristiche di estensibilita&lt;/b&gt;: un'applicazione può fare uso di classi esterne definite dall'utente, creando istanze si esse usando il "fully-qualified" path.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Ambienti di sviluppo visuale&lt;/b&gt; (IDE): generalmente gli ambienti di sviluppo visuale (p.e. NetBeans o Eclipse), che richiedono la presenza di un 'browser' di classi,&amp;nbsp; per aiutare gli sviluppatori a scrivere codice corretto e semplice fanno largo uso della reflection, molto utile quando di vuole enumerare i membri di una classe.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Debug e test&lt;/b&gt;: i debugger necessitano di conoscere i membri privati di una classe, per determinarne il valore in un determinato istante.&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;La reflection è uno strumento molto potente ma che dovrebbe essere usato con cautela; in genere se è possibile raggiungere un obiettivo senza l'uso della reflection, è preferibile non farne uso. In particolare è necessario tener presente i seguenti svantaggi:&lt;br&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;b&gt;Overhead delle prestazioni&lt;/b&gt;: considerando che la reflection comporta la risoluzione dei tipi dinamicamente, alcune ottimizzazioni fatte dalla JVM non possono essere effettuate, per cui l'uso della reflection è sconsigliato nelle sezioni di codice che sono richiamate frequentemente nelle applicazioni performance-sensitive.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Restrizioni di sicurezza&lt;/b&gt;: la reflection richiede permessi di sicurezza che non sono presenti quando l'esecuzione di un applicazione avviene in presenza di un security manager. Di questo particolare bisogna tener conto per esempio nello sviluppo di un'Applet.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Esposizione dei membri interni&lt;/b&gt;: considerando che la reflection permette di effettuare operazioni 'illegali', per esempio accesso ai campi e metodi privati di un oggetto, si potrebbe rischiare di compromettere la portabilità del codice. In particolare viene eliminato il concetto di astrazione con conseguenti problemi in seguito ad upgrade della piattaforma.&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;Attraverso la reflection è possibile conoscere a run-time tutti i metodi di una classe ed eventualmente invocarne uno. Il seguente listato permette di invocare il metodo di una classe  con opportuni parametri, senza che siano noti a priori il numero e tipo dei parametri:&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;package test;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;import java.lang.reflect.*;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;import java.util.Hashtable;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;public class ReflectionTest {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String args[])&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throws Exception {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Class classe = Class.forName(args[0]);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String methodName = args[1];&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method[] methods = classe.getDeclaredMethods();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hashtable&amp;lt;String, Method&amp;gt; methodHashtable =&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Hashtable&amp;lt;String, Method&amp;gt;();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; methods.length; i++) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method method = methods[i];&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String name = method.getName();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; methodHashtable.put(name, method);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Method m = methodHashtable.get(methodName);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Class[] paramTypes = m.getParameterTypes();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (paramTypes.length != args.length - 2) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("Num. parametri errato");&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.exit(0);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int paramNum = paramTypes.length;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object[] params = new Object[paramNum];&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int j = 0; j &amp;lt; paramNum; j++) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Class type = paramTypes[j];&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Constructor c =&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type.getConstructor(String.class);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; params[j] = c.newInstance(args[j + 2]);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(m.invoke(classe.newInstance(), params));&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;class ReflectionTestClass {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Integer sum(Integer i, Integer j) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return i + j;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;Il main si richiama con la sintassi "&lt;i&gt;java ReflectionTest &amp;lt;nomeClasse&amp;gt; &amp;lt;nomeMetodo&amp;gt; &amp;lt;parametro1&amp;gt; &amp;lt;parametro2&amp;gt; ...&lt;/i&gt;", per esempio "java test.ReflectionTest test.ReflectionTestClass&amp;nbsp; sum 2 3"&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-8541001284529451446?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/q74XsJL086-SQjzeate43lpxoGk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/q74XsJL086-SQjzeate43lpxoGk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/q74XsJL086-SQjzeate43lpxoGk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/q74XsJL086-SQjzeate43lpxoGk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/lray1_aPoc8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/8541001284529451446/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=8541001284529451446" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/8541001284529451446?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/8541001284529451446?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/lray1_aPoc8/java-reflection.html" title="Java Reflection" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2009/02/java-reflection.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcCQHg8eCp7ImA9WhRWF0w.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-5348579005193560587</id><published>2009-01-26T09:57:00.001+01:00</published><updated>2012-01-04T23:27:41.670+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-04T23:27:41.670+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="j2se" /><title>Primi passi con java</title><content type="html">&lt;div&gt;
&lt;span style="color: red; font-size: large;"&gt;Installazione&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&amp;nbsp;Le seguenti istruzioni riguardano l'istallazione della JDK vesione 1.6.0_x(in seguito &lt;b&gt;jdk1.6.0_&amp;lt;version&amp;gt;&lt;/b&gt;) su Windows:&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Scaricare la versione più aggiornata della&amp;nbsp;&lt;/b&gt;&lt;a href="http://java.sun.com/javase/downloads/index.jsp" id="sw64" title="Java SE Development Kit"&gt;&lt;b&gt;Java SE Development Kit&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Eseguire l'istallazione attraverso il file &lt;/b&gt;&lt;span style="font-family: Courier New;"&gt;&lt;b&gt;jdk-6u1&amp;lt;version&amp;gt;-windows-i586-i.exe&lt;/b&gt;.&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt; Durante l'installazione è possibile confermare i valori default cliccando su "Next" e "Yes". Al termine dell'istallazione potrebbe essere richiesto di riavviare il sistema. Per verificare la corretta installazione è possibile controllare che l'albero delle directory abbia la seguente struttura:&lt;/span&gt; &lt;/div&gt;
&lt;span style="font-family: Verdana;"&gt;
&lt;div id="nc-q" style="padding-bottom: 1em; padding-left: 0pt; padding-right: 0pt; padding-top: 1em; text-align: left;"&gt;
&lt;img src="http://docs.google.com/File?id=dfkfxq22_31g7ghp2nt_b" style="height: 176px; width: 413px;" /&gt;&lt;/div&gt;
&lt;/span&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="font-family: Verdana;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Aggiornare la variabile d'ambiente PATH (Opzionale)&lt;/b&gt;: è possibille settare opzionalmente la variabile PATH se si vuole usare gli eseguibili della JDK (javac.exe, java.exe, javadoc.exe,...) a partire da qualsiasi directory senza specificarne ogni volta il path completo. Nel caso in cui la PATH non viene aggiornata, ogni volta che si vuole&amp;nbsp;compilare&amp;nbsp;un programma java è necessario, per esempio, eseguire quanto segue:&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt;
C:&amp;gt; &lt;b&gt;"\Program Files\Java\jdk1.6.0_&amp;lt;version&amp;gt;\bin\javac" MyClass.java&lt;/b&gt; 
&lt;br /&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
a meno che non ci si trovi nella cartella C:&amp;gt; Program Files\Java\jdk1.6.0_&amp;lt;version&amp;gt;\bin\. In genere, quando viene eseguito un comando, Windows verifica se tale comando "si trovi" in una delle directory specificate nella variabile PATH, per cui se il percorso della directory che contiene javac viene registrato nella variabile PATH è possibile eseguire semplicemente:&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;javac MyClass.java&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
ed evitare che cosi venga visualizzato il seguente messaggio:&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;"jevac" non è riconosciuto come comando interno o esterno,&amp;nbsp;un programma eseguibile o un file batch.&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Per settare la variabile&amp;nbsp;è necessario &lt;/div&gt;
&lt;/blockquote&gt;
&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div style="text-align: justify;"&gt;
cliccare Start &amp;gt; Pannello di Controllo &amp;gt; Sistema (su Windows XP) o Start &amp;gt; Setting &amp;gt; Pannello di Controllo &amp;gt; Sistema su Windows 2000 &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="text-align: justify;"&gt;
cliccare Avanzate &amp;gt; Variabili d'Ambiente &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="text-align: justify;"&gt;
Settare&amp;nbsp;nella variabile PATH delle 'Variabili Utente' il percorso della directory in cui si trovano gli eseguibili java.exe, javac.exe, ..., se il vecchio valore di PATH è non vuoto è necessario aggiungere ';' e poi il percorso della director, es.: &lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;div style="text-align: center;"&gt;
&amp;nbsp;'vecchio_valore_di_PATH&lt;b&gt;; C:\Program Files\Java\jdk1.6.0_&amp;lt;version&amp;gt;\bin'&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Oltre alla JDK è consigliabile (per principianti ed esperti)&amp;nbsp;eseguire il download della documentazione delle API in formato html e tenerla sempre a portata di mano.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="color: red;"&gt;Il primo programma&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Il primo passo per eseguire un programma java è quello di creare un &lt;b&gt;file sorgente&lt;/b&gt; (per esempio MyFirstClass.java). Un file sorgente java è un file di testo con estensione .java creabile e modificabile utilizzando un qualsiasi&amp;nbsp;editor di testi (es. Vi per Linux o NotePad per Windows).&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;table border="0" cellpadding="3" cellspacing="0" class="zeroBorder" height="107" id="npua" style="margin-left: auto; margin-right: auto; text-align: left; width: 410px;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="100%"&gt;&lt;span style="color: #0b5394;"&gt;public class&lt;/span&gt; MyFirstClass &lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0b5394;"&gt;public static void&lt;/span&gt; main(&lt;span style="color: #0b5394;"&gt;String&lt;/span&gt;&lt;span style="color: red;"&gt;[]&lt;/span&gt; args)&lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;div style="text-align: left;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(&lt;span style="color: lime;"&gt;"Il primo programma!!!"&lt;/span&gt;);&lt;/div&gt;
&lt;/div&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;}&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Dopo aver salvato il file MyFirstClass.java in C:\corsojava\ (facendo attenzione alle maiuscole e minuscole, perchè Java è case-sensitive) la fase sucessiva prevede che il file sorgente venga dato in pasto al &lt;b&gt;compilatore Java&lt;/b&gt; (attraverso il comando &lt;i&gt;javac&lt;/i&gt;):&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;/div&gt;
&lt;b&gt;&lt;span style="color: #00b1f1;"&gt;&lt;span style="color: #00b1f1;"&gt;&lt;span style="color: #00b1f1;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;span style="color: #00b1f1;"&gt;&lt;span style="color: #00b1f1;"&gt;&lt;span style="color: #00b1f1;"&gt;&lt;span style="color: black; font-size: x-small;"&gt;C:\corsojava&amp;gt; javac MyFirstClass.java&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;b&gt;&lt;span style="color: #00b1f1;"&gt;&lt;span style="color: #00b1f1;"&gt;&lt;span style="color: #00b1f1;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #00b1f1;"&gt;&lt;span style="color: #00b1f1;"&gt;&lt;span style="color: #00b1f1;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Il sorgente java è cosi tradotto in istruzioni in formato di basso livello universale(bytecode), eseguibili da qualsiasi Java Virtual Machine(JVM). Tali istruzioni vengono salvate in un file con estensiopne .class (&lt;b&gt;MyFirstClass.class&lt;/b&gt;) è cosi possibile eseguire il primo programma.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;&lt;span style="color: #00b1f1;"&gt;&lt;span style="color: #00b1f1;"&gt;&lt;span style="color: #00b1f1;"&gt;&lt;span style="color: black; font-size: x-small;"&gt;C:\corsojava&amp;gt; java MyFirstClass&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;
con il seguente risultato:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="padding-bottom: 1em; padding-left: 0pt; padding-right: 0pt; padding-top: 1em; text-align: center;"&gt;
&lt;img src="http://docs.google.com/File?id=dfkfxq22_33kdb7b3dd_b" style="height: 94px; width: 299px;" /&gt;&lt;/div&gt;
&lt;div style="margin-left: 80px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
Il bytecode generato è indipendente dalla piattaforma HW/SW utilizzata, sarà compito della JWM tradurre il bytecode, una istruzione alla volta, in istruzioni macchina compatibili con la piattaforma utilizzata. Da questa importante proprieta di cui la programmazione java derivano i seguenti concetti:&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Portabilità&lt;/b&gt;: il codice Java sviluppato su una piattaforma può essere trasferito senza particolari problemi su un altra piattaforma (es. da Windows a Linux). Ciò è garantito quasi al 100% poichè le JVM sviluppate per i vari sistemi operativi hanno un comportamento pressochè uniforme. Tale uniformità di funzionamento non è tuttavia garantita per le JVM implementate per i dispositivi di telefonia mobile di ultima generazione che supportano java. &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="text-align: justify;"&gt;
&lt;b&gt;Migrazione/mobilità&lt;/b&gt;: è possibile eseguire in locale codice java situato su siti remoti accessibili tramite la rete Internet caricandolo il in locale "al volo", senza preoccuparsi per esempio del S.O. su cui dovrà essere eseguito tale bytecode.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;
Si noti che l'interprete non prende in pasto un file (per l'esempio precedente non abbiamo eseguito il comando &lt;b&gt;java MyFirstClass&lt;/b&gt;!) bensì il nome di una classe, che deve coincidere con il nome del file .class che contiene il bytecode della nostra classe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="color: red;"&gt;Un programma che usa API standard&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
In genere un programma java fa uso di diverse classi (appartenenti alle API standard di java, definite dall'utente oppure appartenenti ad API non standard). Le classi sono raggruppate in librerie, chiamate package. In MyFirstClass abbiamo fatto uso della classe System, che fa parte del package java.lang. Tale package è importato implicitamente in ogni programma java per cui le classi in esso definite possono essere usate direttamente (come anche la classe String).&lt;br /&gt;
&amp;nbsp;Classi di package diversi da java.lang devono essere localizzate in maniera esplicita, importandole attraverso la direttiva di importazione la cui sintassi è la seguente:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="color: #0b5394;"&gt;import&lt;/span&gt; nome_completo_della_classe;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
esempi di importazione sono &lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="color: #0b5394;"&gt;import&lt;/span&gt; java.util.Date;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
oppure &lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="color: #0b5394;"&gt;import&lt;/span&gt; java.util.*;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;
quest'ultima istruzione permette di usare tutte le classi definite nel package java.util&lt;br /&gt;
&lt;br /&gt;
Il seguente programma fa uso della classe Date definita nel package java.util e stampa l'ora corrente:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;table border="0" cellpadding="3" cellspacing="0" class="zeroBorder" height="123" id="pi9q" style="margin-left: auto; margin-right: auto; text-align: left; width: 388px;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="100%"&gt;&lt;span style="color: #0b5394;"&gt;import&lt;/span&gt; java.util.*;&lt;br /&gt;
&lt;span style="color: #0b5394;"&gt;public class&lt;/span&gt; MySecondClass &lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0b5394;"&gt;public static void&lt;/span&gt; main(String&lt;span style="color: red;"&gt;[]&lt;/span&gt; args)&lt;span style="color: red;"&gt;{&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #666666;"&gt;/**la seguente istruzione usa&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #666666;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *la classe Date definita in java.util&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #666666;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * */&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println&lt;span style="color: red;"&gt;(&lt;/span&gt;&lt;span style="color: lime;"&gt;"Ora corrente: "&lt;/span&gt;+&lt;span style="color: #0b5394;"&gt;new&lt;/span&gt; Date&lt;span style="color: red;"&gt;())&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: red;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;}&lt;/span&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
il risultato della sua esecuzione è:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div id="ct33" style="padding-bottom: 1em; padding-left: 0pt; padding-right: 0pt; padding-top: 1em; text-align: center;"&gt;
&lt;img src="http://docs.google.com/File?id=dfkfxq22_33gdzzbwgw_b" style="height: 99px; width: 356px;" /&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="color: red;"&gt;&lt;br /&gt;Un programma che usa API non standard&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il bytecode di una classe contiene le istruzioni della classe stessa e gli eventuali riferimenti al codice di altre classi usate. Quest'ultime saranno usate dalla JVM per reperire il bytecode necessario durante l'esecuzione. Se in una classe si vuole usare un'altra classe non API è necessario, se quest'ultima non si trova all'interno della stessa directory della prima, importarla esplicitamente.&lt;br /&gt;
Java usa la variabile &lt;b&gt;CLASSPATH&lt;/b&gt;, che contiene i pathname delle directory in cui si trovano i package non API. Tale variabile può essere settata allo stesso modo con cui viene settata la variabile PATH, vista in precedenza. Tuttavia la variabile CLASSPATH è tipica della JVM, a differenza di PATH che ha un uso più generico, per cui potrebbe essere necessario crearla ad hoc. Il contenuto della variabile CLASSPATH deve essere tipo:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;b&gt;.;C:\javalib\mio_package.jar&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
&lt;br /&gt;
se in c:\javalib\mio_package.jar sono localizzati i file che definiscono il bytecode delle classi che useremo all'interno di una nuova classe. In alternativa è possibile usare, in fase di compilazione(javac) o esecuzione(java) il parametro -classpath nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
java &lt;b&gt;-classpath&lt;/b&gt; c:\javalib\mio_package.jar MyThirdClass&lt;/div&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-5348579005193560587?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bmYmgPkkdeNxYPZIm_qw8mzCs8c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bmYmgPkkdeNxYPZIm_qw8mzCs8c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bmYmgPkkdeNxYPZIm_qw8mzCs8c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bmYmgPkkdeNxYPZIm_qw8mzCs8c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/3eN6Y1ecFOk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/5348579005193560587/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=5348579005193560587" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/5348579005193560587?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/5348579005193560587?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/3eN6Y1ecFOk/primi-passi-con-java.html" title="Primi passi con java" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2009/01/primi-passi-con-java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMBQnY9fSp7ImA9WxRUGUs.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-7679898743368474240</id><published>2008-11-29T14:44:00.001+01:00</published><updated>2008-11-29T15:04:13.865+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-29T15:04:13.865+01:00</app:edited><title>Interpreter Design Pattern</title><content type="html">

 
 
 


 
 
 


 
 
 
 

 
 
 
&lt;b style="color: rgb(204, 0, 0);"&gt;INTERPRETER DESIGN PATTERN&lt;/b&gt;:&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;Obiettivo: fornire una definizione di un macro-linguaggio e il parsing di esso in un oggetto.&lt;br&gt;&lt;br&gt;Questo pattern è particolarmente indicato quando si vuole costruire un parser di stringhe personalizzato, tradurre una specifica espressione o gestire un'informazione strutturata ad albero.&lt;br&gt;&lt;br&gt;Nel nostro esempio useremo il design pattern Interpreter per definire un parser di una stringa che definisce codice &lt;i&gt;pseudo-sql&lt;/i&gt;. Nel listato, per focalizzare l'attenzione sul pattern in esame e quindi definire un codice snello, faremo uso anche dei pattern Visit e Iterator.&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;package &lt;/span&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;designPatterns.&lt;/a&gt;&lt;span style="font-family: Courier New;"&gt;interpreter.*;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;import java.util.*;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;public class Main {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String[] args) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String source = &lt;b&gt;"attributes='id',table='users',"+&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/b&gt;&lt;span style="font-family: Courier New;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "conditions='username\"root\" and password=\"mypwd\"'"&lt;/b&gt;;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String delimiter = "=,'";&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Parser parser = new Parser(source, delimiter);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parser.&lt;b&gt;myParser()&lt;/b&gt;;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parser.&lt;b&gt;interpret()&lt;/b&gt;;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String result = &lt;b&gt;parser.getInterpretedResult()&lt;/b&gt;;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(result);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;class Parser{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String expression;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String delimitator; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private List result;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String interpreted;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Parser(String e, String t) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; expression = e;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delimitator = t;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void myParser() {&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTokenizer holder = new StringTokenizer(expression, delimitator); &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String[] toBeMatched = new String[holder.countTokens()];&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int idx = 0;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(holder.hasMoreTokens()) { &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String item = holder.nextToken(); &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int start = item.indexOf(","); &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(start==0) { &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item = item.substring(2); &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; toBeMatched[idx] = item; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; idx ++; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = Arrays.asList(toBeMatched); &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public List getParseResult() {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void interpret() {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringBuffer buffer = new StringBuffer();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ListIterator list = result.listIterator();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (list.hasNext()){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String token = (String)list.next();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (token.equals("attributes")){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; token = "SELECT";&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else if(token.equals("table")) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; token = "FROM";&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else if(token.equals("conditions")) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; token = "WHERE";&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buffer.append(" " + token);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; interpreted = buffer.toString();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getInterpretedResult() {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return interpreted;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;} &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;Un esempio molto più concreto di applicazione del pattern Interpreter è dato dal parsing di una query scritta in linguaggio &lt;b&gt;EJB-QL&lt;/b&gt; nell'ambito dello sviluppo JEE. Come noto una query di ricerca scritta in tale linguaggio non è altro che una stringa ma il risultato della sua esecuzione, mediante l'utilizzo delle API che gestiscono la persistenza con un database, è un vero e proprio oggetto o una collezione di tali oggetti omogenei. Nel seguente listato viene illustrata una semplificazione del parser che, data una query ejb-ql, restituisce una collezione di oggetti (che saranno poi gli Entity Bean deputati a gestire la persistenza delle informazioni elaborate in un'applicazione enterprise con un database).&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;package &lt;/span&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;designPatterns.&lt;/a&gt;&lt;span style="font-family: Courier New;"&gt;interpreter;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;import java.util.*;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;public class Main {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String[] args) &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throws NotWellFormedSimpleQuery {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //String to parse&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String queryString = &lt;b&gt;"FROM interpreter.MyEntity"&lt;/b&gt;;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SimpleEJBQueryParser queryParser = &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new SimpleEJBQueryParser(queryString);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //interpret String and cast result&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;MyEntity&amp;gt; resultList = &lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;b&gt;(&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;&lt;b&gt;List&amp;lt;MyEntity&amp;gt;)&lt;/b&gt; &lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;queryParser.getResultList();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Iterator it = resultList.iterator();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(it.hasNext()){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyEntity tmp = (MyEntity)it.next();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(tmp.getId()+"-"+tmp.getValue());&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;class MyEntity{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Integer id;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String value;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public MyEntity(){}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public MyEntity(Integer id, String value) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.id = id;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.value = value;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setId(Integer id) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.id = id;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setValue(String value) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.value = value;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Integer getId() {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return id;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getValue() {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return value;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;class SimpleEJBQueryParser{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Class entityClass;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String tableName;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private List resultList;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public SimpleEJBQueryParser(String query) &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throws NotWellFormedSimpleQuery{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringTokenizer st = new StringTokenizer(query);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!st.nextToken(" ").trim().equals("FROM"))&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new NotWellFormedSimpleQuery();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tableName = st.nextToken(" ");&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entityClass = Class.forName(tableName);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (ClassNotFoundException ex) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new NotWellFormedSimpleQuery(ex.toString());&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public List getResultList(){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buildResultList();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return resultList;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void buildResultList(){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultList = new ArrayList();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object obj = null;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;obj = entityClass.newInstance()&lt;/b&gt;;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception ex) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(ex.toString());&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(obj instanceof MyEntity){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyEntity tmp = (MyEntity)obj;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*populate MyEntity directly or setting values &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*from database table MyEntity for examle:*/&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tmp.setId(1);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tmp.setValue("ciao");&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultList.add(obj);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;class NotWellFormedSimpleQuery extends Exception {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public NotWellFormedSimpleQuery(){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super("The simple query is not well formed");&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public NotWellFormedSimpleQuery(String msg){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super(msg);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-7679898743368474240?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FU2tacimjvhAPEDu69jAYqv8S1o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FU2tacimjvhAPEDu69jAYqv8S1o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FU2tacimjvhAPEDu69jAYqv8S1o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FU2tacimjvhAPEDu69jAYqv8S1o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/xnzuGpBYlmw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/7679898743368474240/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=7679898743368474240" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/7679898743368474240?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/7679898743368474240?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/xnzuGpBYlmw/interpreter-design-pattern.html" title="Interpreter Design Pattern" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2008/11/interpreter-design-pattern.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcGSHY_eip7ImA9WxRUGEU.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-3033549188514193540</id><published>2008-11-28T15:17:00.007+01:00</published><updated>2008-11-28T15:37:09.842+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-28T15:37:09.842+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software design" /><title>Chain-Of-Responsability Design Pattern</title><content type="html">&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;b&gt;&lt;span style="color: rgb(204, 0, 0); font-family: Verdana;"&gt;CHAIN-OF-RESPONSABILITY DESIGN PATTERN&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: Verdana;"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;br&gt;&lt;br style="font-family: Verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;Obiettivo:
fare in modo che una richiesta possa essere processata da uno di più oggetti. Tale richiesta passa per una &lt;i&gt;catena&lt;/i&gt; di oggetti finchè uno di essi non la gestisce.&lt;br&gt;&lt;br&gt;Il
può noto esempio di applicazione di questo design pattern è la gestione
delle eccezioni in java. Quando durante l'esecuzione del metodo di una
classe scatta un'eccezione, la classe può gestirela (tramite il
meccanismo &lt;span style="font-family: Courier New;"&gt;try-catch&lt;/span&gt;) o delegarne la responsabilità della gestione alla classe che ha invocato il metodo(tramite il costrutto &lt;span style="font-family: Courier New;"&gt;throws&lt;/span&gt;).
Quest'ultima classe può gestirla o a sua volta sollevare l'eccezione
alla classe da cui è stata invocata. Un altro esempio di utilizzo di
questo design pattern è quello dell'utilizzo della classe &lt;span style="font-family: Courier New;"&gt;javax.servlet.Filter&lt;/span&gt; in un'applicazione web. Il metodo &lt;span style="font-family: Courier New;"&gt;chain.doFilter()&lt;/span&gt;
viene richiamato per fare in modo che tutti i filtri di una servlet
possano processare una richiesta prima che essa venga processata dalla
stessa servlet. Se un solo filtro della catena blocca la richiesta
allora la richiesta viene 'annullata' dal web container.&lt;br&gt;&lt;br&gt;Nel
nostro esempio useremo il design pattern Chain of Responsability per
creare una semplice applicazione (a scopo puramente didattico) che
determina se una data nel formato (&lt;i&gt;"yyyy"&lt;/i&gt; &lt;i&gt;"mm"&lt;/i&gt; &lt;i&gt;"dd"&lt;/i&gt;) è corretta. I requisiti di correttezza sono che &lt;br&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;i&gt;"yyyy"&lt;/i&gt; &lt;i&gt;"mm"&lt;/i&gt; &lt;i&gt;"dd"&lt;/i&gt; rappresentino interi, &lt;br&gt;&lt;/li&gt;&lt;li&gt;1&amp;lt;=&lt;i&gt;mm&lt;/i&gt;&amp;gt;=12&lt;/li&gt;&lt;li&gt;1&amp;lt;=&lt;i&gt;dd&lt;/i&gt;&amp;gt;=31, 1&amp;lt;=&lt;i&gt;dd&lt;/i&gt;&amp;gt;=30&amp;nbsp; per i mesi &lt;i&gt;aprile&lt;/i&gt;, &lt;i&gt;giugno&lt;/i&gt;, &lt;i&gt;settembre&lt;/i&gt; e &lt;i&gt;novembre&lt;/i&gt;, 1&amp;lt;=&lt;i&gt;dd&lt;/i&gt;&amp;gt;=29 se mm=02 negli anni bisestili, 1&amp;lt;=&lt;i&gt;dd&lt;/i&gt;&amp;gt;=28 se mm=02 negli anni non bisestili&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Nel seguente listato tali controlli vengono affidati ad una &lt;i&gt;catena di oggetti&lt;/i&gt;,
ognuno dei quali verifica che sia verificato un requisito specifico. Se
uno solo di tali oggetti rivela che la data non è correttamente
definita è inutile continuare nei controlli.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;package &lt;/span&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;designPatterns.&lt;/a&gt;&lt;span style="font-family: Courier New;"&gt;chainofresponsability;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;public class Main {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String[] args) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyDate myDate = new MyDate("1981", "13", "6");&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IsNumericFilter isNumericFilter = new IsNumericFilter();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MonthFilter monthFilter = new MonthFilter();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DayFilter dayFilter = new DayFilter();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; isNumericFilter.doChain(monthFilter);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; monthFilter.doChain(dayFilter);&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;isNumericFilter.doFilter(myDate);&lt;/b&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;class MyDate{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String year;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String month;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String day;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public MyDate(String y, String m, String d) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.year = y;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.month = m;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.day = d;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getDay() {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return day;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getMonth() {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return month;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getYear() {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return year;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;abstract class MyDateFilter{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected MyDateFilter successorMyDateFilter;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected String wrongDate = "Data non corretta";&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected String okDate = "Data corretta!!";&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void &lt;b&gt;doChain&lt;/b&gt;(MyDateFilter successor){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.successorMyDateFilter=successor;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public abstract void &lt;b&gt;doFilter&lt;/b&gt;(MyDate myDate);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;class IsNumericFilter extends MyDateFilter{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void doFilter(MyDate myDate) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!isNumeric(myDate.getYear()) ||&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !isNumeric(myDate.getMonth()) ||&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !isNumeric(myDate.getDay()))&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(wrongDate);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;successorMyDateFilter.doFilter(myDate);&lt;/b&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private boolean isNumeric(String param){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Integer.parseInt(param);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }catch(NumberFormatException e){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;class MonthFilter extends MyDateFilter{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void doFilter(MyDate myDate) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String mString = myDate.getMonth();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int month = Integer.parseInt(mString);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(month&amp;lt;1 || month&amp;gt;12)&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(wrongDate);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;successorMyDateFilter.doFilter(myDate);&lt;/b&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;class DayFilter extends MyDateFilter{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void doFilter(MyDate myDate) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String dString = myDate.getDay();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String mString = myDate.getMonth();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String yString = myDate.getYear();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int year = Integer.parseInt(yString);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int day = Integer.parseInt(dString);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(day&amp;lt;1 || day&amp;gt;31)&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(wrongDate);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if(isShortMonth(mString) &amp;amp;&amp;amp; dString.equals("31"))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(wrongDate);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if(mString.equals("2")){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(new java.util.GregorianCalendar().isLeapYear(year)){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(day&amp;gt;29)&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(wrongDate);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else if(day&amp;gt;28)&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(wrongDate);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(okDate);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private boolean isShortMonth(String mString){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int month = Integer.parseInt(mString);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(month==4 || month==6 || month==9 || month==11)&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt; 

 
 
 
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-3033549188514193540?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wUZOSam4JYPrdgyPG7atR2LzPPU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wUZOSam4JYPrdgyPG7atR2LzPPU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wUZOSam4JYPrdgyPG7atR2LzPPU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wUZOSam4JYPrdgyPG7atR2LzPPU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/xYSnuv8VdyY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/3033549188514193540/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=3033549188514193540" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/3033549188514193540?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/3033549188514193540?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/xYSnuv8VdyY/chain-of-responsability-design-pattern.html" title="Chain-Of-Responsability Design Pattern" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2008/11/chain-of-responsability-design-pattern.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQNR3g-fip7ImA9WxRUGEU.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-6470307095940975197</id><published>2008-11-28T15:17:00.005+01:00</published><updated>2008-11-28T15:26:36.656+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-28T15:26:36.656+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software design" /><title>Iterator Design Pattern</title><content type="html"> 

 
 
 
&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;b&gt;&lt;span style="color: rgb(204, 0, 0); font-family: Verdana;"&gt;ITERATOR DESIGN PATTERN&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: Verdana;"&gt;:&lt;/span&gt;&lt;br style="font-family: Verdana;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;Obiettivo:
fornire un meccanismo che permetta di 'esplorare' una lista di
collection o oggetti aggregati senza conoscerne la rappresentazione
interna.&lt;br&gt;&lt;br&gt;Nel nostro esempio useremo il pattern Iterator per stampare sullo standard output una lista di stringhe.&lt;a style="font-family: Verdana;" name="#top"&gt;&lt;/a&gt;&lt;a style="font-family: Verdana;" name="#top"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&lt;/a&gt;&lt;br&gt;&lt;div style="text-align: left;"&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;package designPatterns.iterator;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;interface StringListIterator {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void first();&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void next();&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public boolean isDone();&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String currentString();&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;}&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;class StringList {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String[] strings;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int currIndex;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int size;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public StringList(int size) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strings = new String[size];&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currIndex = 0;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.size = size;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int count() {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return currIndex;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void append(String titleIn) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (currIndex &amp;gt;= size) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String[] tempArray = new String[size];&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; size; i++) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tempArray[i] = strings[i];&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strings = null;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size = size + 1;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strings = new String[size];&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; size - 1; i++) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strings[i] = tempArray[i];&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strings[currIndex++] = titleIn;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void delete(String titleIn) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boolean found = false;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; (currIndex - 1); i++) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (found == false) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (strings[i].equals(titleIn)) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; found = true;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strings[i] = strings[i + 1];&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i &amp;lt; (currIndex - 1)) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strings[i] = strings[i + 1];&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strings[i] = null;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (found == true) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --currIndex;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public StringListIterator createIterator() {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new InnerIterator();&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private class InnerIterator&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; implements StringListIterator {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int pos = 0;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private InnerIterator() {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void first() {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos = 0;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void next() {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pos &amp;lt; (currIndex)) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++pos;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public boolean isDone() {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pos &amp;gt;= (currIndex)) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String currentString() {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return strings[pos];&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;}&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;public class Main {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String[] args) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringList strings = new StringList(3);&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strings.append("string1");&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strings.append("string2");&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strings.append("string3");&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringListIterator iterator =&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strings.createIterator();&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!iterator.isDone()) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String curr = iterator.currentString();&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(curr);&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iterator.next();&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strings.delete("string1");&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(" ");&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iterator.first();&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!iterator.isDone()) {&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String curr = iterator.currentString();&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(curr);&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iterator.next();&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;}&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&lt;/a&gt;Le
API standard di Java forniscono un meccanismo built-in che facilita
l'uso del pattern Iterator. Ogni oggetto che implementa
java.util.AbstractList (es.: Vector e ArrayList tanto per fare i nomi
di due classi ampiamente usate nella programmazione java), esporta il
metodo public java.util.Iterator iterator() che corrisponde, per
funzionalità, al metodo public StringListIterator createIterator()
della classe StringList dell'esempio appena visto. Facendo uso
dell'interfaccia java.util.Iterator avremmo ottenuto il seguente
listato:&lt;a style="font-family: Verdana;" name="#top"&gt;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Verdana;" name="#top"&gt;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Verdana;" name="#top"&gt;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;import java.util.*;&lt;/a&gt;&lt;br style="font-family: Courier New;"&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;public class Main {&lt;/a&gt;&lt;br style="font-family: Courier New;"&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&lt;/a&gt;&lt;div style="margin-left: 40px; font-family: Courier New; text-align: left;"&gt;&lt;a name="#top"&gt; public static void main(String[] args) {&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New; text-align: left;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;a name="#top"&gt; ArrayList strings = new ArrayList(3);&lt;/a&gt;&lt;br&gt;&lt;a name="#top"&gt; strings.add("string1");&lt;/a&gt;&lt;br&gt;&lt;a name="#top"&gt; strings.add("string2");&lt;/a&gt;&lt;br&gt;&lt;a name="#top"&gt; strings.add("string3");&lt;/a&gt;&lt;br&gt;&lt;a name="#top"&gt; Iterator iterator = strings.iterator();&lt;/a&gt;&lt;br&gt;&lt;a name="#top"&gt; while (iterator.hasNext()) {&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New; text-align: left;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;a name="#top"&gt; String next = (String)iterator.next();&lt;/a&gt;&lt;br&gt;&lt;a name="#top"&gt; System.out.println(next);&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New; text-align: left;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;a name="#top"&gt; }&lt;/a&gt;&lt;br&gt;&lt;a name="#top"&gt; strings.remove("string1");&lt;/a&gt;&lt;br&gt;&lt;a name="#top"&gt; System.out.println(" ");&lt;/a&gt;&lt;br&gt;&lt;a name="#top"&gt; iterator = strings.iterator();&lt;/a&gt;&lt;br&gt;&lt;a name="#top"&gt; while (iterator.hasNext()) {&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New; text-align: left;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;a name="#top"&gt; String next = (String)iterator.next();&lt;/a&gt;&lt;br&gt;&lt;a name="#top"&gt; System.out.println(next);&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New; text-align: left;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;a name="#top"&gt; }&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New; text-align: left;"&gt;&lt;a name="#top"&gt; }&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New; text-align: left;"&gt;&lt;a name="#top"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;} &amp;nbsp;&lt;/a&gt;&lt;br&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&lt;/a&gt;&lt;br style="font-family: Courier New;"&gt;&lt;a style="font-family: Courier New;" name="#top"&gt;&lt;/a&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;Si noti che, es&lt;/span&gt;sendo
Iterator una classe di uso generico (applicabile ad aggregati di
Oggetti di qualsiasi tipo), è necessario effettuare il cast a String
dell'Object ritornato dal metodo iterator.next(). Nel nostro esempio il
cast non è necessario perchè abbiamo definito un Iterator ad hoc il cui
metodo currentString() ritorna una Stringa.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-6470307095940975197?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BV2U8UOsJG_-e37rpbIU3n03LgY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BV2U8UOsJG_-e37rpbIU3n03LgY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BV2U8UOsJG_-e37rpbIU3n03LgY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BV2U8UOsJG_-e37rpbIU3n03LgY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/obVEekaL4QQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/6470307095940975197/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=6470307095940975197" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/6470307095940975197?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/6470307095940975197?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/obVEekaL4QQ/iterator-design-pattern.html" title="Iterator Design Pattern" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2008/11/iterator-design-pattern.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQNR3g-fip7ImA9WxRUGEU.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-3432028782412201606</id><published>2008-11-28T15:17:00.003+01:00</published><updated>2008-11-28T15:26:36.656+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-28T15:26:36.656+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software design" /><title>Observer Design Pattern</title><content type="html"> 

 
 
 
&lt;b style="color: rgb(204, 0, 0);"&gt;OBSERVER DESIGN PATTERN&lt;/b&gt;:&lt;br&gt;&lt;div style="text-align: justify;"&gt;Obiettivo: modificare lo stato di un oggetto in conseguenza del cambiamento dello stato di un altro oggetto.&lt;br&gt;&lt;br&gt;Questo
pattern è usato soprattutto nelle applicazioni GUI, definendo per
esempio una relazione uno-a-uno o uno-a-molti tra oggetti swing tale
che quando cambia lo stato di uno, lo stato di uno o piu altri cambia
in modo automatico. Nel nostro esempio useremo il Pattern Observer
(noto anche come &lt;b&gt;&lt;i&gt;Publish&lt;/i&gt;-&lt;i&gt;Subscribe&lt;/i&gt;&lt;/b&gt;) nella
creazione di un'applicazione GUI in cui è definito un JFrame (Observer)
che visualizza le stringe inserite dall'utente mediante standard input
(Observable). La prima classe implementa &lt;b&gt;Observer&lt;/b&gt;, la seconda estende &lt;b&gt;Observable&lt;/b&gt;, due classi presenti nelle API standard in java.util.&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;package &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;designPatterns.observer&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;import java.io.*;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;import java.util.*;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;import javax.swing.*;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;import java.awt.event.*;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;public class Main {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String args[]) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InputConsole input = new InputConsole();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OutputForm output = new OutputForm();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;input.addObserver(output);&lt;/b&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; input.read();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;class OutputForm extends JFrame implements &lt;b&gt;Observer&lt;/b&gt; {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; JTextField display;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public OutputForm() {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; display = new JTextField(10);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; getContentPane().add(display);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setTitle("Observer form");&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setSize(200, 100);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setLocation(200, 100);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setVisible(true);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //exit when closing application&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addWindowListener(new WindowAdapter() {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void windowClosing(WindowEvent e) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.exit(0);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;public void update(Observable ob, Object o)&lt;/b&gt; {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (o instanceof String) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String text = (String) o;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; display.setText(text);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;class InputConsole extends &lt;b&gt;Observable&lt;/b&gt; {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void read() {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BufferedReader br = new BufferedReader(new InputStreamReader(System.in));&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String inputString;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!(inputString = br.readLine()).equals("exit")) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;setChanged();&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; notifyObservers(inputString);&lt;/span&gt;&lt;/b&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.exit(0);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IOException e) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-3432028782412201606?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OEhUPOZlvWxPJX-upBdtJj06QcQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OEhUPOZlvWxPJX-upBdtJj06QcQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OEhUPOZlvWxPJX-upBdtJj06QcQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OEhUPOZlvWxPJX-upBdtJj06QcQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/53FaUZqzTtA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/3432028782412201606/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=3432028782412201606" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/3432028782412201606?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/3432028782412201606?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/53FaUZqzTtA/observer-design-pattern.html" title="Observer Design Pattern" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2008/11/observer-design-pattern.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQNR3g-fyp7ImA9WxRUGEU.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-7937703789095205340</id><published>2008-11-28T15:17:00.001+01:00</published><updated>2008-11-28T15:26:36.657+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-28T15:26:36.657+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software design" /><title>Adapter Design Pattern</title><content type="html"> 

 
 
 
&lt;b&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;ADAPTER DESIGN PATTERN&lt;/span&gt;&lt;/b&gt;:&lt;br&gt;&lt;div style="text-align: justify;"&gt;Obiettivo:
convertire una interfaccia esistente in una nuova interfaccia per
ottenere compatibilità e riusabilità di classi non correlate in un'
applicazione.&lt;br&gt;&lt;br&gt;Nelle API java standard le classi che implementano
il pattern Adapter sono facilmente riconoscibili (WindowAdapter,
ComponentAdapter, MouseAdapter,...) . Come noto l'interfaccia &lt;i&gt;WindowListener&lt;/i&gt; ha sette metodi:&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;public interface Windowlistener {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; public void windowClosed(WindowEvent e);&lt;br&gt; public void windowOpened(WindowEvent e);&lt;br&gt; public void windowIconified(WindowEvent e);&lt;br&gt; public void windowDeiconified(WindowEvent e);&lt;br&gt; public void windowActivated(WindowEvent e);&lt;br&gt; public void windowDeactivated(WindowEvent e);&lt;br&gt; public void windowClosing(WindowEvent e);&lt;br&gt;&lt;/div&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;Qualsiasi classe che implementa &lt;i&gt;WindowListener&lt;/i&gt; dovrebbe necessariamente definire il contenuto di tutti questi metodi. La classe &lt;i&gt;WindowAdapter&lt;/i&gt; implementa questa interfaccia con metodi tutti vuoti:&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;class WindowAdapter implements WindowListener{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void windowClosed(WindowEvent e){}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void windowOpened(WindowEvent e){}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void windowIconified(WindowEvent e){}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void windowDeiconified(WindowEvent e){}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void windowActivated(WindowEvent e){}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void windowDeactivated(WindowEvent e){}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void windowClosing(WindowEvent e){}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;In questo modo in un'applicazione GUI, per esempio, una classe che ha bisogno di intercettare &lt;b&gt;solo&lt;/b&gt;
l'evento chiusura della finestra in cui è inserito un JFrame non deve
implementare tutti i metodi presenti in WindowListener, ma solo il
metodo &lt;span style="font-family: Courier New;"&gt;public void windowClosed(WindowEvent e){}&lt;span style="font-family: Verdana;"&gt; tramite la tecnica nota come&lt;/span&gt;&lt;/span&gt; &lt;b&gt;&lt;i&gt;Overriding&lt;/i&gt;&lt;/b&gt;.&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;class WindowClosingListener extends JFrame {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp; public WindowClosingListener () {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setSize(200, 200);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setVisible(true);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addWindowListener(&lt;b&gt;new WindowAdapter()&lt;/b&gt; {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;@Override&lt;/b&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void windowClosing(WindowEvent e) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("Closing event caught");&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.exit(0);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String[] args) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new WindowClosingListener();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;Un'altra applicazione di questo pattern (noto anche come &lt;i&gt;&lt;b&gt;Wrapper&lt;/b&gt;&lt;/i&gt;)
è il riuso di classi e creazione di nuove classi compatibili con quelle
già esistenti. Usando la composizione, per esempio, si potrebbe &lt;i&gt;'adattare'&lt;/i&gt;
una classe già implementata e ben testata ad un nuovo sistema. La
classe Adapter dovrà dichiarare tale classe gia esistente come
variabile, tramite il meccanismo della composizione, e 'wrapparla' o
'fonderla' in se stessa.&lt;br&gt;&lt;/div&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;import java.util.Date;&lt;br&gt;public class DataAdapter {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Date date;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DataAdapter() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date = new Date();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DataAdapter(long date) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.date = new Date(date);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setMillisecondi(long time) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date.setTime(time);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public long getMillisecondi() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return date.getTime();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int &lt;b&gt;confronta&lt;/b&gt;(DataAdapter anotherDate) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return date.&lt;b&gt;compareTo&lt;/b&gt;(new Date(anotherDate.getMillisecondi()));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public boolean prima(DataAdapter when) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return date.before(new Date(when.getMillisecondi()));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public boolean dopo(DataAdapter when) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return date.after(new Date(when.getMillisecondi()));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String toString() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return date.toString();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;La classe DataAdapter può essere usata nel seguente modo:&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main(String args[]) {&lt;/span&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataAdapter data1 = new DataAdapter(1225446691789l);&lt;/span&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataAdapter data2 = new DataAdapter(1225445322893l);&lt;/span&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (data1.&lt;b&gt;confronta&lt;/b&gt;(data2) == 0) {&lt;/span&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("Le date coincidono");&lt;/span&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else if (data1.confronta(data2) &amp;gt; 0) {&lt;/span&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(data1 + " &amp;gt; " + data2);&lt;/span&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;/span&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(data1 + " &amp;lt; " + data2);&lt;/span&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-7937703789095205340?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HWb-yZbR7_-f3ZXYDwHqVFCC5QI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HWb-yZbR7_-f3ZXYDwHqVFCC5QI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HWb-yZbR7_-f3ZXYDwHqVFCC5QI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HWb-yZbR7_-f3ZXYDwHqVFCC5QI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/rXEcQtiepyU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/7937703789095205340/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=7937703789095205340" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/7937703789095205340?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/7937703789095205340?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/rXEcQtiepyU/adapter-design-pattern.html" title="Adapter Design Pattern" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2008/11/adapter-design-pattern.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQNR3g-fyp7ImA9WxRUGEU.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-7979578212003958902</id><published>2008-11-28T15:16:00.001+01:00</published><updated>2008-11-28T15:26:36.657+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-28T15:26:36.657+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software design" /><title>Singleton Design Pattern</title><content type="html">&lt;b style="color: rgb(204, 0, 0);"&gt;SINGLETON DESIGN PATTERN&lt;/b&gt;:&lt;br&gt;&lt;div style="text-align: justify;"&gt;Obiettivo: avere una sola istanza di una classe o un unico valore accessibile e modificabile in tutta l'applicazione.&lt;br&gt;&lt;br&gt;Questo
pattern può essere usato per esempio quando si vuole avere all'interno
di un'applicazione un unica classe che gestisca tutte le interazioni
con il file system, un unico spooler di stampa, un unico Logger,
un'unica connessione ad un DB, un unico socket di Input/Output, etc...
Nel nostro esempio useremo il Pattern Singleton per avere un unica
connessione ad un DB MySQL, ciò garantirà evidentemente un incremento
nelle performance dell'applicazione in quanto la creazione e
distruzione di una connessione ad un DB sono notoriamente operazioni
dispendiose.&lt;br&gt;&lt;br&gt;Per avere una classe che rispetti il pattern Singleton è necessario
definire le sue variabili o metodi pubblici e/o statici, e firmare
tutti i costruttori privati, per impedire alla JVM di crearne
un'istanza di default. Un noto esempio di classe Singleton è &lt;span style="font-family: Courier New;"&gt;java.lang.Math&lt;/span&gt;, la quale non estensibile.&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;package designPatterns.singleton;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;import java.sql.*;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;public class Main {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; public static void main(String[] args) throws Exception {&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; DatabaseReader reader = new DatabaseReader("select ...");&lt;br&gt; reader.request();&lt;br&gt; DatabaseWriter writer = new DatabaseWriter("update ...");&lt;br&gt; writer.request();&lt;br&gt; &lt;b&gt;MyDBConnector.getConnector().close();&lt;/b&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; }&lt;br&gt;&lt;/div&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;class DatabaseReader{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; String request;&lt;br&gt; public DatabaseReader(String request) {&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; this.request = request;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; }&lt;br&gt; public String request() throws Exception{&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; String ret = "";&lt;br&gt; MyDBConnector connector = MyDBConnector.getConnector();&lt;br&gt; Connection conn = &lt;b&gt;connector.getConnention()&lt;/b&gt;;&lt;br&gt; Statement st = conn.createStatement();&lt;br&gt; ResultSet rs = st.executeQuery(request);&lt;br&gt; //build ret according to rs&lt;br&gt; return ret;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; }&lt;br&gt;&lt;/div&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;class DatabaseWriter{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; String request;&lt;br&gt; public DatabaseWriter(String request) {&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; this.request = request;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; }&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; public void request() throws Exception{&lt;br&gt; MyDBConnector connector = MyDBConnector.getConnector();&lt;br&gt; Connection conn = &lt;b&gt;connector.getConnention()&lt;/b&gt;;&lt;br&gt; conn.createStatement().executeUpdate(request);&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; }&lt;br&gt;&lt;/div&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;class MyDBConnector{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; &lt;b&gt;private static MyDBConnector instance;&lt;br&gt; private Connection conn;&lt;/b&gt;&lt;br&gt; private static final String url = "jdbc:mysql://...";&lt;br&gt; private static final String usr = "...";&lt;br&gt; private static final String pwd = "...";&lt;br&gt; &lt;b&gt;private MyDBConnector()&lt;/b&gt; throws Exception{&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; Class.forName("com.mysql.jdbc.Driver");&lt;br&gt; conn = (Connection) DriverManager.getConnection(url,usr,pwd);&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; }&lt;br&gt; &lt;b&gt;public static MyDBConnector getConnector()&lt;/b&gt; throws Exception {&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; &lt;b&gt;if(instance==null)&lt;/b&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt; instance = new MyDBConnector();&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; return instance;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; }&lt;br&gt; public Connection &lt;b&gt;getConnention()&lt;/b&gt;{&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; return conn;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; }&lt;br&gt; public void close(){&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; if(conn!=null)&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt; try{&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt; conn.close();&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt; }catch(Exception e){}&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; instance = null;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; }&lt;br&gt;&lt;/div&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;Nel nostro caso la classe Singleton è MyDBConnector. Tale classe è &lt;b&gt;&lt;i&gt;non &lt;/i&gt;&lt;i&gt;Thread-Safe&lt;/i&gt;&lt;/b&gt; infatti nel metodo &lt;span style="font-family: Courier New;"&gt;public static MyDBConnector getConnector() throws Exception&lt;/span&gt; due o piu thread potrebbero eseguire l'istruzione &lt;span style="font-family: Courier New;"&gt;instance = new MyDBConnector();&lt;/span&gt;. Per aggirare questo problema è buona prassi utilizzare la calusola &lt;span style="font-family: Courier New;"&gt;synchronized&lt;/span&gt;:&lt;br&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;public static &lt;b style="font-family: Courier New;"&gt;synchronized&lt;/b&gt; MyDBConnector getConnector() throws Exception {...}&lt;/span&gt;&lt;br&gt;&lt;br&gt;tuttavia
questa soluzione potrebbe decrementare le performance dell'esecuzione
dell'applicazione di un fattore non indifferente. E' ragionevole
sincronizzare le richieste solo se l'istanza del Singleton è nulla. La
soluzione definitiva è dunque:&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;public static MyDBConnector getConnector() throws Exception {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; if(instance==null)&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; &lt;b&gt;synchronized&lt;/b&gt; (MyDBConnector.class) {&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt; if(instance==null)&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt; instance = new MyDBConnector();&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; }&lt;br&gt;&lt;/div&gt; return instance;&lt;br&gt;&lt;/div&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt; 

 
 
 
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-7979578212003958902?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GA-5s0NUHlgddL6VBqzJG1EY8jg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GA-5s0NUHlgddL6VBqzJG1EY8jg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GA-5s0NUHlgddL6VBqzJG1EY8jg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GA-5s0NUHlgddL6VBqzJG1EY8jg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/cvj3nAjGu6M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/7979578212003958902/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=7979578212003958902" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/7979578212003958902?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/7979578212003958902?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/cvj3nAjGu6M/singleton-design-pattern.html" title="Singleton Design Pattern" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2008/11/singleton-design-pattern.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMHRXw-cCp7ImA9WxRVFUs.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-4009653560680310107</id><published>2008-11-11T17:59:00.001+01:00</published><updated>2008-11-13T09:53:54.258+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-13T09:53:54.258+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jee" /><title>Container Managed Transaction</title><content type="html">

    
    
    


    
    
    


    
    
    


    
    
    


    
    
    
 

    
    
    
&lt;font style="color: rgb(255, 0, 0);" size="4"&gt;INTRODUZIONE&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;Nella teoria dei database si definisce &lt;i&gt;transazione&lt;/i&gt; un programma in esecuzione (&lt;i&gt;processo&lt;/i&gt;) che opera su un DB.&amp;nbsp; Classici esempi di transazioni sono la prenotazione di un volo aereo o un bonifico bancario. La corretta prenotazione di un volo aereo richiede che:&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;venga prenotato un posto sull' aereo &lt;b&gt;e&lt;/b&gt; &lt;b&gt;contestualmente&lt;/b&gt; che venga effettuato il pagamento; se una delle due operazioni fallisce anche l'altra deve essere annullata (Atomicità),&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;dopo la prenotazione sia verificato, tra l'altro, chela somma dei posti liberi e quelli occupati rimanga &lt;b&gt;invariata&lt;/b&gt; (Coerenza),&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;sia possibile eseguire una nuova prenotazione aerea parallelamente ad essa e che l'eventuale fallimento di quest'ultima &lt;b&gt;non influisca&lt;/b&gt; sull'esito della nuova prenotazione (Isolamento),&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;dopo la prenotazione sia &lt;b&gt;garantito&lt;/b&gt; al passeggero che il posto non venga assegnato ad un altro passeggero fino all'imbarco (Durabilità).&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;I quattro requisiti enumerati sono esempi di proprietà che una qualunque transazione dovrebbe avere e che sono raggruppate nell'acronimo &lt;i&gt;&lt;b&gt;ACID&lt;/b&gt;&lt;/i&gt;.&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;b&gt;A&lt;/b&gt;tomicità: la transazione deve essere eseguita nella sua interezza o non eseguita per niente, non sono ammesse esecuzioni parziali;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;b&gt;C&lt;/b&gt;oerenza (o Consistenza): la transazione inizia e finisce trovando e lasciando il database in uno stato consistente, uno stato in cui i dati presenti nel database non violano eventuali vincoli di integrità;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;b&gt;I&lt;/b&gt;solamento: ogni transazione deve essere eseguita in modo indipendente dalle altre e non devono essere visibili i suoi risultati intermedi. L'eventuale fallimento di una non deve influire sul buon esito delle altre;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;b&gt;D&lt;/b&gt;urabilità (o Persistenza): una volta che una transazione è finita i suoi effetti devono perdurare nel tempo.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;Un discorso a parte meriterebbe la proprietà di isolamento, qui ci limitiamo solo a definire brevemente i quattro livelli previsti di &lt;b&gt;isolamento&lt;/b&gt; con semplici esempi&lt;b&gt;:&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;b&gt;read uncommitted&lt;/b&gt;:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;consente l'accesso in lettura, bloccando la scrittura, a dati che potrebbero essere modificati da transazioni parallele&lt;/li&gt;&lt;li&gt;in questo modo potrebbero verificarsi letture &lt;i&gt;sporche&lt;/i&gt;, letture di dati che portebbero sparire in futuro se la transazione che li ha generati abortisce&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div style="margin-left: 40px; text-align: justify;"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; text-align: justify;"&gt;&lt;div style="margin-left: 40px;"&gt;per esempio consideriamo le seguenti operazioni effettuate dalle transazioni T1 e T2 in ordine cronologico:&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; text-align: justify;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;br&gt;&lt;br&gt;&lt;table style="text-align: left; margin-left: 0px; margin-right: 0px;" class="" id="rice" border="1" cellpadding="3" cellspacing="0" height="130" width="321"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;" width="20%"&gt;T1&lt;br&gt;&lt;/td&gt;&lt;td style="text-align: center;" width="20%"&gt;T2&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;span class="kw1"&gt;insert into mytable(&lt;/span&gt;&lt;span class="kw1"&gt;id, name&lt;/span&gt;&lt;span class="kw1"&gt;)&amp;nbsp; values('1','xxx');&lt;/span&gt;&lt;br&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;br&gt;&lt;/td&gt;&lt;td valign="top"&gt;select * from mytable where id=1;&lt;span class="kw1"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;rollback&lt;/td&gt;&lt;td valign="top"&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;br&gt;T2 ha avuto accesso ad un dato che non è mai esistito!&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; text-align: justify;"&gt;&lt;br&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;b&gt;read committed&lt;/b&gt;:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;prevede il rilascio dei dati in lettura, ritardando quelli in scrittura&lt;/li&gt;&lt;li&gt;si potrebbe verificare il problema delle&lt;i&gt; letture non-ripetibili&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; text-align: justify;"&gt;per esempio consideriamo la seguente situazione&lt;br&gt;&lt;br&gt;&lt;table style="text-align: left; margin-left: 0px; margin-right: 0px;" class="" id="rice" border="1" cellpadding="3" cellspacing="0" height="162" width="315"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;" width="20%"&gt;T1&lt;br&gt;&lt;/td&gt;&lt;td style="text-align: center;" width="20%"&gt;T2&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;select * from mytable where id=1;&lt;br&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;br&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;span class="kw1"&gt;update mytable set mycolumn=1 where id=1;&lt;br&gt;commit;&lt;br&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;select * from mytable where id=1;&lt;/td&gt;&lt;td valign="top"&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;br&gt;due letture consecutive di una stessa riga da parte di T1 producono risultati diversi&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;b&gt;repeatable read&lt;/b&gt;:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;vengono bloccati gli accessi sia in lettura che in scrittura ma solo delle tuple coinvolte&lt;/li&gt;&lt;li&gt;si potrebbe verificare il problema dei &lt;i&gt;fantasmi&lt;/i&gt;:&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 80px; text-align: justify;"&gt;per esempio consideriamo la seguente situazione&lt;br&gt;
&lt;br&gt;
&lt;table style="text-align: left; margin-left: 0px; margin-right: 0px;" class="" id="rice" border="1" cellpadding="0" cellspacing="0" height="194" width="312"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;" width="20%"&gt;T1&lt;br&gt;&lt;/td&gt;&lt;td style="text-align: center;" width="20%"&gt;T2&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;
      &lt;td valign="top"&gt;select * from mytable where age betwenn 10 AND 30;&lt;br&gt;
      &lt;/td&gt;
      &lt;td valign="top"&gt;&lt;br&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top"&gt;&lt;br&gt;
      &lt;/td&gt;
      &lt;td valign="top"&gt;&lt;span class="kw1"&gt;insert into mycolumn values(1,"mario",27);&lt;br&gt;
commit;&lt;br&gt;
      &lt;/span&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td valign="top"&gt;select * from mytable where age betwenn 10 AND 30;&lt;/td&gt;
      &lt;td valign="top"&gt;&lt;br&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; text-align: justify;"&gt;&lt;div style="margin-left: 40px;"&gt;
due query effettuate consecutivamente da T1 restituiscono un numero di righe diverse&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;b&gt;serializable&lt;/b&gt;:&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;garantisce isolamento totale, come se le transazioni vengono effettuate in sequenza&lt;/li&gt;&lt;li&gt;poco efficiente&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;&lt;br&gt;&lt;font style="color: rgb(255, 0, 0);" size="4"&gt;CONTAINER-MANAGED TRANSACTIONS (CMT)&lt;/font&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;In un session o message-driven bean si può delegare la gestione delle transazioni al EJB container. Questo facilita lo sviluppo di un EJB in quanto non bisogna definire esplicitamente quando inizia e finisce una una transazion&lt;i&gt;e&lt;/i&gt;. Tipicamente il container inizia una transazione prima di eseguire il contenuto di un metodo e la termina dopo aver eseguito l'ultima istruzione del metodo stesso. In questo modo una transazione corrisponde ad un metodo anche se non vale necessariamente il viceversa cioè che ad ogni metodo corrisponda una transazione. Negli EJB che implementano CMT non è possibile usare alcuna istruzione che interferisca con la gestione delle transazioni da parte del container, per esempio i metodi &lt;span style="font-family: Courier New;"&gt;commit&lt;/span&gt;, &lt;span style="font-family: Courier New;"&gt;setAutoCommit&lt;/span&gt; e &lt;span style="font-family: Courier New;"&gt;rollback&lt;/span&gt; di &lt;span style="font-family: Courier New;"&gt;java.sql.Connection&lt;/span&gt; e &lt;span style="font-family: Courier New;"&gt;commit&lt;/span&gt; e rollback di javax.jms.Session. Non è inoltre posisbile usare l'interfaccia &lt;span style="font-family: Courier New;"&gt;javax.transaction.UserTransaction&lt;/span&gt;. &lt;br&gt;&lt;br&gt;Dato un metodo che definisce una transazione è possibile controllare lo scope di tale transazione attraverso degli attributi&lt;br&gt;&lt;br&gt;&lt;img alt=""&gt;&lt;div id="itu9" style="padding: 1em 0pt; text-align: left;"&gt;&lt;img src="http://docs.google.com/File?id=dfkfxq22_16hn8pphdf_b" height="183" width="422"&gt;&lt;/div&gt;&lt;br&gt;&lt;img alt=""&gt;Data una situazione in cui &lt;span style="font-family: Courier New;"&gt;method-a()&lt;/span&gt; di &lt;span style="font-family: Courier New;"&gt;Bean-1&lt;/span&gt; inizia una transazione e invoca &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt; di &lt;span style="font-family: Courier New;"&gt;Bean-2&lt;/span&gt;, a seconda delle esigenze è necessario definire un attributo di transazione per &lt;span style="font-family: Courier New;"&gt;method-b(), per esempio se il container &lt;/span&gt;deve iniziare una nuova transazione in cui eseguire&amp;nbsp; &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt;. &lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Attributi di transazione&lt;/span&gt;&lt;br&gt;&lt;br&gt;L'attributo di transazione può assumere uno dei seguenti valori possibili:&lt;br&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Required&lt;/b&gt;: prevede che &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt; sia eseguito all'interno della transazione creata per &lt;span style="font-family: Courier New;"&gt;method-a()&lt;/span&gt;, se &lt;span style="font-family: Courier New;"&gt;method-a()&lt;/span&gt; non è associato ad alcuna transazione preesistente allora il container inizia una nuova transazione prima di eseguire &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt;. Required rappresenta l'attributo di default per CMT e in genere non si specifica se non quando si ha la necessità di sovrascrivere un'altro attributo di transazione.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;RequiresNew&lt;/b&gt;: prevede che quando &lt;span style="font-family: Courier New;"&gt;method-a()&lt;/span&gt; invoca &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt;, il container effettui i seguenti passi:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;sospende la transazione di &lt;span style="font-family: Courier New;"&gt;method-a()&lt;/span&gt;&lt;/li&gt;&lt;li&gt;inizia una nuova transazione&lt;/li&gt;&lt;li&gt;delega la chiamata a&lt;span style="font-family: Courier New;"&gt; method-b()&lt;/span&gt;&lt;/li&gt;&lt;li&gt;riesuma la transazione di &lt;span style="font-family: Courier New;"&gt;method-a()&lt;/span&gt; dopo che &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt; è stato completato&lt;/li&gt;&lt;/ol&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="margin-left: 40px;"&gt;Se &lt;span style="font-family: Courier New;"&gt;method-a()&lt;/span&gt; non è associato ad alcuna transazione, il container inizia in ogni caso una nuova transazione prima di eseguire il &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt;. Tipicamente si usa RequiresNew quando si vuole assicurare che &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt; sia eseguito sempre all'interno di una nuova transazione&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Mandatory&lt;/b&gt;: se &lt;span style="font-family: Courier New;"&gt;method-a()&lt;/span&gt; ha iniziato una transazione e invoca &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt;, il metodo viene eseguito all'interno della stessa transazione, altrimenti il container solleva una &lt;span style="font-family: Courier New;"&gt;TransactionRequiredException&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;NotSupported&lt;/b&gt;: se &lt;span style="font-family: Courier New;"&gt;method-a()&lt;/span&gt; ha iniziato una transazione prima di invocare &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt;, tale transazione viene sospesa e ripresa&amp;nbsp; dopo che &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt; viene terminato. Se &lt;span style="font-family: Courier New;"&gt;method-a()&lt;/span&gt; non ha iniziato alcuna transazione, il container non ne crea una nuova. Questo attributo viene usato quando &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt; non ha necessità di gestire una transazione. Considerando che in genere l'uso delle transazioni è molto costoso in termini di risorse, l'attributo NotSupported potrebbe incrementare le performance.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Suports&lt;/b&gt;: se &lt;span style="font-family: Courier New;"&gt;method-a()&lt;/span&gt; ha iniziato una transazione prima di invocare &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt;, tale metodo viene eseguito all'interno della stessa transazione; viceversa &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt; non viene eseguito all'interno di una transazione. Considerando che il comportamento del container nell'esecuzione di &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt; può variare, è necessario usare questo attributo con molta cautela.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Never&lt;/b&gt;: se &lt;span style="font-family: Courier New;"&gt;method-a()&lt;/span&gt; ha iniziato una transazione prima di invocare &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt;, il container solleva un'eccezione &lt;span style="font-family: Courier New;"&gt;RemoteException&lt;/span&gt;, altrimenti il container non inizia una nuova transazione prima di eseguire &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;La seguente tabella riassume gli effetti dell'utilizzo dei vari attributi di transazione. &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table style="text-align: left; margin-left: 0px; margin-right: auto; width: 348px; height: 322px;" id="wp84485" summary="Transaction Attributes and Scope" border="1"&gt;&lt;tbody&gt;&lt;tr align="middle"&gt;
&lt;th&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19155"&gt;&lt;/a&gt;&lt;a name="wp84491"&gt;&lt;/a&gt;
&lt;div style="text-align: justify;" class="pCellHeading"&gt;Transaction Attribute &lt;/div&gt;&lt;/th&gt;
&lt;th&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19156"&gt;&lt;/a&gt;&lt;a name="wp84493"&gt;&lt;/a&gt;
&lt;div style="text-align: left;" class="pCellHeading"&gt;Client's Transaction &lt;/div&gt;&lt;/th&gt;
&lt;th&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19157"&gt;&lt;/a&gt;&lt;a name="wp84495"&gt;&lt;/a&gt;
&lt;div class="pCellHeading"&gt;Business Method's Transaction &lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;tr align="left"&gt;
&lt;td rowspan="2"&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19158"&gt;&lt;/a&gt;&lt;a name="wp84497"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;&lt;code class="cCode"&gt;Required&lt;br&gt;&lt;br&gt;&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19159"&gt;&lt;/a&gt;&lt;a name="wp84499"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;None &lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19160"&gt;&lt;/a&gt;&lt;a name="wp84501"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;T2 &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="left"&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19161"&gt;&lt;/a&gt;&lt;a name="wp84505"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;T1 &lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19162"&gt;&lt;/a&gt;&lt;a name="wp84507"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;T1 &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="left"&gt;
&lt;td rowspan="2"&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19163"&gt;&lt;/a&gt;&lt;a name="wp84509"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;&lt;code class="cCode"&gt;RequiresNew&lt;br&gt;&lt;br&gt;&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19164"&gt;&lt;/a&gt;&lt;a name="wp84511"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;None &lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19165"&gt;&lt;/a&gt;&lt;a name="wp84513"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;T2 &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="left"&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19166"&gt;&lt;/a&gt;&lt;a name="wp84517"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;T1 &lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19167"&gt;&lt;/a&gt;&lt;a name="wp84519"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;T2 &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="left"&gt;
&lt;td rowspan="2"&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19168"&gt;&lt;/a&gt;&lt;a name="wp84521"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;&lt;code class="cCode"&gt;Mandatory&lt;br&gt;&lt;br&gt;&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19169"&gt;&lt;/a&gt;&lt;a name="wp84523"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;None &lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19170"&gt;&lt;/a&gt;&lt;a name="wp84525"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;error &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="left"&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19171"&gt;&lt;/a&gt;&lt;a name="wp84529"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;T1 &lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19172"&gt;&lt;/a&gt;&lt;a name="wp84531"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;T1 &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="left"&gt;
&lt;td rowspan="2"&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19173"&gt;&lt;/a&gt;&lt;a name="wp84533"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;&lt;code class="cCode"&gt;NotSupported&lt;br&gt;&lt;br&gt;&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19174"&gt;&lt;/a&gt;&lt;a name="wp84535"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;None &lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19175"&gt;&lt;/a&gt;&lt;a name="wp84537"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;None &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="left"&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19176"&gt;&lt;/a&gt;&lt;a name="wp84541"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;T1 &lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19177"&gt;&lt;/a&gt;&lt;a name="wp84543"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;None &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="left"&gt;
&lt;td rowspan="2"&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19178"&gt;&lt;/a&gt;&lt;a name="wp84545"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;&lt;code class="cCode"&gt;Supports&lt;br&gt;&lt;br&gt;&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19179"&gt;&lt;/a&gt;&lt;a name="wp84547"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;None &lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19180"&gt;&lt;/a&gt;&lt;a name="wp84549"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;None &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="left"&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19181"&gt;&lt;/a&gt;&lt;a name="wp84553"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;T1 &lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19182"&gt;&lt;/a&gt;&lt;a name="wp84555"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;T1 &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="left"&gt;
&lt;td rowspan="2"&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19183"&gt;&lt;/a&gt;&lt;a name="wp84557"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;&lt;code class="cCode"&gt;Never&lt;br&gt;&lt;br&gt;&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19184"&gt;&lt;/a&gt;&lt;a name="wp84559"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;None &lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19185"&gt;&lt;/a&gt;&lt;a name="wp84561"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;None &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr align="left"&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19186"&gt;&lt;/a&gt;&lt;a name="wp84565"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;T1 &lt;/div&gt;&lt;/td&gt;
&lt;td&gt;&lt;a title="Container-Managed Transactions" name="HTML_TO_HH_19187"&gt;&lt;/a&gt;&lt;a name="wp84567"&gt;&lt;/a&gt;
&lt;div class="pCellBody"&gt;Error &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;&lt;br&gt;Sia T1 che T2 sono transazioni controllate dal container. La transazioe T1 è associata a un metodo &lt;span style="font-family: Courier New;"&gt;method-a()&lt;/span&gt; di &lt;span style="font-family: Courier New;"&gt;Bean-1&lt;/span&gt; che invoca il metodo &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt; il quale in genere può essere definito in un nuovo EJB &lt;span style="font-family: Courier New;"&gt;Bean-2&lt;/span&gt;. T2 viene iniziato dal container perima dell'esecuzione di &lt;span style="font-family: Courier New;"&gt;method-b()&lt;/span&gt;. Nell'ultima colonna la parola &lt;i&gt;None&lt;/i&gt; indica che &lt;span style="font-family: Courier New;"&gt;method-b() &lt;/span&gt;non viene eseguito all'interno di una transazione controllata dal container. In ogni caso le chiamate a DB in tale metodo potrebbero essere controllate dal transaction manager del DBMS. &lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Settaggio degli attributi di transazione&lt;/span&gt;&lt;br&gt;&lt;br&gt;Nelle specifiche EJB gli attributi di transazione vengono definite usando l'annotazione &lt;span style="font-family: Courier New;"&gt;javax.ejb.TransactionAttribute&lt;/span&gt;, s settandola ad una delle costanti &lt;span style="font-family: Courier New;"&gt;javax.ejb.TransactionAttributeType&lt;/span&gt;. L'annotazione può essere usata per tutta la classe o per il singolo metodo; nel primo caso il &lt;span style="font-family: Courier New;"&gt;TransactionAttributeType&lt;/span&gt; viene applicato a tutti i &lt;i&gt;business method&lt;/i&gt; della stessa classe. Se l'annotazione viene definita sia sulla classe che su un particolare metodo, viene applicato il &lt;span style="font-family: Courier New;"&gt;TransactionAttributeType&lt;/span&gt; definito per il metodo, in modo tale da poter definire una regola generale per il bean e eccezioni per i singoli metodi. Di seguito viene elencato per ogni attributo di transazione il &lt;span style="font-family: Courier New;"&gt;TransactionAttributeType &lt;/span&gt;corrispettivo:&lt;br&gt;&lt;ul&gt;&lt;li&gt;Required: &lt;span style="font-family: Courier New;"&gt;TransactionAttributeType.REQUIRED&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Verdana;"&gt;RequireNew: &lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;TransactionAttributeType.REQUIRES_NEW&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Verdana;"&gt;Mandatory: &lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;TransactionAttributeType.MANDATORY&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Verdana;"&gt;NotSupported: &lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;TransactionAttributeType.NOT_SUPPORTED&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Verdana;"&gt;Supports: &lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;TransactionAttributeType.SUPPORTS&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Verdana;"&gt;Never: &lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;TransactionAttributeType.NEVER&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Il seguente frammento di codice illustra come usare l'annotazione &lt;span style="font-family: Courier New;"&gt;TransactionAttribute&lt;/span&gt;:&lt;br&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;@TransactionAttribute(NOT_SUPPORTED)&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;@Stateful&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;public class TransactionBean implements Transaction {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;...&lt;br&gt;@TransactionAttribute(REQUIRES_NEW)&lt;br&gt;public void firstMethod() {...}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;@TransactionAttribute(REQUIRED)&lt;br&gt;public void secondMethod() {...}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;public void thirdMethod() {...}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;public void fourthMethod() {...}&lt;br&gt;&lt;/div&gt;&lt;span style="font-family: Courier New;"&gt;} &lt;/span&gt;&lt;br&gt;&lt;br&gt;In questo esempio, l'attributo di transazione per la classe &lt;span style="font-family: Courier New;"&gt;TransactionBean &lt;/span&gt;è stato settato a NotSuported. Questo vuol dire che per ogni metodo dello stesso EJB, dove non specificato diversamente, vale il &lt;span style="font-family: Courier New;"&gt;TransactionAttributeType&lt;/span&gt; &lt;span style="font-family: Courier New;"&gt;NOT_SUPPORTED&lt;/span&gt;. &lt;span style="font-family: Courier New;"&gt;firstMethod&lt;/span&gt; è stato settato a RequiresNew, e &lt;span style="font-family: Courier New;"&gt;secondMethod&lt;/span&gt; è stato settato a Required. Considerando che il &lt;span style="font-family: Courier New;"&gt;TransactionAttribute &lt;/span&gt;del metodo sovrascrive il &lt;span style="font-family: Courier New;"&gt;TransactionAttribute&lt;span style="font-family: Verdana;"&gt; della classe, una chiamata a &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;firstMethod&lt;span style="font-family: Verdana;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;implicherà la creazione di una nuova transazione, mentre una chiamata&amp;nbsp; a &lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;secondMethod &lt;span style="font-family: Verdana;"&gt;implicherà che tale metodo verrà eseguito nella stessa transazione del metodo in cui avviene l'invocazione, se esiste, o in una nuova transazione, se non esiste. Le chiamate a &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;firstMethod &lt;span style="font-family: Verdana;"&gt;e&lt;/span&gt; &lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;firstMethod &lt;span style="font-family: Verdana;"&gt;avverrano senza alcuna transazione&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;.&lt;/span&gt;&lt;br style="font-family: Verdana;"&gt;&lt;span style="font-family: Verdana;"&gt;Esistono due modi di effettuare il &lt;b&gt;Roll-back&lt;/b&gt; di una transazione CMT:&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;attraverso un'eccezione di sistema, nel qual caso il container automaticamente effettua il roll-back della transazione, &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;invocando il metodo &lt;span style="font-family: Courier New;"&gt;setRollbackOnly&lt;/span&gt; dell'interfaccia &lt;span style="font-family: Courier New;"&gt;EJBContext&lt;/span&gt;. In questo caso il bean istruisce il container di effettuare il roll-back. Se il bean solleva una eccezione a livello si applicazione, il roll-back non è automatico, ma può essere iniziato attraverso una chiamata a &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;&lt;span style="font-family: Courier New;"&gt;setRollbackOnly&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;Implementando l'interfaccia &lt;i&gt;&lt;b&gt;SessionSynchronization&lt;/b&gt;&lt;/i&gt; è possibile sincronizzare le variabili d'istanza di un session bean attraverso messaggi di notifica di sincronizzazione di una transazione. Per esempio, attraverso questo meccanismo, è possibile sincronizzare le variabili di un EJB con i corrispettivi valori presenti nel DB. Il container invoca i metodi &lt;span style="font-family: Courier New;"&gt;afterBegin&lt;/span&gt;, &lt;span style="font-family: Courier New;"&gt;beforeCompletion &lt;/span&gt;e afterCompletion, esportati dall'interfaccia&amp;nbsp; &lt;/span&gt;SessionSynchronization &lt;span style="font-family: Verdana;"&gt;ad ogni stato principale di una transazione. In particolare:&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;il metodo &lt;span style="font-family: Courier New;"&gt;&lt;b&gt;afterBegin&lt;/b&gt; &lt;/span&gt;informa l'istanza del EJB che una nuova transazione è stata iniziata; il container invoca questo metodo subito prima di eseguire il &lt;i&gt;business method&lt;/i&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;il metodo &lt;b&gt;&lt;span style="font-family: Courier New;"&gt;beforeCompletion &lt;/span&gt;&lt;/b&gt;viene invocato dal container appena il &lt;i&gt;business method&lt;/i&gt; è stato completato ma prima di &lt;i&gt;'committare&lt;/i&gt;' la transazione. In questo modo il bean ha l'ultima opportunità di effettuare il rollback della transazione con una chiamata a &lt;span style="font-family: Courier New;"&gt;setRollbackOnly&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Verdana;"&gt;il metodo &lt;b&gt;&lt;span style="font-family: Courier New;"&gt;afterCompletion &lt;/span&gt;&lt;/b&gt;indica che la transazione è stata completata. Ha un solo parametro di tipo &lt;span style="font-family: Courier New;"&gt;boolean&lt;/span&gt; il cui valore è true se la transazione è andata a buon fine, false altrimenti.&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;&lt;br style="font-family: Verdana;"&gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-4009653560680310107?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uagznke54x-1-JL4GP7QE64zRSQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uagznke54x-1-JL4GP7QE64zRSQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uagznke54x-1-JL4GP7QE64zRSQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uagznke54x-1-JL4GP7QE64zRSQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/xTYhLq4Mu6o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/4009653560680310107/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=4009653560680310107" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/4009653560680310107?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/4009653560680310107?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/xTYhLq4Mu6o/container-managed-transaction.html" title="Container Managed Transaction" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2008/11/container-managed-transaction.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIDQHk4cCp7ImA9WxRUGUU.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-7102290335204998422</id><published>2008-11-04T11:40:00.001+01:00</published><updated>2008-11-29T19:49:31.738+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-29T19:49:31.738+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software design" /><title>Design Patterns</title><content type="html">

 
 
 


 
 
 


 
 
 


 
 
 


 
 
 


 
 
 


 
 
 


 
 
 


 
 
 


 
 
 


 
 
 


 
 
 


 
 
 


 
 
 
&lt;div style="text-align: justify;"&gt;

 
 
 


 
 
 
Nell'&lt;i&gt;Ingegneria del Software&lt;/i&gt; un Design Patterns può essere definito come "&lt;i&gt;una soluzione progettuale generale a un problema ricorrente&lt;/i&gt;". Tale soluzione è language-independent e rappresenta un modello da applicare per risolvere un problema che può presentarsi in diverse situazioni durante la progettazione e lo sviluppo del software. La GOF(Gang Of Four) fu il primo gruppo di sviluppatori a pensare di definire un insieme di formalismi che permettesse di facilitare la progettazione e sviluppo del software basata su un insieme di Design Pattern. SUN suggerisce lo studio del libro scritto dalla GOF, &lt;i&gt;"Design Patterns"- Elements of Reusable Object-Oriented Software&lt;/i&gt;, e proprio da esso si prende spunto per descrivere i seguenti Design Pattern, con esempi concreti di utilizzo implementati in Java, il piu popolare dei linguaggi OO.&lt;br&gt;&lt;br&gt;La GOF ha definito un insieme di 23 Design Pattern ben noti, suddivisi in 3 grandi categorie (in rosso quelli già trattati in questo post):&lt;br&gt;&lt;br&gt;-Pattern &lt;b&gt;Creazionali&lt;/b&gt;(&lt;u style="color: rgb(204, 0, 0);"&gt;Singleton&lt;/u&gt;, Abstract Factory, Builder, Factory, Prototype)&lt;br&gt;&lt;br&gt;-Pattern &lt;b&gt;Strutturali&lt;/b&gt;(&lt;u style="color: rgb(204, 0, 0);"&gt;Adapter&lt;/u&gt;, Bridge, Composite, Decorator, Facade, Flyweight, Proxy)&lt;br&gt;&lt;br&gt;-Pattern &lt;b&gt;Comportamentali&lt;/b&gt;(&lt;u style="color: rgb(204, 0, 0);"&gt;Chain-of-responsability&lt;/u&gt;, Command, &lt;u style="color: rgb(204, 0, 0);"&gt;Interpreter&lt;/u&gt;, &lt;u style="color: rgb(204, 0, 0);"&gt;Iterator&lt;/u&gt;, Mediator, Memento, &lt;u style="color: rgb(204, 0, 0);"&gt;Observer&lt;/u&gt;, State, Strategy, Template method, Visitor)&lt;span style="font-family: Verdana;"&gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;Tutti i post sono work-in-progress.&lt;br&gt;&lt;br&gt;&lt;div&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-family: Courier New; color: rgb(204, 0, 0);"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;font size="4"&gt;...POST TO BE CONTINUED....&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-7102290335204998422?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BR0LryIOElmXKmXkjmwJ4tYNeZM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BR0LryIOElmXKmXkjmwJ4tYNeZM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BR0LryIOElmXKmXkjmwJ4tYNeZM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BR0LryIOElmXKmXkjmwJ4tYNeZM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/sdhtsVBpjZg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/7102290335204998422/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=7102290335204998422" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/7102290335204998422?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/7102290335204998422?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/sdhtsVBpjZg/design-patterns.html" title="Design Patterns" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2008/11/design-patterns.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUERXoyeCp7ImA9WxVbFko.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-7499281629424119610</id><published>2008-10-24T11:34:00.002+02:00</published><updated>2009-04-02T15:16:44.490+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-02T15:16:44.490+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web programming" /><title>Upload di file</title><content type="html">

 
 
 


 
 
 


 
 
 


 
 
 


 
 
 
&lt;div style="text-align: justify;"&gt;Per effettuare l'upload di un file sul server è necessario utilizzare le Commons FileUpload API (&lt;a target="_blank" title="http://commons.apache.org/io" href="http://commons.apache.org/io" id="gxan"&gt;http://commons.apache.org/io&lt;/a&gt;) e le Commmons IO API (&lt;a target="_blank" title="http://commons.apache.org/fileupload" href="http://commons.apache.org/fileupload" id="s3ou"&gt;http://commons.apache.org/fileupload&lt;/a&gt;); le prime forniscono un meccanismo semplice, robusto e performante di upload di file ad un'applicazione web, le seconde un supporto allo sviluppo di funzionalità Input-Output e ci serviranno per memorizzare i file uplodati sul server.&lt;br&gt;&lt;/div&gt;&lt;br&gt;La form che ci permetterà di selezionare un file lato client sarà del tipo:&lt;br&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;&amp;lt;form action="UploadFile" method="post" &lt;b&gt;enctype="multipart/form-data"&lt;/b&gt; accept="image" maxlength="100000"&amp;gt;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt;&amp;lt;input type="file" name="fileUploaded"/&amp;gt;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; &amp;lt;input type="submit" value="Send"/&amp;gt;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;span style="font-family: Courier New;"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;in cui l'attributo &lt;span style="font-family: Courier New;"&gt;accept&lt;/span&gt; permette di filtrare il tipo di file uplodato e &lt;span style="font-family: Courier New;"&gt;maxlength&lt;/span&gt; di specificarne la grandezza in byte massima. La servlet che processerà la richiesta sarà UploadFile la quale si aspetta, tramite richiesta POST, un parametro con nome &lt;i&gt;fileUploaded&lt;/i&gt;. All'interno della servlet &lt;span style="font-family: Courier New;"&gt;UploadFile&lt;/span&gt; inseriamo il seguente codice:&lt;br&gt;&lt;/div&gt;&lt;br&gt; &lt;span style="font-family: Courier New;"&gt;protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;throws ServletException, IOException{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; ServletRequestContext src=null;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; src = new ServletRequestContext(request);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; if (FileUpload.isMultipartContent(src)){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; DiskFileItemFactory dfif=null;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; ServletFileUpload fu = null;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; String path = "/upload/"; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; File file = new File(path);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; if (!file.exists())&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; file.mkdirs();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; dfif = new DiskFileItemFactory(size,file);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; fu = new ServletFileUpload(dfif);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; List itemList = null;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; try{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt; &lt;span style="font-family: Courier New;"&gt;itemList&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt; = fu.parseRequest(src);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; }catch(Exception e){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; response.sendError(500,e.getMessage());&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; return; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; HashMap&amp;lt;String, FileItem&amp;gt; files &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; = getFileParameters(&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;itemList&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; FileItem fItem = files.get("fileUploaded");&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; String mime = fItem.getContentType();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; int extIndex = mime.length()-3;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; String ext = "."+mime.substring(extIndex);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; String fileStr = fItem.getFieldName()+ext;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; try{&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; fItem.write(new File(path+fileStr));&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; }catch(Exception e){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; response.sendError(500, e.getMessage()); &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; request.setAttribute("msg", "Upload OK");&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; RequestDispatcher rDisp;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; ServletContext sc = this.getServletContext();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; rDisp = sc.getRequestDispatcher("/info.jsp");&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; rDisp.forward(request, response);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;span style="font-family: Courier New;"&gt; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; /*&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; * estrae i FileItem della form e li &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; * inserisce in una Map in cui le chiavi &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; * sono i nomi dei parametri&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; */&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; private HashMap&amp;lt;String, FileItem&amp;gt; &lt;b&gt;getFileParameters&lt;/b&gt;(List itemList){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; HashMap&amp;lt;String, FileItem&amp;gt; ret &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; = new HashMap&amp;lt;String, FileItem&amp;gt;();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; Iterator iter = &lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;itemList&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;.iterator();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; while (iter.hasNext()) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; FileItem item = (FileItem) iter.next(); &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; if (!item.isFormField()){&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; String fieldName = item.getFieldName();&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; ret.put(fieldName, item);&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: Courier New;"&gt; }&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; return ret;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/div&gt;&lt;span style="font-family: Courier New;"&gt; }&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;Il metodo &lt;span style="font-family: Courier New;"&gt;private HashMap&amp;lt;String, FileItem&amp;gt; getFileParameter(List &lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;itemList&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;)&lt;/span&gt; in questo caso è poco utile, trattandosi dell'upload di un solo file, ma in genere permette di trattare i parametri di tipo &lt;b&gt;non-FormField&lt;/b&gt; (quelli che contengono i file da uploadare) alla stregua dei classici parametri testuali, i quali possono essere inviati al server secondo un ordine non predefinito. I parametri non-FormField vengono inviati al server secondo l'ordine con cui vengono dichiarati nella form per cui una modifica della form potrebbe voler richiedere una modifica nella servlet.&lt;br&gt;Utilizzando &lt;span style="font-family: Courier New;"&gt;HashMap&amp;lt;String, FileItem&amp;gt;&lt;/span&gt; il problema viene aggirato in quanto si fa riferimento ai vari FileItem di tipo non-FormField in base ai nomi e non alla posizione che occupano nella form.&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;ATTENZIONE&lt;/span&gt;: quando l' enctype definito nella form è &lt;span style="font-family: Courier New;"&gt;&lt;b&gt;multipart/form-data &lt;/b&gt;&lt;span style="font-family: Verdana;"&gt;anche i tradizionali parametri testuali devono essere prelevati nella servlet usando la tecnica dell' HashMap ( con l'istruzione tradizionale&lt;/span&gt;&lt;/span&gt; &lt;span style="font-family: Courier New;"&gt;request.getParameter("nomeparametro")&lt;/span&gt; il valore restituito è sempre &lt;span style="font-family: Courier New;"&gt;null):&lt;br&gt;&lt;br&gt;/*&lt;br&gt;&amp;nbsp;* estrae i parametri testuali della form e li &lt;br&gt;inserisce in una Map in cui le chiavi sono i nomi dei parametri&lt;br&gt;*/&lt;br&gt;private HashMap&amp;lt;String, String&amp;gt; &lt;b&gt;getStringParameters&lt;/b&gt;(List &lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;itemList&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HashMap&amp;lt;String, String&amp;gt; ret = new HashMap&amp;lt;String, String&amp;gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Iterator iter =&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;itemList&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;.iterator();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (iter.hasNext()) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileItem item = (FileItem) iter.next();&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (item.isFormField()){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String fieldName = item.getFieldName();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String fieldValue = item.getString();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret.put(fieldName, fieldValue);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;&lt;br&gt;}&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;br&gt;il valore di un parametro sarà prelevato attraverso la seguente istruzione:&lt;br&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;.... &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; HashMap&amp;lt;String, String&amp;gt; uploadedParameters = getStringParameters(&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;itemList&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;); &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; String parameterValue = &amp;nbsp;uploadedParameters.get("parameterName"); &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt; ... &lt;/span&gt;&lt;br&gt;&lt;br&gt;Alcuni IDE, per esempio Netbeans, permettono di aggiungere in maniera molto semplice un componente per l'uload di file in un applicazione JSF Visual Web (&lt;a title="http://www.netbeans.org/kb/60/web/fileupload.html" href="http://www.netbeans.org/kb/60/web/fileupload.html" id="yt3k"&gt;http://www.netbeans.org/kb/60/web/fileupload.html&lt;/a&gt;).&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-7499281629424119610?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vfoACQI4T_03NJ22IUFgWSJ5dNs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vfoACQI4T_03NJ22IUFgWSJ5dNs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vfoACQI4T_03NJ22IUFgWSJ5dNs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vfoACQI4T_03NJ22IUFgWSJ5dNs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/5EipgB53ges" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/7499281629424119610/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=7499281629424119610" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/7499281629424119610?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/7499281629424119610?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/5EipgB53ges/upload-di-file.html" title="Upload di file" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2008/10/upload-di-file.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YASXs-fip7ImA9WxRVGU8.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-6755540454409324140</id><published>2008-10-15T16:27:00.002+02:00</published><updated>2008-11-17T13:32:28.556+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-17T13:32:28.556+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web programming" /><title>Contatore di Sessioni HTTP Attive</title><content type="html">

    
    
    
&lt;div style="text-align: justify;"&gt;

    
    
    
In un applicazione web scritta in Java è possibile contare il numero di sessioni http attive sul server tramite una classe che implementa javax.servlet.http.HttpSessionListener:&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;package web;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;import javax.servlet.http.*;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;public class SessionCounter implements HttpSessionListener {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; private static int sessionCounter = 0;&lt;br&gt; public void sessionCreated(HttpSessionEvent evt) {&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; sessionCounter++;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; }&lt;br&gt; public void sessionDestroyed(HttpSessionEvent evt) {&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; sessionCounter--;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; }&lt;br&gt; public static int getSessionCounter() {&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; return sessionCounter;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; }&lt;br&gt;&lt;/div&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;In /WEB-INF/web.xml è necessario aggiungere un elemento per definire un &lt;b&gt;application listener&lt;/b&gt; specificando il nome della classe appena creata:&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;&amp;lt;?xml version="1.0" ...&amp;gt; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;div style="font-family: Courier New;"&gt;&amp;lt;web-app&amp;gt;&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&amp;lt;listener&amp;gt;&lt;br&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt; &amp;lt;listener-class&amp;gt; web.SessionCounter &amp;lt;/listener-class&amp;gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt; &amp;lt;/listener&amp;gt;&lt;br&gt; ...&lt;br&gt;&lt;/div&gt;&lt;span style="font-family: Courier New;"&gt;&amp;lt;/web-app&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;Infine è possibile conoscere ed eventualmente visualizzare su una pagina jsp il numero delle sessioni http attive nel seguente modo:&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;span style="font-family: Courier New;"&gt;sul server ci sono &amp;lt;%=web.SessionCounter.getSessionCounter()%&amp;gt; sessioni attive&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;In genere tale conteggio può essere utile per capire &lt;b&gt;quanti&lt;/b&gt; utenti sono presenti contemporaneamente su un sito web. Inoltre, aggiungendo una semplice struttura dati(p.e. un Vector aggiornato opportunamente quando vengono invocati i metodi &lt;span style="font-family: Courier New;"&gt;sessionCreated&lt;/span&gt; e &lt;span style="font-family: Courier New;"&gt;sessionDestroyed&lt;/span&gt;) alla classe &lt;span style="font-family: Courier New;"&gt;SessionCounter&lt;/span&gt;, è possibile anche determinare &lt;b&gt;quali&lt;/b&gt; utenti sono connessi al server in un dato istante.&lt;br&gt;Non è superfluo notare che il metodo &lt;span style="font-family: Courier New;"&gt;public void sessionDestroyed(HttpSessionEvent evt)&lt;/span&gt; viene invocato sia nel caso in cui la sessione venga invalidata esplicitamente, per esempio attraverso un metodo &lt;span style="font-family: Courier New;"&gt;logout()&lt;/span&gt;, sia che la sessione venga invalidata dal container, perchè scade il timeout di sessione attiva.&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-6755540454409324140?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/a2Rzf1-V0oSnTQQ-JfQ1ZJVGVxc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a2Rzf1-V0oSnTQQ-JfQ1ZJVGVxc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/a2Rzf1-V0oSnTQQ-JfQ1ZJVGVxc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/a2Rzf1-V0oSnTQQ-JfQ1ZJVGVxc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/cheOCLSn-MI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/6755540454409324140/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=6755540454409324140" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/6755540454409324140?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/6755540454409324140?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/cheOCLSn-MI/in-un-applicazione-web-scritta-in-jav.html" title="Contatore di Sessioni HTTP Attive" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2008/10/in-un-applicazione-web-scritta-in-jav.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAERHgzeyp7ImA9WxRWFEk.&quot;"><id>tag:blogger.com,1999:blog-3753021431398828524.post-4547536220982169514</id><published>2008-10-15T15:59:00.002+02:00</published><updated>2008-10-31T11:25:05.683+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-31T11:25:05.683+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web programming" /><title>Sessioni HTTP Uniche</title><content type="html">

    
    
    


    
    
    
&lt;div style="text-align: justify;"&gt;
  Vediamo come è possibile estendere il codice del post precedente per implementare facilmente un meccanismo per gestire il problema delle sessioni multiple per utente.&lt;br&gt;
  Definiamo una classe che ha la funzione di tenere traccia di tutte le sessioni http attive sul server mediante un HashMap.&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-family: Courier New;"&gt;package web;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;
&lt;span style="font-family: Courier New;"&gt;import java.util.HashMap;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;
&lt;span style="font-family: Courier New;"&gt;import javax.servlet.http.HttpSession;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;
&lt;span style="font-family: Courier New;"&gt;public class SessionManager {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  private HashMap sessions;&lt;br&gt;
  public boolean exist(String username) {&lt;br&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    if (sessions.containsKey(username)) {&lt;br&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    &lt;div style="margin-left: 40px;"&gt;
      return true;&lt;br&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    }&lt;br&gt;
    return false;&lt;br&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  }&lt;br&gt;
  public boolean addSession(HttpSession session) {&lt;br&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    if (sessions.containsKey( session.getAttribute("username"))) {&lt;br&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    &lt;div style="margin-left: 40px;"&gt;
      return false;&lt;br&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    }&lt;br&gt;
    sessions.put((String) session.getAttribute("username"), session);&lt;br&gt;
    return true;&lt;br&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  }&lt;br&gt;
  public HttpSession getSession(String username) {&lt;br&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    return (HttpSession) sessions.get(username);&lt;br&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  }&lt;br&gt;
  public boolean removeSession(String username) {&lt;br&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    if (!sessions.containsKey(username)) {&lt;br&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    &lt;div style="margin-left: 40px;"&gt;
      return false;&lt;br&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    }&lt;br&gt;
    sessions.remove(username);&lt;br&gt;
    return true;&lt;br&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  }&lt;br&gt;
  private static SessionManager sessionManager;&lt;br&gt;
  public static SessionManager getSessionManager() {&lt;br&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    if (sessionManager == null) {&lt;br&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    &lt;div style="margin-left: 40px;"&gt;
      sessionManager = new SessionManager();&lt;br&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    }&lt;br&gt;
    return sessionManager;&lt;br&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  }&lt;br&gt;
  public SessionManager() {&lt;br&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    sessions = new HashMap();&lt;br&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  }&lt;br&gt;
&lt;/div&gt;
&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;div style="text-align: justify;"&gt;
  Tale classe deve essere definita rispettando il pattern Singleton ed essere utilizzata all'interno di una servlet ogni volta che si vuole creare una nuova sessione, nel seguente modo&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-family: Courier New;"&gt;if(SessionManager.getInstance.exist(username)) {&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; SessionManager manager = SessionManager.getInstance();&lt;span style="font-family: Courier New;"&gt;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;&lt;/span&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  logout(manager.getSession(username) );&lt;br&gt;
  manager.removeSession(username);&lt;br&gt;
&lt;/div&gt;
&lt;span style="font-family: Courier New;"&gt; } &lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;div style="text-align: justify;"&gt;
  in cui il metodo &lt;span style="font-family: Courier New;"&gt;private void logout( HttpSession session)&lt;/span&gt; implementa le azioni necessarie ad invalidare la sessione.&lt;br&gt;
  Ovviamente, come descritto nel post precedente, è necessario aggiungere un elemento &lt;b&gt;application listener&lt;/b&gt; in /WEB-INF/web.xml:&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-family: Courier New;"&gt;&amp;lt;?xml version="1.0" ...&lt;/span&gt;&lt;span style="font-family: Courier New;"&gt;&amp;gt; &lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;
&lt;span style="font-family: Courier New;"&gt;&amp;lt;web-app&amp;gt;&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &amp;lt;listener&amp;gt;&lt;br&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &lt;div style="margin-left: 40px;"&gt;
    &amp;lt;listener-class&amp;gt; web.SessionManager &amp;lt;/listener-class&amp;gt;&lt;br&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  &amp;lt;/listener&amp;gt;&lt;br&gt;
  ...&lt;br&gt;
&lt;/div&gt;
&lt;span style="font-family: Courier New;"&gt;&amp;lt;/web-app&amp;gt;&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;div style="text-align: justify;"&gt;
  &lt;b&gt;Meccanismo di lock su una coppia &amp;lt;username,password&amp;gt;&lt;/b&gt;:&lt;br&gt;
  Se si vuole usare il meccanismo illustrato per per fare in modo che per esempio una coppia &amp;lt;username,password&amp;gt; venga usata da un solo cliente alla volta basta riscrivere il codice utilizzato all'interno della servlet come segue:&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;span style="font-family: Courier New;"&gt;if(SessionManager.getInstance.exist(username)) {&lt;/span&gt;&lt;br style="font-family: Courier New;"&gt;
&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;
  response.sendError(403);return;&lt;br&gt;
&lt;/div&gt;
&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br&gt;
&lt;div&gt;
  &lt;pre style="margin-bottom: 0.5cm; text-align: left;"&gt;&lt;span style="font-family: 'Courier New';"&gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3753021431398828524-4547536220982169514?l=programmarejava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/A-NdRnqLIGQGJpwCQwKNw13HcHg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A-NdRnqLIGQGJpwCQwKNw13HcHg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/A-NdRnqLIGQGJpwCQwKNw13HcHg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A-NdRnqLIGQGJpwCQwKNw13HcHg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/swrSE/~4/F9oF58CLn1w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://programmarejava.blogspot.com/feeds/4547536220982169514/comments/default" title="Commenti sul post" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3753021431398828524&amp;postID=4547536220982169514" title="0 Commenti" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/4547536220982169514?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3753021431398828524/posts/default/4547536220982169514?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/swrSE/~3/F9oF58CLn1w/sessioni-http-uniche_9613.html" title="Sessioni HTTP Uniche" /><author><name>Santino Brescia</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://programmarejava.blogspot.com/2008/10/sessioni-http-uniche_9613.html</feedburner:origLink></entry></feed>

