{"id":1843,"date":"2012-12-18T01:58:20","date_gmt":"2012-12-17T23:58:20","guid":{"rendered":"http:\/\/musarra.wordpress.com\/?p=1843"},"modified":"2017-07-13T18:05:25","modified_gmt":"2017-07-13T16:05:25","slug":"alloy-ui-autocomplete-ajax-example","status":"publish","type":"post","link":"https:\/\/www.dontesta.it\/en\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/","title":{"rendered":"Alloy UI AutoComplete Ajax Example"},"content":{"rendered":"<p><\/p>\n<h1>1. Cos'\u00e8 AlloyUI?<\/h1>\n<p style=\"text-align: justify;\">AlloyUI (abbreviato in AUI) \u00e8 un\u00a0meta framework\u00a0Open Source realizzato da <a class=\"zem_slink\" title=\"Liferay\" href=\"http:\/\/www.liferay.com\" target=\"_blank\" rel=\"homepage noopener\">Liferay<\/a> che ingloba una serie di librerie javascript fornendo un set di <a class=\"zem_slink\" title=\"Application programming interface\" href=\"http:\/\/en.wikipedia.org\/wiki\/Application_programming_interface\" target=\"_blank\" rel=\"wikipedia noopener\">API<\/a> per la creazione di applicazioni web robuste e flessibili che toccano i tre livelli del browser: \u00a0<em>struttura, stile e comportamento<\/em>. AUI \u00e8 costruito su Yahoo <a class=\"zem_slink\" title=\"User interface\" href=\"http:\/\/en.wikipedia.org\/wiki\/User_interface\" target=\"_blank\" rel=\"wikipedia noopener\">User Interface<\/a> (YUI) e ha il supporto per una vasta gamma di funzioni avanzate studiate appositamente per la tecnologia delle portlet.<\/p>\n<p style=\"text-align: justify;\">\n<div class='tm-tweet-clear'><\/div>\n<div class='tm-click-to-tweet'>\n<div class='tm-ctt-text'><a href='https:\/\/twitter.com\/share?text=Su+%40github+il+progetto+completo+di+%40Liferay+%40AlloyUI+UI+Autocomplete+Ajax+Example+http%3A%2F%2Fgoo.gl%2FRMCHel&via=antonio_musarra&related=antonio_musarra&url=https:\/\/www.dontesta.it\/en\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/' target='_blank'>Su @github il progetto completo di @Liferay @AlloyUI UI Autocomplete Ajax Example http:\/\/goo.gl\/RMCHel<\/a><\/div>\n<p><a href='https:\/\/twitter.com\/share?text=Su+%40github+il+progetto+completo+di+%40Liferay+%40AlloyUI+UI+Autocomplete+Ajax+Example+http%3A%2F%2Fgoo.gl%2FRMCHel&via=antonio_musarra&related=antonio_musarra&url=https:\/\/www.dontesta.it\/en\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/' target='_blank' class='tm-ctt-btn'>Click To Tweet<\/a><\/p>\n<div class='tm-ctt-tip'><\/div>\n<\/div>\n<h1 style=\"text-align: justify;\">2. Obiettivo<\/h1>\n<p style=\"text-align: justify;\">Le applicazioni web \"moderne\" sono sempre pi\u00f9 vicine alle comuni applicazioni desktop, framework sempre pi\u00f9 completi, complessi e di semplice utilizzo, rendono\u00a0l'implementazione relativamente semplice, inoltre con l'avvento di <a class=\"zem_slink\" title=\"HTML5\" href=\"http:\/\/www.whatwg.org\/specs\/web-apps\/current-work\/multipage\/the-xhtml-syntax.html\" target=\"_blank\" rel=\"homepage noopener\">HTML 5<\/a> la distanza con le applicazioni desktop\u00a0diventa ancora pi\u00f9 breve. In quest'articolo vedremo come sia semplice realizzare una combo completa di funzione\u00a0<em>auto complete<\/em>, i cui dati presentati non sono \"statici\", bens\u00ec, provenienti da una base dati. Sfrutteremo Ajax per il reperimento dei dati da mostrare all'interno della combo. Ovviamente realizzeremo il tutto all'interno di una portlet. In Figura 1 \u00e8 illustrato il risultato finale del lavoro.\u00a0Quanto realizzato nel corso dell'articolo \u00e8 disponibile come progetto\u00a0<em>Maven Liferay Portlet<\/em>\u00a0sul mio repository GitHub all'indirizzo\u00a0<a title=\"Alloy UI Autocomplete Ajax Example\" href=\"https:\/\/github.com\/amusarra\/liferay-aui-autocomplete-ajax-example\" target=\"_blank\" rel=\"noopener\" class=\"broken_link\">liferay-aui-autocomplete-ajax-example<\/a><\/p>\n<div id=\"attachment_1845\" style=\"width: 425px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1845\" decoding=\"async\" loading=\"lazy\" class=\" wp-image-1845\" title=\"Alloy UI Autocomplete Ajax Example\" src=\"http:\/\/www.dontesta.it\/wp-content\/uploads\/2015\/03\/screen-shot-2012-12-15-at-22-30-28.png\" alt=\"Alloy UI Autocomplete Ajax Example\" width=\"415\" height=\"270\" \/><p id=\"caption-attachment-1845\" class=\"wp-caption-text\">Figura 1. Alloy UI Autocomplete Ajax Example<\/p><\/div>\n<h1>3. Requisiti<\/h1>\n<p style=\"text-align: justify;\">Per seguire con profitto il corso dell'articolo, \u00e8 richiesta una conoscenza minima degli standard e tecnologie che ruotano nell'intorno delle Portlet, oltre che un minimo di dimestichezza con Liferay e il suo ambiente di sviluppo. Gli strumenti a supporto dovrebbero essere i seguenti:<\/p>\n<ol>\n<li>Liferay SDK 6.1<\/li>\n<li>Eclipse + Liferay Plugin o Liferay Studio<\/li>\n<li>Liferay Portal 6.1<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">L'esempio completo della portlet che troverete sul repository\u00a0<em>GitHub<\/em>, \u00e8 stato realizzato tramite Maven e l'archetype\u00a0<em>liferay-portlet-archetype<\/em> versione 6.1.1 Community Edition.<\/p>\n<h1>\u00a04.\u00a0Serving resources<\/h1>\n<p style=\"text-align: justify;\">Nella prima versione delle specifiche <a title=\"Java Portlet Specification 1.0 (JSR 168)\" href=\"http:\/\/jcp.org\/en\/jsr\/detail?id=168\" target=\"_blank\" rel=\"noopener\">Java Portlet Specification 1.0 (JSR 168)<\/a>, non era possibile servire <em>risorse<\/em> generate dinamicamente direttamente dalla portlet, era necessario un ulteriore servlet che serviva le risorse. Questa limitazione ha alcuni svantaggi:<\/p>\n<ul>\n<li>Non \u00e8 disponibile il contesto della portlet, il che significa non avere accesso a\u00a0render parameters, portlet mode, window state, portlet preferences, portlet session e altro ancora;<\/li>\n<li>Le URL generate nella servlet sono al di fuori dello scope del portale, inoltre, lo stato corrente delle pagine del portale viene perso;<\/li>\n<li>La servlet non \u00e8 eseguita nel contesto di sicurezza del portale;<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Un vantaggio di servire risorse attraverso una servlet \u00e8 il meno <em>overhead<\/em>, dovuto al fatto che la richiesta non deve passare attraverso l'intera struttura del portale, per esempio, quando \u00e8 necessario servire grandi flussi multimediali.<\/p>\n<p style=\"text-align: justify;\">La seconda versione delle specifiche\u00a0<a title=\"Java Portlet Specification 2.0 (JSR 286)\" href=\"http:\/\/jcp.org\/en\/jsr\/detail?id=286\" target=\"_blank\" rel=\"noopener\">Java Portlet Specification 2.0 (JSR 286)<\/a>\u00a0introduce un nuovo tipo di URL, la <strong><em>resource URL<\/em><\/strong><em>.<\/em>\u00a0La resource URL consente di attivare il metodo <em>serveResource<\/em>, sull'interfaccia <em>ResourceServingPortlet<\/em> che \u00e8 possibile sfruttare per creare risorse dinamiche direttamente nel portlet.<\/p>\n<pre class=\"lang:java mark:40 decode:true \" title=\"The ResourceServingPortlet interface\">package javax.portlet;\r\n\r\n\/**\r\n* The ResourceServingPortlet interface allows\r\n* serving resources through the portlet.\r\n*\r\n* The portlet container must call this method for links created by\r\n* the RenderResponse.createResourceURL() call.\r\n* If the portlet creates resource URLs with RenderResponse.createResourceURL()\r\n* it must implement this lifecycle method.\r\n*\r\n* @since 2.0\r\n*\/\r\npublic interface ResourceServingPortlet {\r\n\r\n\/**\r\n * Called by the portlet container to allow the portlet to generate\r\n * the resource content based on its current state.\r\n * The portal \/ portlet container must not render any output in addition\r\n * to the content returned by the portlet. The portal \/ portlet container\r\n * should expect that the portlet may return binary content for a\r\n * <code>renderResource<\/code> call. * * @param request * the resource request * @param response * the resource response * * @exception PortletException * if the portlet has problems fulfilling the * rendering request * @exception UnavailableException * if the portlet is unavailable to perform render at this time * @exception PortletSecurityException * if the portlet cannot fullfill this request because of security reasons * @exception java.io.IOException * if the streaming causes an I\/O problem *\/ public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException, java.io.IOException; }<\/pre>\n<p style=\"text-align: justify;\">Noi sfrutteremo questo nuova caratteristica per fornire alla <em>view\u00a0<\/em>i dati da mostrare all'interno della combo.<\/p>\n<h1 style=\"text-align: justify;\">5. Implementazione del serverResource<\/h1>\n<p style=\"text-align: justify;\">Partendo dal presupposto che abbiate creato una portlet MVC, vediamo come implementare il metodo\u00a0<em>serverResource()<\/em>. Prima di procedere con il <em>come<\/em>, affrontiamo il <em>cosa<\/em>, ovvero, che tipo di risorsa e quali dati il metodo deve restituire alla <em>view<\/em>?. Ipotizziamo che i dati da voler mostrare sulla combo siano l'insieme di ruoli definiti su Liferay e il formato dei dati da restituire deve essere in formato <em><a class=\"zem_slink\" title=\"JSON\" href=\"http:\/\/json.org\/\" target=\"_blank\" rel=\"homepage noopener\">JSON<\/a><\/em>; detto questo, in breve occorre:<\/p>\n<ol>\n<li>Definire una\u00a0<em>Dynamic Query<\/em> sull'entit\u00e0\u00a0<em>Role;<\/em><\/li>\n<li>La <i>Dynamic Query\u00a0<\/i>deve esplicitare una\u00a0<em>where\u00a0<\/em><i>conditions<\/i>\u00a0di tipo <em>like<\/em><em>\u00a0<\/em>sull'attributo\u00a0<em>name\u00a0<\/em>dell'entit\u00e0\u00a0<em>Role<\/em>;<\/li>\n<li>Utilizzare il\u00a0<em>Local Service Util<\/em><em>\u00a0<\/em>per recuperare i dati dei ruoli applicando il filtro attraverso la\u00a0<em>Dynamic Query<\/em> definita in precedenza;<\/li>\n<li>Preparare l'oggetto\u00a0<em>JSON<\/em>\u00a0contenente i ruoli estratti in precedenza;<\/li>\n<li>Inviare alla\u00a0<em>view\u00a0<\/em>i dati.<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">La\u00a0<em>Dynamic Query\u00a0<\/em>consente di recuperare la lista dei ruoli il cui nome fa \"scopa\" con quanto digitato dall'utente all'interno della combo, per esempio, se l'utente digitasse <em>Site*\u00a0<\/em>allora sarebbe recuperata la lista di ruoli dove ogni item ha l'attributo <em>name<\/em> che inizia con\u00a0<em>Site<\/em>. Cercando di rispettare l'ordine delle\u00a0<em>cose\u00a0<\/em>da fare (visto in precedenza), cercher\u00f2 di mostrare brevemente i pezzi di codice del <em>come<\/em>.<\/p>\n<pre class=\"lang:java decode:true\" title=\"Source 1 - Inizializzazione oggetti JSON.\">JSONObject json = JSONFactoryUtil.createJSONObject();\r\nJSONArray results = JSONFactoryUtil.createJSONArray();\r\njson.put(\"response\", results);<\/pre>\n<p>Source 1 - Inizializzazione oggetti JSON.<\/p>\n<p style=\"text-align: justify;\">Il codice illustrato sopra \u00e8 una semplice inizializzazione degli oggetti\u00a0<em>JSON\u00a0<\/em>(Object e Array)\u00a0utilizzati in seguito come contenitori di dati. Invece, a seguire, al <i>Source 2<\/i> \u00e8 mostrata la definizione e creazione della\u00a0<em>Dynamic Query\u00a0<\/em>secondo le regole descritte in precedenza.<\/p>\n<pre class=\"lang:java decode:true\" title=\"Source 2 - Definzione e creazione della Dynamic Query\">DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Role.class).\r\nadd(PropertyFactoryUtil.forName(\"name\").like(searchPattern));<\/pre>\n<p>Source 2 - Definzione e creazione della Dynamic Query.<\/p>\n<p style=\"text-align: justify;\">Al\u00a0<em>Source 3<\/em>, sono invece mostrati il recupero della lista di ruoli e la successiva preparazione dei dati appena restituiti dal <em>Role Local Service\u00a0<\/em>\u00a0in formato\u00a0<em>JSON<\/em>.<\/p>\n<pre class=\"lang:java decode:true\" title=\"Source 3 - Recupero lista dei ruoli e preparazione dati in JSON.\">List roles = RoleLocalServiceUtil.dynamicQuery(dynamicQuery);\r\nfor (Role role : roles) {\r\nJSONObject listEntry = JSONFactoryUtil.createJSONObject();\r\nlistEntry.put(\"key\", role.getRoleId());\r\nlistEntry.put(\"name\", role.getName());\r\nlistEntry.put(\"description\", role.getDescription());\r\nlistEntry.put(\"type\", role.getType());\r\nresults.put(listEntry);\r\n}<\/pre>\n<p>Source 3 - Recupero lista dei ruoli e preparazione dati in JSON.<\/p>\n<pre class=\"lang:default decode:true\" title=\"Source 4.a - Invio dei dati in formato JSON alla view.\">resourceResponse.setContentType(ContentTypes.APPLICATION_JSON);\r\nPrintWriter writer = resourceResponse.getWriter();\r\nwriter.println(json.toString());<\/pre>\n<p>Source 4.a - Invio dei dati in formato JSON alla view.<\/p>\n<p style=\"text-align: justify;\">Le ultime righe di codice del\u00a0<em>Source 4.a<\/em>\u00a0inviano la lista di ruoli che soddisfano la ricerca verso la\u00a0<em>view<\/em> in formato JSON. La prima riga informa il\u00a0<em>client<\/em> che riceve i dati circa il formato degli stessi. Al\u00a0<em>Source 5<\/em> \u00e8 possibile vedere un esempio di dati inviati alla\u00a0<em>view<\/em>. L'esempio completo della classe\u00a0<em><strong>ViewAUIAutocompleteAjax<\/strong><\/em> che implementa l'<em><strong>MVCPortlet<\/strong><\/em><strong>\u00a0<\/strong>\u00e8 disponibile all'indirizzo\u00a0<a title=\"src\/main\/java\/it\/dontesta\/liferay\/portlet\/ViewAUIAutocompleteAjax.java\" href=\"https:\/\/github.com\/amusarra\/liferay-aui-autocomplete-ajax-example\/blob\/master\/src\/main\/java\/it\/dontesta\/liferay\/portlet\/ViewAUIAutocompleteAjax.java\" target=\"_blank\" rel=\"noopener\" class=\"broken_link\">ViewAUIAutocompleteAjax.java<\/a>. In realt\u00e0 \u00e8 possibile approfittare del metodo\u00a0<em>writeJSON()<\/em> della classe <em>com.liferay.portal.kernel.portlet.LiferayPortlet<\/em> per ottenere lo stesso risultato del codice precedente (vedi <em>Source 4.b<\/em>).<\/p>\n<pre class=\"lang:java decode:true\" title=\"Source 4.b - Invio dei dati in formato JSON alla view.\">writeJSON(resourceRequest, resourceResponse, json);<\/pre>\n<p>Source 4.b - Invio dei dati in formato JSON alla view.<\/p>\n<pre class=\"lang:js decode:true\" title=\"Source 5 - Dati in formato JSON.\">{\r\n    \"response\": [\r\n        {\r\n            \"description\": \"Site Administrators are super users of their site but cannot make other users into Site Administrators.\",\r\n            \"name\": \"Site Administrator\",\r\n            \"type\": 2,\r\n            \"key\": 10153\r\n        },\r\n        {\r\n            \"description\": \"All users who belong to a site have this role within that site.\",\r\n            \"name\": \"Site Member\",\r\n            \"type\": 2,\r\n            \"key\": 10154\r\n        },\r\n        {\r\n            \"description\": \"Site Owners are super users of their site and can assign site roles to users.\",\r\n            \"name\": \"Site Owner\",\r\n            \"type\": 2,\r\n            \"key\": 10155\r\n        }\r\n    ]\r\n}<\/pre>\n<p>Source 5 - Dati in formato JSON.<\/p>\n<h1>6. Implementazione della view<\/h1>\n<p>La <em>view<\/em>\u00a0(che dovrebbe poi essere la jsp <em>view.jsp<\/em>) fondamentalmente si compone di uno script AUI che utilizza i seguenti componenti:<\/p>\n<ol>\n<li>AUI AutoComplete (Alloy UI Modules)<\/li>\n<li>DataSource.IO (YUI Modules)<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">Il primo elemento \u00e8 responsabile della visualizzazione e selezione dell'insieme di dati resi disponibili dal secondo componente di\u00a0<em>datasource<\/em>, quest'ultimo \u00e8 invece responsabile del recupero dei dati inviando la richiesta alla\u00a0<em>resourceURL<\/em> della portlet. Al <i>Source 6<\/i>, \u00e8 mostrato lo script AUI che crea la combo vista precedentemente in <em>Figura 1<\/em>.<\/p>\n<pre class=\"lang:js decode:true\" title=\"Source 6 - AUI Script per l'AutoComplete Ajax\">var dataSource = new A.DataSource.IO(\r\n    {\r\n        source: '&lt;%=ajaxResourceURL %&gt;'\r\n    }\r\n);\r\n\r\nvar autocomplete = new A.AutoComplete(\r\n    {\r\n        dataSource: dataSource,\r\n        delimChar: '',\r\n        contentBox: '#myAutoComplete',\r\n        matchKey: 'name',\r\n        schema: {\r\n        resultListLocator: 'response',\r\n        resultFields: ['key','name','description', 'type']\r\n    },\r\n    uniqueName:'keyword',\r\n    schemaType:'json',\r\n    typeAhead: true,\r\n    cssClass: 'ac_input'\r\n});\r\n\r\nautocomplete.generateRequest = function(query) {\r\n    return {\r\n    request: '&amp;&lt;%=DisplayTerms.KEYWORDS %&gt;=' + query\r\n    };\r\n}\r\n\r\nautocomplete.render();<\/pre>\n<p>Source 6 - AUI Script per l'AutoComplete Ajax.<\/p>\n<p>Nel codice sorgente mostrato al\u00a0<em>Source 6<\/em>, ho voluto evidenziare le righe che ritengo pi\u00f9 rilevanti:<\/p>\n<ol>\n<li>L'attributo\u00a0<em>source<\/em> del componente\u00a0<em>DataSource<\/em>\u00a0impostato al valore della\u00a0<em>resourceURL\u00a0<\/em>della portlet (vedi <em>Source 7<\/em>);<\/li>\n<li>L'attributo\u00a0<em>schema<\/em> del componente di AutoComplete che informa lo stesso circa lo schema della struttura dati JSON restituita;<\/li>\n<li>Il metodo\u00a0<em>generateRequest()<\/em> genera un oggetto che sar\u00e0 poi passato al metodo\u00a0<em>sendRequest()<\/em> del\u00a0<em>DataSource<\/em>. In breve, alla\u00a0<em>resourceURL<\/em> sar\u00e0 \"appeso\" il valore digitato nella combo.<\/li>\n<\/ol>\n<pre class=\"lang:java decode:true \" title=\"Source 7 - Creazione resourceURL della portlet.\">&lt;portlet:resourceURL var=\"ajaxResourceURL\"&gt;\r\n    &lt;portlet:param name=\"&lt;%=Constants.CMD %&gt;\" value=\"&lt;%=ActionKeys.GET_LIFERAY_ROLES %&gt;\"\/&gt;\r\n&lt;\/portlet:resourceURL&gt;<\/pre>\n<p>Source 7 - Creazione resourceURL della portlet.<\/p>\n<p style=\"text-align: justify;\">Ovviamente \u00e8 possibile sfruttare il metodo\u00a0<em>serverResource()<\/em> per eseguire diverse azioni distinte per la stessa portlet, per questo motivo sulla <em>resourceURL\u00a0<\/em>creata (vedi <em>Source 7<\/em>),\u00a0\u00e8 stato impostato un parametro che esplicita l'azione da eseguire. L'esempio completo della\u00a0<em>view<\/em> \u00e8 disponibile all'indirizzo <a title=\"src\/main\/webapp\/view.jsp\" href=\"https:\/\/github.com\/amusarra\/liferay-aui-autocomplete-ajax-example\/blob\/master\/src\/main\/webapp\/view.jsp\" target=\"_blank\" rel=\"noopener\" class=\"broken_link\">view.jsp<\/a><\/p>\n<h1 style=\"text-align: justify;\">7. Conclusioni<\/h1>\n<p style=\"text-align: justify;\">Ancora una volta abbiamo visto come il riutilizzo dei componenti software e il progredire delle tecnologie favoriscono la creazione di qualunque manufatto soprattutto in termini di tempo, quest'ultimo prezioso visto il diminuire del <em>Time to Market<\/em>.<\/p>\n<p style=\"text-align: justify;\">\n<div class='tm-tweet-clear'><\/div>\n<div class='tm-click-to-tweet'>\n<div class='tm-ctt-text'><a href='https:\/\/twitter.com\/share?text=Il+riutilizzo+dei+componenti+software+e+il+progredire+delle+tecnologie+favoriscono+la+creazione+di+ogni+manufatto+favorendo+il+%23TimeToMarket&via=antonio_musarra&related=antonio_musarra&url=https:\/\/www.dontesta.it\/en\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/' target='_blank'>Il riutilizzo dei componenti software e il progredire delle tecnologie favoriscono la creazione di ogni manufatto favorendo il #TimeToMarket<\/a><\/div>\n<p><a href='https:\/\/twitter.com\/share?text=Il+riutilizzo+dei+componenti+software+e+il+progredire+delle+tecnologie+favoriscono+la+creazione+di+ogni+manufatto+favorendo+il+%23TimeToMarket&via=antonio_musarra&related=antonio_musarra&url=https:\/\/www.dontesta.it\/en\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/' target='_blank' class='tm-ctt-btn'>Click To Tweet<\/a><\/p>\n<div class='tm-ctt-tip'><\/div>\n<\/div>\n<p style=\"text-align: justify;\">Il progetto AUI \u00e8 un percorso quasi obbligato per tutti coloro che intraprendono la strada di Liferay e in particolare modo per coloro che sviluppano o avranno intenzione di sviluppare applicazioni che richiedono un livello spinto d'interazione\u00a0<em>uomo-macchina<\/em>. Purtroppo la documentazione a corredo del progetto \u00e8 molto povera e gli esempi presentati non soddisfano mai gli usi reali.<\/p>\n<h6 class=\"zemanta-related-title\" style=\"font-size: 1em;\">Related articles<\/h6>\n<ul class=\"zemanta-article-ul\">\n<li class=\"zemanta-article-ul-li\"><a href=\"http:\/\/navinagarwalmca.wordpress.com\/2012\/07\/12\/spring-3-1-with-liferay-6-1\/\" target=\"_blank\" rel=\"noopener\">Spring 3.1 Portlet with Liferay 6.1<\/a> (navinagarwalmca.wordpress.com)<\/li>\n<li class=\"zemanta-article-ul-li\"><a title=\"Creare progetti Liferay tramite il plugin m2eclipse (Maven for\u00a0Eclipse)\" href=\"https:\/\/www.dontesta.it\/2012\/10\/18\/creare-progetti-liferay-tramite-il-plugin-m2eclipse-maven-for-eclipse\/\" target=\"_blank\" rel=\"noopener\">Creare progetti Liferay tramite il plugin m2eclipse (Maven for Eclipse)<\/a><\/li>\n<li class=\"zemanta-article-ul-li\"><a title=\"Alloy UI\" href=\"http:\/\/www.liferay.com\/community\/liferay-projects\/alloy-ui\/overview\" target=\"_blank\" rel=\"noopener\" class=\"broken_link\">Liferay Alloy UI<\/a> (liferay.com)<\/li>\n<li class=\"zemanta-article-ul-li\"><a title=\"Come gestire l'autocomplete con Liferay 6.2\" href=\"http:\/\/www.marconapolitano.it\/it\/liferay\/46-come-gestire-l-autocomplete-con-liferay-6-2.html\" target=\"_blank\" rel=\"noopener\">Come gestire l'autocomplete con Liferay 6.2<\/a>\u00a0(di <a title=\"Marco Napolitano\" href=\"https:\/\/twitter.com\/batnapo\" target=\"_blank\" rel=\"noopener\">Marco Napolitano<\/a>)<\/li>\n<li class=\"zemanta-article-ul-li\">AlloyUI e applicazioni web\u00a0(di <a title=\"Marco Napolitano\" href=\"https:\/\/twitter.com\/batnapo\" target=\"_blank\" rel=\"noopener\">Marco Napolitano<\/a>)<\/li>\n<\/ul>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>1. Cos&#8217;\u00e8 AlloyUI? AlloyUI (abbreviato in AUI) \u00e8 un\u00a0meta framework\u00a0Open Source realizzato da Liferay che ingloba una serie di librerie javascript fornendo un set di API per la creazione di applicazioni web robuste e&#46;&#46;&#46;<\/p>\n","protected":false},"author":3,"featured_media":3267,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[571,15,22],"tags":[72,90,190,210,637,314,395,439],"class_list":["post-1843","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-content-management-system-cms","category-liferay","category-programming","tag-alloy-ui","tag-aui","tag-java","tag-json","tag-liferay","tag-portlet","tag-user-interface","tag-yui"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Alloy UI AutoComplete Ajax Example<\/title>\n<meta name=\"description\" content=\"Alloy UI \u00e8 un meta framework javascript Open Source realizzato da Liferay che fornisce un set di API per la creazione di applicazioni web robuste e flessibili che toccano i tre livelli del browser: struttura, stile e comportamento.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Alloy UI AutoComplete Ajax Example\" \/>\n<meta property=\"og:description\" content=\"Alloy UI \u00e8 un meta framework javascript Open Source realizzato da Liferay che fornisce un set di API per la creazione di applicazioni web robuste e flessibili che toccano i tre livelli del browser: struttura, stile e comportamento.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/\" \/>\n<meta property=\"og:site_name\" content=\"Antonio Musarra&#039;s Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/antoniomusarrablog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/antoniomusarrablog\" \/>\n<meta property=\"article:published_time\" content=\"2012-12-17T23:58:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-07-13T16:05:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dontesta.it\/wp-content\/uploads\/2015\/03\/screen-shot-2012-12-15-at-22-30-28.png\" \/>\n\t<meta property=\"og:image:width\" content=\"415\" \/>\n\t<meta property=\"og:image:height\" content=\"270\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Antonio Musarra\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@antonio_musarra\" \/>\n<meta name=\"twitter:site\" content=\"@antonio_musarra\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Antonio Musarra\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/\"},\"author\":{\"name\":\"Antonio Musarra\",\"@id\":\"https:\/\/www.dontesta.it\/#\/schema\/person\/0c69ed36230e1477875d6171b48b9b24\"},\"headline\":\"Alloy UI AutoComplete Ajax Example\",\"datePublished\":\"2012-12-17T23:58:20+00:00\",\"dateModified\":\"2017-07-13T16:05:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/\"},\"wordCount\":2537,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.dontesta.it\/#\/schema\/person\/0c69ed36230e1477875d6171b48b9b24\"},\"image\":{\"@id\":\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dontesta.it\/wp-content\/uploads\/2015\/03\/screen-shot-2012-12-15-at-22-30-28.png\",\"keywords\":[\"Alloy UI\",\"AUI\",\"Java\",\"JSON\",\"Liferay\",\"Portlet\",\"User interface\",\"YUI\"],\"articleSection\":[\"Content Management System (CMS)\",\"Liferay\",\"Programming\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/\",\"url\":\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/\",\"name\":\"Alloy UI AutoComplete Ajax Example\",\"isPartOf\":{\"@id\":\"https:\/\/www.dontesta.it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dontesta.it\/wp-content\/uploads\/2015\/03\/screen-shot-2012-12-15-at-22-30-28.png\",\"datePublished\":\"2012-12-17T23:58:20+00:00\",\"dateModified\":\"2017-07-13T16:05:25+00:00\",\"description\":\"Alloy UI \u00e8 un meta framework javascript Open Source realizzato da Liferay che fornisce un set di API per la creazione di applicazioni web robuste e flessibili che toccano i tre livelli del browser: struttura, stile e comportamento.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#primaryimage\",\"url\":\"https:\/\/www.dontesta.it\/wp-content\/uploads\/2015\/03\/screen-shot-2012-12-15-at-22-30-28.png\",\"contentUrl\":\"https:\/\/www.dontesta.it\/wp-content\/uploads\/2015\/03\/screen-shot-2012-12-15-at-22-30-28.png\",\"width\":415,\"height\":270,\"caption\":\"Alloy UI Autocomplete Ajax Example\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.dontesta.it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Alloy UI AutoComplete Ajax Example\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dontesta.it\/#website\",\"url\":\"https:\/\/www.dontesta.it\/\",\"name\":\"Antonio Musarra&#039;s Blog\",\"description\":\"The ideal solution for a problem\",\"publisher\":{\"@id\":\"https:\/\/www.dontesta.it\/#\/schema\/person\/0c69ed36230e1477875d6171b48b9b24\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dontesta.it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.dontesta.it\/#\/schema\/person\/0c69ed36230e1477875d6171b48b9b24\",\"name\":\"Antonio Musarra\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dontesta.it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.dontesta.it\/wp-content\/uploads\/2024\/06\/cropped-foto_profilo.png\",\"contentUrl\":\"https:\/\/www.dontesta.it\/wp-content\/uploads\/2024\/06\/cropped-foto_profilo.png\",\"width\":512,\"height\":512,\"caption\":\"Antonio Musarra\"},\"logo\":{\"@id\":\"https:\/\/www.dontesta.it\/#\/schema\/person\/image\/\"},\"description\":\"I began my journey into the world of computing from an Olivetti M24 PC (http:\/\/it.wikipedia.org\/wiki\/Olivetti_M24) bought by my father for his work. Day after day, quickly taking control until \u2026 Now doing business consulting for projects in the enterprise application development using web-oriented technologies such as J2EE, Web Services, ESB, TIBCO, PHP.\",\"sameAs\":[\"https:\/\/www.dontesta.it\",\"https:\/\/www.facebook.com\/antoniomusarrablog\",\"https:\/\/www.linkedin.com\/in\/amusarra\/\",\"https:\/\/x.com\/antonio_musarra\",\"https:\/\/www.youtube.com\/channel\/UC5D3_EtVPbZYUhrUcEK_THA\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Alloy UI AutoComplete Ajax Example","description":"Alloy UI \u00e8 un meta framework javascript Open Source realizzato da Liferay che fornisce un set di API per la creazione di applicazioni web robuste e flessibili che toccano i tre livelli del browser: struttura, stile e comportamento.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/","og_locale":"en_US","og_type":"article","og_title":"Alloy UI AutoComplete Ajax Example","og_description":"Alloy UI \u00e8 un meta framework javascript Open Source realizzato da Liferay che fornisce un set di API per la creazione di applicazioni web robuste e flessibili che toccano i tre livelli del browser: struttura, stile e comportamento.","og_url":"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/","og_site_name":"Antonio Musarra&#039;s Blog","article_publisher":"https:\/\/www.facebook.com\/antoniomusarrablog","article_author":"https:\/\/www.facebook.com\/antoniomusarrablog","article_published_time":"2012-12-17T23:58:20+00:00","article_modified_time":"2017-07-13T16:05:25+00:00","og_image":[{"width":415,"height":270,"url":"https:\/\/www.dontesta.it\/wp-content\/uploads\/2015\/03\/screen-shot-2012-12-15-at-22-30-28.png","type":"image\/png"}],"author":"Antonio Musarra","twitter_card":"summary_large_image","twitter_creator":"@antonio_musarra","twitter_site":"@antonio_musarra","twitter_misc":{"Written by":"Antonio Musarra","Est. reading time":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#article","isPartOf":{"@id":"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/"},"author":{"name":"Antonio Musarra","@id":"https:\/\/www.dontesta.it\/#\/schema\/person\/0c69ed36230e1477875d6171b48b9b24"},"headline":"Alloy UI AutoComplete Ajax Example","datePublished":"2012-12-17T23:58:20+00:00","dateModified":"2017-07-13T16:05:25+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/"},"wordCount":2537,"commentCount":0,"publisher":{"@id":"https:\/\/www.dontesta.it\/#\/schema\/person\/0c69ed36230e1477875d6171b48b9b24"},"image":{"@id":"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dontesta.it\/wp-content\/uploads\/2015\/03\/screen-shot-2012-12-15-at-22-30-28.png","keywords":["Alloy UI","AUI","Java","JSON","Liferay","Portlet","User interface","YUI"],"articleSection":["Content Management System (CMS)","Liferay","Programming"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/","url":"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/","name":"Alloy UI AutoComplete Ajax Example","isPartOf":{"@id":"https:\/\/www.dontesta.it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#primaryimage"},"image":{"@id":"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dontesta.it\/wp-content\/uploads\/2015\/03\/screen-shot-2012-12-15-at-22-30-28.png","datePublished":"2012-12-17T23:58:20+00:00","dateModified":"2017-07-13T16:05:25+00:00","description":"Alloy UI \u00e8 un meta framework javascript Open Source realizzato da Liferay che fornisce un set di API per la creazione di applicazioni web robuste e flessibili che toccano i tre livelli del browser: struttura, stile e comportamento.","breadcrumb":{"@id":"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#primaryimage","url":"https:\/\/www.dontesta.it\/wp-content\/uploads\/2015\/03\/screen-shot-2012-12-15-at-22-30-28.png","contentUrl":"https:\/\/www.dontesta.it\/wp-content\/uploads\/2015\/03\/screen-shot-2012-12-15-at-22-30-28.png","width":415,"height":270,"caption":"Alloy UI Autocomplete Ajax Example"},{"@type":"BreadcrumbList","@id":"https:\/\/www.dontesta.it\/2012\/12\/18\/alloy-ui-autocomplete-ajax-example\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.dontesta.it\/"},{"@type":"ListItem","position":2,"name":"Alloy UI AutoComplete Ajax Example"}]},{"@type":"WebSite","@id":"https:\/\/www.dontesta.it\/#website","url":"https:\/\/www.dontesta.it\/","name":"Antonio Musarra&#039;s Blog","description":"The ideal solution for a problem","publisher":{"@id":"https:\/\/www.dontesta.it\/#\/schema\/person\/0c69ed36230e1477875d6171b48b9b24"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dontesta.it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.dontesta.it\/#\/schema\/person\/0c69ed36230e1477875d6171b48b9b24","name":"Antonio Musarra","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dontesta.it\/#\/schema\/person\/image\/","url":"https:\/\/www.dontesta.it\/wp-content\/uploads\/2024\/06\/cropped-foto_profilo.png","contentUrl":"https:\/\/www.dontesta.it\/wp-content\/uploads\/2024\/06\/cropped-foto_profilo.png","width":512,"height":512,"caption":"Antonio Musarra"},"logo":{"@id":"https:\/\/www.dontesta.it\/#\/schema\/person\/image\/"},"description":"I began my journey into the world of computing from an Olivetti M24 PC (http:\/\/it.wikipedia.org\/wiki\/Olivetti_M24) bought by my father for his work. Day after day, quickly taking control until \u2026 Now doing business consulting for projects in the enterprise application development using web-oriented technologies such as J2EE, Web Services, ESB, TIBCO, PHP.","sameAs":["https:\/\/www.dontesta.it","https:\/\/www.facebook.com\/antoniomusarrablog","https:\/\/www.linkedin.com\/in\/amusarra\/","https:\/\/x.com\/antonio_musarra","https:\/\/www.youtube.com\/channel\/UC5D3_EtVPbZYUhrUcEK_THA\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.dontesta.it\/en\/wp-json\/wp\/v2\/posts\/1843","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dontesta.it\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dontesta.it\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dontesta.it\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dontesta.it\/en\/wp-json\/wp\/v2\/comments?post=1843"}],"version-history":[{"count":0,"href":"https:\/\/www.dontesta.it\/en\/wp-json\/wp\/v2\/posts\/1843\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dontesta.it\/en\/wp-json\/wp\/v2\/media\/3267"}],"wp:attachment":[{"href":"https:\/\/www.dontesta.it\/en\/wp-json\/wp\/v2\/media?parent=1843"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dontesta.it\/en\/wp-json\/wp\/v2\/categories?post=1843"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dontesta.it\/en\/wp-json\/wp\/v2\/tags?post=1843"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}