La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco.

Presentazioni simili


Presentazione sul tema: "Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco."— Transcript della presentazione:

1 Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco adatte a generazione di interfaccia utente JSP introdotte per facilitare stesura di interfaccia utente –permettono scrittura diretta di codice HTML, anzichè richiedere inserimento di codice in PrintWriter, riga per riga –permettono di inserire codice java (scriptlets) per implementare semplici operazioni

2 Laboratorio di Servizi Web - JSP - Ardissono 2 Java Server Pages - I Volte a semplificare creazione e gestione di pagine dinamiche (sintatticamente simili a PHP e ASP) Combinano markup statico (HTML) con tag di scripting The current time is data.jsp Salvare temporaneamente data.jsp a root di contesto (swebi)

3 Laboratorio di Servizi Web - JSP - Ardissono 3 Java Server Pages - II Basate su tecnologia Servlet Da JSP Web Container genera Servlet S equivalente –S contiene package e imports necessari –S implementa metodo doGet/doPost che crea pagina di output di JSP (usa PrintWriter, definisce formato di output, scrive su PrintWriter per generare codice HTML statico, permette invocazione di metodi java) Generazione e compilazione avvengono a primo richiamo di JSP da parte di client (translation time) Poi ogni richiamo di JSP causa esecuzione di S (run time)

4 Laboratorio di Servizi Web - JSP - Ardissono 4 Translation time e run time JSP Web browser JSP Prima richiesta Risposta generata Servlet Traduzione JSP usa Richieste successive

5 Laboratorio di Servizi Web - JSP - Ardissono 5 Espansione di JSP Web Container implementa interfaccia javax.servlet.jsp.HttpJspPage Da pagina JSP Web Container genera Servlet che estende implementazione di HttpJspPage javax.servlet.jsp.HttpJspPage –public void jspInit(): metodo invocato da Web Container a tempo di inizializzazione di servlet generata –public void jspDestroy(): invocato a tempo di distruzione di servlet –public void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException: ad ogni HTTP request

6 Laboratorio di Servizi Web - JSP - Ardissono 6 Struttura di una JSP A metà tra pagina statica e Servlet. Contiene –codice java racchiuso tra –tag HTML e XML-like –testo,... Categorie di JSP tag –JSP Directives –Scripting elements –Actions The current time is data.jsp

7 Laboratorio di Servizi Web - JSP - Ardissono 7 JSP directives –Es: istruzioni che danno specifiche per generazione di codice effettuata da Web Container quando crea Servlet non producono output per generazione di risposta a invocazione di JSP influenzano intera pagina JSP (non altre pagine di applicazione) Directives: page, include, taglib

8 Laboratorio di Servizi Web - JSP - Ardissono 8 JSP directives - page –Es: JSP può contenere + page directives ma ciascun attributo (eccetto import) può comparire al più una volta Alcuni attributi (vd libro per gli altri) –import: specifica classi da importare per esecuzine di JSP –session: specifica se pagina partecipa ad HttpSession Se session=“true” pagina può usare oggetto implicito session per accedere a dati di sessione utente se session=“false” non si gestisce sessione utente default: session=“true” –errorPage: specifica URL di pagina JSP di applicazione invocata in caso di eccezioni

9 Laboratorio di Servizi Web - JSP - Ardissono 9 JSP directives - include - I specifica che durante generazione di Servlet il Web Container deve includere risorsa specificata fileName: path relativo a contesto di applicazione The current time is swebi JSP-EXsrcWEB-INF

10 Laboratorio di Servizi Web - JSP - Ardissono 10 prova.html

11 Laboratorio di Servizi Web - JSP - Ardissono 11 JSP directives - include - II Contenuto di file incluso è analizzato sintatticamente a translation time si possono includere vari tipi di file: html, jsp, … –Es: esempio.jsp contiene il seguente directive: –inclusa.jsp contiene codice se file modificato, non è garantito che Web Container ricompili automaticamente JSP

12 Laboratorio di Servizi Web - JSP - Ardissono 12 JSP directives - include - III Servlet generata a partire da JSP (circa…) public class esempio extends javax.servlet.jsp.HttpJspPage... { public void _jspService(HttpServletRequest request, HttpServletResponse response) throws … {... out.write(“ \r\n >head>\r\n ….. out.print(“data odierna: “ + new Date()); … out.close(); }... }

13 Laboratorio di Servizi Web - JSP - Ardissono 13 NB: packaging di JSP Potete organizzare le JSP in directory sotto vostro contesto di applicazione ma –directory deve essere leggibile e attraversabile da tutti –la prima JSP invocata per accedere ad applicazione deve stare sotto swebi (se no web container inserisce JSP-EX in path relativi) swebi JSP-EXsrcWEB-INF

14 Laboratorio di Servizi Web - JSP - Ardissono 14 JSP directives - taglib (cenni) Directive taglib permette che pagina JSP utilizzi tag extensions (custom tags) tag extensions: si definiscono tag associati a codice java directive taglib specifica tag library contenente codice java compilato che definisce tag da usare URI di descrittore di libreria di tag Prefisso da usare per identificare tag library

15 Laboratorio di Servizi Web - JSP - Ardissono 15 Scripting elements Permettono di inserire codice java in pagina JSP –dichiarazioni di variabili –dichiarazioni di metodi –scriptlets: blocchi di codice eseguiti quando client richiede pagina JSP –espressioni <%! int anno = 2003; public String saluta(String name) { return “Ciao, “ + name + “!!”; } %> … Ciao, siamo nel Dichiarazioni di variabili e metodi Espressione

16 Laboratorio di Servizi Web - JSP - Ardissono 16 Scripting elements: dichiarazioni di variabili e metodi inserite come elementi globali in Servlet generata variabili inizializzate quando Servlet inizializzata non producono output <%! int anno = 2003; public String saluta(String name) { return “Ciao, “ + name + “!!”; } %> … Ciao, siamo nel Dichiarazioni di variabili e metodi

17 Laboratorio di Servizi Web - JSP - Ardissono 17 Scripting elements: scriptlets - I blocchi di codice java eseguiti a tempo di processamento di richiesta HTTP possono produrre output per client se pagina contiene più scriptlets, questi vengono combinati e Servlet generata li contiene nell’ordine in cui appaiono in JSP

18 Laboratorio di Servizi Web - JSP - Ardissono 18 Scripting elements: scriptlets - II … prova di scriptlet <% for (int i=0; i<5; i++) { out.println(“ciao n. “ + i); } %> testScriptlet.jsp

19 Laboratorio di Servizi Web - JSP - Ardissono 19 Scripting elements: scriptlets - III In JSP si può inserire codice statico in scriptlets, utilizzando statement complessi (con parentesi graffe) … prova di scriptlet complessa <% if (18>= request.getParameter(“age”)) { %> Sei maggiorenne, dunque puoi votare!! Mi spiace, ancora non hai diritto di voto. testScriptlet2.jsp Molto simile a PHP e ASP. Poco leggibile

20 Laboratorio di Servizi Web - JSP - Ardissono 20 Scripting elements: espressioni Permettono di valutare espressioni java (invocazione metodi, valutazione variabili) e inviare risultato a client in output stream (String) Sono scriptlets abbreviate <%! int anno = 2003; public String saluta(String name) { return “Ciao, “ + name + “!!”; } %> … Ciao, siamo nel Espressione

21 Laboratorio di Servizi Web - JSP - Ardissono 21 Scriptlets e JavaBeans Utile per applicazioni molto semplici Se si inserisce troppo codice in JSP –pagine risultano difficili da leggere –si perde separazione tra aspetti di interfaccia e di sviluppo di logica applicativa (obiettivo iniziale di sviluppo di JSP!) Introdotto uso di Java Beans per separare logica applicativa da markup in JSP –JSP include markup HTML e invocazione di metodi su bean –Java Bean implementa codice dei metodi (accesso a DB, …)  meno codice java presente in JSP

22 Laboratorio di Servizi Web - JSP - Ardissono 22 JSP: Architettura Model 1 Web browser Web server JSP JavaBean Web container Web browser request response

23 Laboratorio di Servizi Web - JSP - Ardissono 23 JSP e java beans – acquisizione dati da form In JSP si può dichiarare che si utilizza istanza di classe (JavaBean) per –salvare parametri di richieste HTTP –recuperare valore di tali parametri quando serve dati (parametri) acquisiti attraverso form in JSP vengono “automaticamente” salvati in properties del bean usato da JSP bean serve come raccoglitore di dati acquisiti da form

24 Laboratorio di Servizi Web - JSP - Ardissono 24 Esempio - form parametro “login” parametro “tipoInfo”: no, nomi, cc Invocazione di JSP che usa javaBean (SimpleBean.java)

25 Laboratorio di Servizi Web - JSP - Ardissono 25 Esempio - Estratto di JSP ... … Ciao ! Hai richiesto la seguente operazione: Dichiarazione bean usato Recupera valore property per visualizzaz Visualizza codice interno di operaz scelta Salva valore dei parametri di richiesta HTTP con nome = property di bean

26 Laboratorio di Servizi Web - JSP - Ardissono 26 Esempio - Pagina visualizzata Ciao liliana! Hai richiesto la seguente operazione: nomi

27 Laboratorio di Servizi Web - JSP - Ardissono 27 Esempio : SimpleBean.java package …; public class SimpleBean { private String login; private String tipoInfo; public SimpleBean() { } public void setLogin(String login) {this.login = login; } public String getLogin() {return login; } public void setTipoInfo(String tipoInfo) {this.tipoInfo = tipoInfo;} public String getTipoInfo() {return tipoInfo;} } Properties con nome che coincide con parametri di HTTPServletRequest memorizza login di utente (login) e tipo di info richieste da utente (tipoInfo)

28 Laboratorio di Servizi Web - JSP - Ardissono 28 Commenti … Ciao ! ….. Bean associato a singola JSP (scope=“page”) Salvataggio dati utente: istanza di bean salva variabili di stato localmente ad esecuzione di JSP (se bean vivesse per tutta la sessione utente lo potrebbero usare anche altre JSP per recuperare variabili di stato (vd dopo)

29 Laboratorio di Servizi Web - JSP - Ardissono 29 JSP e java beans – logica applicativa Istanza di Java Bean usata anche per eseguire metodi di gestione di logica applicativa (in base a dati forniti da utente via form HTML) –definizione di metodi aggiuntivi rispetto a quelli di gestione di properties associate ai parametri di richieste HTTP –Tali metodi sono invocati da JSP per gestire richieste utente

30 Laboratorio di Servizi Web - JSP - Ardissono 30 Java Bean Java Bean: Classe che definisce il bean deve seguire standard di definizione dei javaBeans –getXXX di ogni proprietà XXX del javaBean, per leggere valore di property –setXXX di ogni proprietà XXX del javaBean, per assegnare valore a property Logica applicativa può essere implementata definendo metodi di setXXX() e getXXX() che effettuano i servizi necessari

31 Laboratorio di Servizi Web - JSP - Ardissono 31 Gestione logica applicativa - esempio esteso Ciao franca! Hai richiesto la seguente operazione: nomi persone (codice interno: nomi) Valore parametro “tipoInfo” Formato esterno tradotto da bean (logica applicativa)

32 Laboratorio di Servizi Web - JSP - Ardissono 32 Estratto di JSP – esempio esteso ... … Ciao ! Hai richiesto la seguente operazione: (codice interno ) Invocazione metodo di traduzione (logica app)

33 Laboratorio di Servizi Web - JSP - Ardissono 33 OPBean.java - I package application.other; public class OPBean { private String login; private String tipoInfo; public OPBean() { } public void setLogin(String login) {… } public String getLogin() {… } public void setTipoInfo(String tipoInfo) {… } public String getTipoInfo() {… } Properties con nome che coincide con parametri di HTTPServletRequest

34 Laboratorio di Servizi Web - JSP - Ardissono 34 OPBean.java - II public String getOperazione() { String out = ""; if (tipoInfo.equals("no")) out = "nessuna informazione"; else if (tipoInfo.equals("nomi")) out = "nomi persone"; else if (tipoInfo.equals("cc")) out = "conti correnti bancari"; else out = "tipo di informazione non gestita"; return out; } } //chiusura bean Logica applicativa (semplice, ma potrebbe prevedere accesso a DB) NB: metodo usa altri valori inseriti da utente e salvati in Java Bean (variabili di stato) Metodo di gestione di logica applicativa

35 Laboratorio di Servizi Web - JSP - Ardissono 35 JSP Standard actions Tag predefiniti che influenzano comportamento di JSP a run-time e risposta inviata a client. Implementati da tutti i Web Container Associati a codice java che viene inserito da Web Container quando genera Servlet per JSP –jsp:useBean (per invocare oggetti esterni: java bean) –jsp:setProperty (gestione properties di bean) –jsp:getProperty (interrogazione java beans) –jsp:param (parametri richieste HTTP) –jsp:include (inclusione risorse) –jsp:forward (forward a risorse) –jsp:plugin (inclusione applet)

36 Laboratorio di Servizi Web - JSP - Ardissono 36 Standard actions - jsp:useBean Sintassi usata per istanziare JavaBean o per identificare istanza di bean esistente e specificare identificatore scope: specifica visibilità di bean –page: visibilità associata a richiesta specifica di pagina –request: bean associato a richiesta HTTP  visibile ad altre JSP incluse, o a cui si fa forward di richiesta –session: associato a sessione utente –application: visibile da tutte JSP di applicazione

37 Laboratorio di Servizi Web - JSP - Ardissono 37 Uso di istanze di Java Bean in diverse JSP Se scope di Java Bean è session, istanza di java bean creata da prima JSP invocata e usata da altre JSP durante sessione utente Gestione di istanza di Java Bean –Basata su id (“name”) associato a istanza di Java Bean –Tutte le JSP devono usare stesso id con stesso scope –Web Container cerca istanza di bean con id richiesto nell’ambito dello scope specificato da JSP Se lo trova, lo usa come riferimento in esecuzione di JSP Altrimenti lo crea

38 Laboratorio di Servizi Web - JSP - Ardissono 38 jsp:useBean – esempio I ... … Ciao ! Come stai? Hai richiesto la seguente operazione: (codice interno )

39 Laboratorio di Servizi Web - JSP - Ardissono 39 jsp:useBean – esempio II... …... Dichiarazione di bean di nome opBean con proprietà di visibilità Salvo valore di tutti i parametri di richiesta HTTP con nome = property di bean

40 Laboratorio di Servizi Web - JSP - Ardissono 40 jsp:useBean – esempio III... Ciao ! Come stai? Hai richiesto la seguente operazione: (codice interno ) Recupero valore di property “login” di bean (recupero parametro di richiesta…) NB: “operazione” non è parametro di richiesta Invoco metodo di bean che “gestisce” richiesta

41 Laboratorio di Servizi Web - JSP - Ardissono 41 Standard actions - jsp:setProperty setta properties (semplici o indexate - array) di bean per settare proprietà di bean con nome = a parametri di richiesta HTTP – per settare properties specifiche (nome=parametro) – property con nome  da parametri di richiesta HTTP – … vd libro

42 Laboratorio di Servizi Web - JSP - Ardissono 42 Standard actions - jsp:getProperty recupera valore di property di bean (convertendolo in String - toString(), valueOf()) per recuperare valori di richieste salvate in bean per invocare metodi di gestione di logica applicativa – –invoca metodo getOperazione() di bean Se istanza di Java Bean ha scope più ampio di “page”, JSP può recuperare dati memorizzati in precedenti passi di interazione con utente

43 Laboratorio di Servizi Web - JSP - Ardissono 43 Standard actions - jsp:include - I permette inserimento di risorsa statica o dinamica specificata da URL in JSP inclusione risorsa effettuato a request processing time  meno efficiente di directive include, ma adatto a includere risorse che cambiano spesso NB: Buffer usato da printWriter per mantenere dati temporanei da inviare a browser (si può scegliere dimensione minima di buffer da imporre a Web Container, che può allocare un buffer di tale dimensione o più grande) Permette specifica di ulteriori parametri rispetto a richiesta HTTP originale

44 Laboratorio di Servizi Web - JSP - Ardissono 44 Standard actions - jsp:include - II pagina inclusa può accedere a JSPWriter object, non può settare cookies o headers flush: specifica se buffer di output deve essere ripulito prima di includere la pagina o meno flush: default=false. Se true, buffer “flushed” prima di inclusione di pagina (  non si può fare forward ad altre risorse o usare error pages) jsp:include  directive include –con directive include, risorsa inclusa a translation time e web container fa compilare la pagina ottenuta –con jsp:include inclusione fatta a run time, no precedente compilazione. Adatto a includere Servlet java

45 Laboratorio di Servizi Web - JSP - Ardissono 45 Standard actions - jsp:param usato in jsp:include e jsp:forward per invocare risorse aggiungendo parametri rispetto a quelli di HttpServletRequest originale specifica nuovi attributi come coppie

46 Laboratorio di Servizi Web - JSP - Ardissono 46 Esempio di uso di java bean Sviluppiamo applicazione “Prova” che –tramite form HTML permette a utente di richiedere 3 servizi: nessuna informazione (no), nomi persone (nomi) o dati su conti correnti bancari (cc) –Form HTML invoca (post) JSP di gestione dei servizi –JSP invoca bean per gestire il servizio richiesto, passando scelta utente come parametro, e raccoglie risultato da visualizzare in pagina per browser utente –bean traduce richiesta utente da codice interno a esterno Es: da cc a conti correnti bancari, da no a nessuna informazione –NB: metodi di bean potrebbero essere più complessi, e.g., accesso a DB per recupero dati

47 Laboratorio di Servizi Web - JSP - Ardissono 47 Invocazione JSP da form HTML parametro “login” parametro “tipoInfo”: no, nomi, cc

48 Laboratorio di Servizi Web - JSP - Ardissono 48

49 Laboratorio di Servizi Web - JSP - Ardissono 49 Esempio di inclusione di Servlet …

50 Laboratorio di Servizi Web - JSP - Ardissono 50 Standard actions - jsp:forward - I permette invio di richiesta ad altra risorsa di applicazione (pagina HTML, JSP, Servlet) flusso di esecuzione passa a risorsa invocata buffer viene ripulito prima di forward (non si fa merge di output delle due risorse) equivalente a metodo forward() di javax.servlet.RequestDispatcher Permette specifica di ulteriori parametri rispetto a richiesta HTTP originale

51 Laboratorio di Servizi Web - JSP - Ardissono 51 Standard actions - jsp:forward - II <% if (request.getParameter("login").equals(“raf”))  %>

52 Laboratorio di Servizi Web - JSP - Ardissono 52 Standard actions - jsp:plugin Permette di includere java applet in pagine generate da JSP vd libro

53 Laboratorio di Servizi Web - JSP - Ardissono 53 Oggetti Java impliciti request: rappresenta oggetto HttpServletRequest che ha originato invocazione di metodo service(). Visibilità: a livello di singola richiesta HTTP response: oggetto HttpServletResponse che rappresenta risposta a richiesta HTTP. Visibilità: a livello di pagina session: oggetto HttpSession generato da connessione di client. Visibilità: a livello di sessione config: oggetto ServletConfig associato a JSP queste variabili (e altre) possono essere usate esplicitamente in JSP perchè create a translation time (anche ASP etc. hanno “request”, “session”, …)

54 Laboratorio di Servizi Web - JSP - Ardissono 54 Commenti JSP adatte a sviluppo di interfaccia utente di applicazioni –facilitano specifica di layout di pagine –nascondono in parte dettagli implementativi di applicazioni web JSP non adatte a gestione di logica applicativa –inserimento di troppo codice java in pagina JSP causa poca leggibilità del codice –compilazione di pagine evidenzia errori in codice di pagine in modo indiretto (compilazione avviene su Servlet espansa, non su JSP)  difficile fare debugging

55 Laboratorio di Servizi Web - JSP - Ardissono 55 Architettura Model 1 – page centric In architettura Model 1 interfaccia utente composta di una o più JSP –utente carica JSP home page di servizio –esecuzione JSP invoca metodi di JavaBean per generare parti dinamiche di pagina da visualizzare su browser utente –pagina visualizzata include bottoni e link per continuare interazione –a seconda di azione utente, JSP opportuna viene invocata –continua in modo simile

56 Laboratorio di Servizi Web - JSP - Ardissono 56 Model 2 JSP hanno RequestDispatcher e offrono istruzioni –include per includere risorse (pagina HTML, Servlet) –forward per delegare risorse a gestione richiesta HTTP Per sviluppo di applicazioni complesse, meglio combinare JSP e Servlet (e pagine statiche) –JSP e pagine statiche per gestione interazione con utente –Servlet per gestione di attività di backend –combinazione basata su pattern Model View Controller (Model 2) ssj-jspmvc.html

57 Laboratorio di Servizi Web - JSP - Ardissono 57 JSP: Architettura Model 2 Web server (controller) Servlet Web container request response (view) JSP (Model) JavaBean 2 instantiate 4

58 Laboratorio di Servizi Web - JSP - Ardissono 58 Architettura Model 2 Servlets per gestire logica applicativa JSP per generare presentation layer Servlet –intercetta richieste utente (post, …) –in base a valore di parametri di richiesta decide a quale JSP forwardare richiesta –crea java beans necessari a JSP JSP –recupera oggetti e beans creati da Servlet –estrae da oggetti contenuto dinamico da visualizzare in pagina da inviare a browser utente

59 Laboratorio di Servizi Web - JSP - Ardissono 59 Architettura Model 2 – Esempio Music without borders: negozio elettronico Interfaccia utente realizzata con diverse JSP che generano porzioni diverse di interfaccia –es: pagina principale include JSP di visualizzazione di carrello spesa –pagina di checkout (chiusura interazione) Servlet gestisce flusso di interazione scegliendo JSP a cui forwardare richieste utente ad ogni passo

60 Laboratorio di Servizi Web - JSP - Ardissono 60 Music without borders – pagina principale - I

61 Laboratorio di Servizi Web - JSP - Ardissono 61 Music Without Borders CD: Yuan | The Guo Brothers | China | $14.95 … Ibuki | Kodo | Japan | $13.95 Quantity: Include JSP di carrello spesa: visualizza prodotti già scelti Music without borders – pagina principale - II

62 Laboratorio di Servizi Web - JSP - Ardissono 62 Music without borders – pagina principale - III

63 Laboratorio di Servizi Web - JSP - Ardissono 63 <% Vector buylist = (Vector) session.getValue("shopping.shoppingcart"); if (buylist != null && (buylist.size() > 0)) { %> ALBUM ARTIST … QUANTITY ….

'> Music without borders – pagina carrello - I

64 Laboratorio di Servizi Web - JSP - Ardissono 64 Music without borders – pagina carrello NB: questo codice è vecchio, parziale e potrebbe contenere errori… vediamolo solo per capire come si integrano Servlet e JSP in Model 2

65 Laboratorio di Servizi Web - JSP - Ardissono 65 public class ShoppingServlet extends HttpServlet { … … public void doPost (…) throws … { HttpSession session = req.getSession(false); if (session == null) {forward a pagina error.html);} Vector buylist = (Vector)session.getValue("shopping.shoppingcart"); String action = req.getParameter("action"); if (action.equals("DELETE")) {elimina item da carrello (buyList);} else if (action.equals("ADD")) {aggiunge item a carrello;} session.putValue("shopping.shoppingcart", buylist); String url="/jsp/shopping/EShop.jsp"; ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher(url); rd.forward(req, res); } else if (action.equals(“CHECKOUT”) … Music without borders – Servlet (controller) - I Forward a pagina principale (Eshop.jsp)

66 Laboratorio di Servizi Web - JSP - Ardissono 66 else if (action.equals("CHECKOUT")) { amount = calcola prezzo da pagare;} req.setAttribute("amount",amount); String url="/jsp/shopping/Checkout.jsp"; ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher(url); rd.forward(req,res); } } // fine servlet Music without borders – Servlet (controller) Invia controllo a pagina Di checkout (Checkout.jsp)


Scaricare ppt "Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per programmare applicazioni Server side complesse, ma poco."

Presentazioni simili


Annunci Google