Trasformare una Java (Console) Application in una Web Application (con utilizzo di un database MySQL)



Похожие документы
Laboratorio di sistemi Prima Web Application JSP [Java]

Laboratorio di sistemi MVC versione 2 Jsp (NetBeans)

1 Gestione dell utente connesso in sessione con Java Server Pages, Java Beans, Servlet

SERVLET & JSP DISPENSE

Laboratorio di Sistemi Fattoriale di un numero Jsp [Java]

Introduzione all uso di Eclipse

Programmazione server-side: Java Servlet

Tomcat & Servlet. Contenuti. Programmazione in Ambienti Distribuiti. Tomcat Applicazioni Web. Servlet JSP Uso delle sessioni

Tale attività non è descritta in questa dispensa

<html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>jsp Page</title> </head> <body>

Laboratorio di Sistemi Programmare in Php con NetBeans Php. Programmare in Php con Xampp e NetBeans IDE

Note pratiche sullo sviluppo di servlet (I)

Tutorial web Application

Eclipse. Avviare un progetto e compilare un semplice programma

Basi di dati e Web (Moduli: Laboratorio e Siti Web centrati sui Dati) Prova scritta del 14 luglio 2008

Applicazioni web. Sommario. Parte 6 Servlet Java. Applicazioni web - Servlet. Alberto Ferrari 1. Servlet Introduzione alle API ed esempi

Istruzioni per l installazione del software per gli esami ICoNExam (Aggiornate al 15/01/2014)

Tener traccia del client

Installazione e configurazione di Java DB in Windows (7)

Gestire le sessioni con le Servlet

Laboratorio di sistemi SELECT e checkbox Jsp [Java]

D R O P B O X COS È DROPBOX:

GRUPPO CAMBIELLI. Posta elettronica (Webmail) Consigli di utilizzo

MAUALE PIATTAFORMA MOODLE

Architettura MVC-2: i JavaBeans

Introduzione alla programmazione Http lato server in Java

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

TUTORIAL PUBBLICARE e INVIARE CIRCOLARI (v 1.5) -- PRIMA FASE -- PUBBLICAZIONE DI UNA CIRCOLARE (e suoi eventuali allegati)

Architetture Web: un ripasso

Laboratorio di sistemi Web Application in Php5 Php

Laboratorio di Basi di Dati e Web

La prima applicazione Java con NetBeans IDE. Dott. Ing. M. Banci, PhD

Laboratorio di Basi di dati

Esercitazione 4 JDBC

CREARE UN NUOVO ARTICOLO

COMUNICAZIONE UTENTI SISTEMI-PROFIS INSTALLAZIONE GE.RI.CO e PARAMETRI2015

Manuale Operativo per l utilizzo della piattaforma E-Learning@AQ. Versione 1.1

Osservazioni. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2005/06-1

Applicazioni distribuite

Il sofware è inoltre completato da una funzione di calendario che consente di impostare in modo semplice ed intuitivo i vari appuntamenti.

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

STAMPA UNIONE DI WORD

A destra è delimitata dalla barra di scorrimento verticale, mentre in basso troviamo una riga complessa.

Modulo. Programmiamo in Pascal. Unità didattiche COSA IMPAREREMO...

Innanzitutto andiamo sul sito ed eseguiamo il download del programma cliccando su Download Dropbox.

Il Web-Service SDMX dell ISTAT

File, Modifica, Visualizza, Strumenti, Messaggio

Progetto di Ingegneria del Software 2. SWIMv2

Vi ricordiamo che per qualsiasi problema tecnico o informazione potete contattare info@eduitalia.org oppure Francesco al

Eclipse - Nozioni Base

Corso Eclipse. Prerequisiti. 3 Window Builder

Guida all utilizzo del compilatore lcc-win32 per creare una applicazione console

IL MIO PRIMO SITO: NEWS

MODULO DOMANDE INDICE

Dipartimento di Ingegneria Civile e Ambientale TYPO 3 MANUALE UTENTE

Servlet API. Programmazione in Ambienti Distribuiti A.A

Excel. A cura di Luigi Labonia. luigi.lab@libero.it

Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti:

START Easy GO! Il gestionale sempre in tasca! Procedura di aggiornamento. Documentazione utente Pagina 1 di 18

Che cos'è un modulo? pulsanti di opzione caselle di controllo caselle di riepilogo

POSTA ELETTRONICA Per ricevere ed inviare posta occorrono:

Guida Rapida all uso del License Manager di ROCKEY4Smart (V )

Guida all uso di Java Diagrammi ER

Introduzione. Macro macro istruzione. Sequenza di comandi memorizzati programma

Breve guida a Linux Mint

I TUTORI. I tutori vanno creati la prima volta seguendo esclusivamente le procedure sotto descritte.

Introduzione JDBC interfaccia java.sql driver caricare i driver

L amministratore di dominio

Scaletta. Estensioni UML per il Web. Applicazioni web - 2. Applicazioni web. WAE: Web Application Extension for UML. «Client page»

Word Libre Office. Barra degli strumenti standard Area di testo Barra di formattazione

NAVIGAZIONE DEL SI-ERC: UTENTE PROGETTISTA

Modulo 4 Il pannello amministrativo dell'hosting e il database per Wordpress

Mac Application Manager 1.3 (SOLO PER TIGER)

Corso Eclipse. Prerequisiti. 1 Introduzione

Università degli Studi di Modena e Reggio Emilia. Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB. Http con java, URL

Lezioni di Laboratorio sui Data Base

Guida all uso dell ambiente di sviluppo 1 integrato o IDE. JCreator LE 4.50

REGISTRO DELLE IMPRESE

Tutorial sugli ambienti di sviluppo: Eclipse e NetBeans

AVVIO ANNO. Dalla base dati EDT alla base dati PRONOTE. L essenziale da sapere per affrontare un nuovo. Preparare i dati per PRONOTE

TUTORIAL PER UTILIZZO CATALOGO RICAMBI WEB

Eleonline gestione dello spoglio elettorale

Istruzioni per la configurazione di IziOzi

MANUALE PER LA GESTIONE DEL SERVIZIO DI NEWSLETTER

MANUALE UTENTE INFOCAR REPAIR ACCESSO SMARTPHONE/TABLET

Breve introduzione al Javadoc

Tutte le interrogazioni possono essere condotte su qualsiasi campo della banca dati (ad esempio, Forma, Frequenza, Lunghezza, ecc...).

Laboratorio Progettazione Web PHP e FORMs HTML. Andrea Marchetti IIT-CNR andrea.marchetti@iit.cnr.ita 2013/2014

Tabelle di riferimento Pulsanti Inserire documento Predisposizione doc Approvazione Doc Numerazione Doc Pubblicazione Albo Webservice

ISTR- XX Uso del Blog

Manuale Intesa. Guida all apertura di un ticket di assistenza online

Introduzione. Installare EMAS Logo Generator

IMPOSTARE UNA MASCHERA CHE SI APRE AUTOMATICAMENTE

Транскрипт:

Pag. 1/12 Trasformare una Java (Console) Application in una Web Application (con utilizzo di un database MySQL) Prendiamo in esame un qualsiasi progetto NetBeans tra quelli studiati che fa uso di un database MySQL (nel nostro caso il database si chiama studenti_db e contiene le classiche tabelle studenti_tbl e classi_tbl). Riporto di seguito lo schema ER che abbiamo usato in classe in diverse occasioni. Fig. 1: Diagramma ER con le entità Studente e ClasseScol L'applicativo da cui partiamo per dimostrare la tesi contenuta nel titolo di questo articolo si chiama StudentiJavaApp. Si tratta di un applicativo classico nel senso che l'output è la console, quindi in effetti è poco utile nella pratica. L'applicativo è organizzato come si può vedere nella figura. La classe ClasseScol mappa la tabella classi_tbl e la classe Studente mappa la tabella studenti_tbl. Fig. 2: Struttura dell'applicazione, delle classi e dei package

Pag. 2/12 L'interfaccia IDAO contiene tutti i metodi necessari al corretto funzionamento dell'applicativo e soddisfa a diverse richieste (per esempio, esiste un metodo che individua l'elenco degli studenti appartenenti a una certa classe, come pure esiste un metodo che conta le classi con più di 3 studenti ecc) mentre la classe DAO è una implementazione concreta dei metodi dell'interfaccia IDAO. Torno a ripetere che l'interfaccia IDAO non è strettamente necessaria ma serve solo a impedire che lo studente alteri di sua iniziativa i nomi dei metodi dell'interfaccia. La classe Main sostanzialmente ci serve per fare i test necessari. Quello che dobbiamo fare, in sintesi, è trasformare la classe DAO in una Servlet in modo da eseguirla direttamente sul server ottenendo dal server in una pagina web i risultati desiderati. Procedo come segue: creo innanzitutto un'applicazione web In NetBeans, scelgo File > New Project > Web Application Fig. 3: Step 1: Java Web > Web Application

Pag. 3/12 Fig. 4: Step2: Nome dell'applicazione (consiglio di aggiungere il suffisso WebApp per ricordare che si tratta questa volta di un'applicazione web)

Pag. 4/12 Fig. 5: Step 3: Scelta del server web (java) Tomcat che risponderà alle richieste del client. Vi ricordo che Tomcat dispone di un JDK perchè è necessario che i file.java vengano compilati (ottenendo dei file.class) Nella schermata successiva (che qua non appare), salto la voce Framework e scelgo Finish. A questo punto tutto quello che devo fare è copiare nel nuovo progetto tutti i package del progetto StudentiJavaApp (con un banale copia-incolla dei file). Seleziono tutti i package del progetto StudentiJavaApp col CTRL e faccio copia; poi vado nel nuovo progetto StudentiWebApp e in Source Packages faccio incolla.

Pag. 5/12 La situazione quindi è la seguente: Fig. 6: Ecco i package copiati (dentro ovviamente ci sono le classi che ci interessano) Ho copiato anche il package main (con all'interno la classe Main) per comodità, perchè poi userò parte del codice di questa classe, nella Servlet che devo ancora creare. Creo ora la Servlet (tasto destro del mouse sul progetto StudentiWebApp e scelgo New > Servlet). Mantenete le impostazioni della figura seguente:

Pag. 6/12 Fig. 7: Creazione della Servlet DAOServlet. Conviene inserire la Servlet in un package apposito

Pag. 7/12 La Servlet va registrata (cioè le va assegnato un nome interno) e poi occorre specificare un URL con il quale richiamarla (la registrazione per fortuna è automatica: NetBeans memorizza queste informazioni nel file web.xml, contenuto nella directory WEB-INF). Premo Finish e in tal modo termina la procedura di creazione della Servlet. NetBeans crea per me uno scheletro di Servlet che è il seguente (ho solo aggiunto in alto il nome e decommentato gli output del metodo processrequest()): /* * DAOServlet.java */ package it.itiscastelli.servlet; import java.io.ioexception; import java.io.printwriter; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; Fig. 8: Registrazione della Servlet /** * @author maurizio */ public class DAOServlet extends HttpServlet { /** * Processes requests for both HTTP <code>get</code> and <code>post</code> methods. * @param request servlet request

Pag. 8/12 * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ protected void processrequest(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html;charset=utf-8"); PrintWriter out = response.getwriter(); try { out.println("<html>"); out.println("<head>"); out.println("<title>servlet DAOServlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>servlet DAOServlet at " + request.getcontextpath () + "</h1>"); out.println("</body>"); out.println("</html>"); } } finally { out.close(); } // <editor-fold defaultstate="collapsed" desc="httpservlet methods. Click on the + sign on the left to edit the code."> /** * Handles the HTTP <code>get</code> method. * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { processrequest(request, response); } /** * Handles the HTTP <code>post</code> method. * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { processrequest(request, response); } /** * Returns a short description of the servlet. * @return a String containing servlet description */ @Override public String getservletinfo() {

Pag. 9/12 return "Short description"; }// </editor-fold> } Probabilmente mi verrebbe in mente di aggiungere alla Servlet il metodo init() per aprire la connessione al database e il metodo destroy() per chiudere la connessione. Questo però può causare dei problemi! I motivi sono documentati all'indirizzo: http://www.codestyle.org/java/servlets/faq-lifecycle.shtml FAQ: Q: Should I get my database connection in the init() method? R. If you create a single database connection in the init(servletconfig) method and use it to all handle servlet requests, you must ensure all operations are synchronized or you will get unpredictable results. Cioè potrei ottenere risultati imprevedibili perchè dovrei assicurarmi che tutte le richieste dei client siano tra loro sincronizzate (ogni richiesta proveniente da un client è un thread distinto). Per agire in maniera corretta, occorrerebbe usare un pool di connessioni (i pool di connessioni sono un argomento complesso per cui rimandiamo lo studio di questo argomento). Quindi apriamo e chiudiamo la connessione nel momento in cui arriva la richiesta (cioè lo faremo nel metodo processrequest()). Vi ricordo che il solo attributo che devo usare è l'oggetto conn di tipo Connection. Poi copio all'interno della Servlet tutti gli altri metodi previsti in origine dalla classe DAO. Abbiamo quasi terminato. Ora nel metodo processrequest() aggiungo, copiandolo in parte dal metodo main() della classe Main, il codice che risolve il mio problema (per esempio, voglio l'elenco degli studenti di 5N). out.println("elenco studenti classe 5N"); // apro la connessione col db this.apriconn(); Map<String, Studente> studenti5n = this.trovastudentiperclasse("5n"); for (Studente s : studenti5n.values()) out.println(s.tostring()); chiudiconn(); Devo ricordarmi di togliere la parola System dal codice che ho copiato, perchè in questo contesto non ha senso. Bisogna usare invece un oggetto di tipo PrintWriter (che in questo contesto si chiama out) il quale provvede a inviare l'output nella pagina web. Formattiamo meglio il codice precedente facendo in modo di avere un elenco puntato. out.println("elenco studenti classe 5N"); this.apriconn(); Map<String, Studente> studenti5n = this.trovastudentiperclasse("5n"); out.println("<ul>"); for (Studente s : studenti5n.values()) out.println("<li>"+s.tostring()+"</li>"); out.println("</ul>"); this.chiudiconn(); Se l'applicativo non parte, potrebbe voler dire che avete dimenticato di aggiungere i driver del database MySQL o che non avete lanciato il database server MySQL oppure che avete lanciato il file sbagliato (index.jsp): occorre lanciare invece la Servlet (tasto destro del mouse sulla

Pag. 10/12 Servlet > Run). Fig. 9: Risultato dell'esecuzione della Servet DAOServlet L'URL (in questa figura poco visibile) è http://localhost:8084/studentiwebapp/daoservlet Per vostra comodità, ho allegato al post sul mio sito, in un unico file zip, entrambi gli applicativi (StudentiJavaApp e StudentiWebApp), oltre al file di generazione del database (studenti.sql). Un altro modo altrettando efficace consiste nell'immergere il codice Java direttamente nel codice HTML della pagina web evidenziandolo con dei marcatori (<% e %>). Ciò ci consente inoltre di selezionare da una casella a scorrimento una classe scolastica e di avere in output l'elenco degli studenti relativi alla classe scelta. Riportiamo di seguito il codice commentato della pagina web index.jsp e ricordiamo che Tomcat provvederà a generare in automatico il sorgente di una Servlet (di solito si chiama index_jsp.java), provvederà a compilarla e a generare il file.class che andrà in esecuzione sul server. Al codice della classe DAO è stato aggiunto un nuovo metodo, il metodo trovaclassi() che restituisce la lista di tutte le classi scolastiche.

Pag. 11/12 File index.jsp <%-- Document : index Created on : 4-mar-2010, 17.55.36 Author : maurizio --%> <%@page contenttype="text/html" pageencoding="utf-8"%> <%@page import="it.itiscastelli.dao.dao" %> <%@page import="it.itiscastelli.classi.*" %> <%@page import="java.util.*" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>jsp Page</title> </head> <body> <h1>hello World!</h1> <% // istanzio un oggetto di tipo DAO DAO dao = new DAO(); // apro la connessione al database dao.apriconn(); // carico le classi e successivamente creo una combo box // con i dati delle classi List<ClasseScol> classi = dao.trovaclassi(); %> <form name="frmprova" action="${request.requesturi}" method="get"> <p> <select name="mnuclassi"> <% for (ClasseScol c : classi) { %> <!-- caricamento delle classi nella combobox mnuclassi --> <option><%=c.getsigla() %></option> <% } // fine for %> </select> <input type="submit" name="btninvia" value="invia"/> </p> </form> <% // se l'utente ha premuto il tasto Invia if (request.getparameter("btninvia")!=null) { // lettura della sigla della classe String siglac = request.getparameter("mnuclassi"); out.println("elenco studenti "+siglac);

Pag. 12/12 // il metodo restituisce una mappa degli studenti appartenenti alla classe // selezionata precedentemente Map<String, Studente> studentiperclasse = dao.trovastudentiperclasse(siglac); } // genero una lista non ordinata out.println("<ul>"); for (Studente s : studentiperclasse.values()) out.println("<li>"+s.tostring()+"</li>"); out.println("</ul>"); // chiudo la connessione col db dao.chiudiconn(); %> </body> </html> Fig 1: Risultato dell'esecuzione dell'applicativo StudentiWebApp2