|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
[JAVA EE] Prima servlet, aiutatemi a capire :-(
Ciao,
ho appena iniziato a studiare le servlet ma le slide non sono chiarissime... Allora ho creato questa prima servlet di esempio: Codice:
import java.io.IOException; import javax.servlet.*; import javax.servlet.http.*; /** Servlet implementation class servletXGET */ public class servletXGET extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ res = setContentType("text/html"); // Imposta il tipo di contenuto // Preleva lo stream dal response PrintWriter toClient = res.getWriter(); // Invio la pagina html al broswer: toClient.println("<html>"); toClient.println("<title>Esempio di Servlet</title>"); toClient.println("<body>"); toClient.println("</body>"); toClient.println("</html>"); toClient.close(); } } Questa servlet contiene il solo metodo doGet che riceve come parametri un oggetto req di tipo HttpServletRequest ed un oggetto res di tipo HttpServletResponse, chi glieli invia questi oggetti come parametro? il client che accede alla servlet? e cosa rappresentano esattamente? Da quello che ho capito se non solleva le eccezioni dei due tipi indicati il metodo allora imposta il tipo di contenuto come testo o html (gli stò dicendo che invierà materiale html o testuale di fatto?) Poi da quello che ho capito alla riga: PrintWriter toClient = res.getWriter(); preleva lo stream del response (praticamente che fà? mette dentro toClient uno stream scrivente per inviare dati di testo al client?) che tipo di oggetto è PrintWriter ?!?! E poi da quello che ho capito nella parte dopo "crea" la pagina Html che sarà inviata al broswer. Per invocare la servlet potrei fare una pagina web che contiene un link a questa servlet credo e quindi a rigor di logica mi si dovrebbe aprire la pagina generata dalla servlet, giusto? Ora...io stò usando Eclipse...sò che è possibile eseguire le servlet dentro Eclipse...sapete dirmi come? Grazie |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
dentro alla req ci sono i dettagli della chiamata http, chiaramente se invochi così semplicemente la servlet senza aver fatto niente prima avrai poco di interessante dentro, però ad esempio nella response puoi ficcarci dentro informazioni che dovrai poi usare in un altra servlet e li richiamarai dalle req.
Puoi invocare direttamente la servlet dal browser non ti serve avere una pagina html, per farlo da esclipse devi aver associato un runtime di un server, per le servlet basta tomcat altrimenti un application server tipo jboss, dopodichè fai run as->server
__________________
Khelidan |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Sep 2004
Città: Cosenza
Messaggi: 2971
|
Direi che ti servirebbe capire prima di tutto con cosa hai a che fare!
Per capire cos'è una Servlet, ti rimando a wikipedia -> Wikipedia - Servlet Più a monte, ti serve capire almeno a grandi linee il protocollo HTTP, che è un protocollo a livello applicazione, basato sul pattern richiesta/risposta. In parole (molto) povere, secondo il protocollo HTTP, un client fa una richiesta (HttpServletRequest) ad un server, questo, in base alla richiesta, formula una risposta (HttpServletResponse) che invia al client, e così via. Nel caso statico, ovvero di un sito web classico, il client richiede una pagina, quindi la richiesta conterrà un URL, oltre ad alcune informazioni del client (come il browser usato etc); la response sarà la pagina richiesta. In particolare, la richieste possono essere inoltrate in diversi modi, principalmente GET e POST. Il metodo GET è quello usato di default, ad esempio quando vuoi aprire la pagina di Google, fai un GET. Il metodo POST viene usato generalmente quando si inviano dati, ma la differenza ti sarà chiara fra poco... Il tuo scopo, è quello di generare pagine web dinamicamente, ovvero in base alla richiesta dell'utente etc. Ci sono tantissimi esempi in cui è necessario generare dinamicamente; ad esempio, vuoi cercare qualcosa su google... Mettiamoci nel caso più semplice, ovvero in cui ricerchi con una sola parola chiave (cerchiamo servlet). Ciò che fai, è scrivere all'interno di un form, il quale è un oggetto HTML che permette di raccogliere dati ed aggiungerli alla richiesta da mandare al server. Nel nostro caso, tu scrivi "servlet", il form generà una richiesta verso http://www.google.it inviandogli come dato la parola da cercare (servlet appunto). Come lo invia questo dato? E qua la differenza evidente tra GET e POST...usando il metodo GET, i dati vengono inviati direttamente nella richiesta, semplicemente appendendoli all'URL, preceduti dal simbolo "?". Nel caso di google, si genererà una richiesta contenente la stringa: "http://www.google.it/search?q=servlet" (in realtà google ci mette altra roba...ma la base è questa, se la inserisci nel tuo browser, il risultato sarà quello atteso) Come vedi, la prima parte (prima del "?") è l'URL della pagina richiesta, la seconda parte (dopo il "?") sono i dati da spedire, separati, nel caso siano più d'uno, dal simbolo "&". E qua c'è il limite del metodo GET...non si può inviare una stringa troppo lunga, quindi per inviare molte informazioni (tipo un form di registrazione ad un sitoweb) il metodo GET non può essere usato...inoltre, i dati appaiono tranquillamente nella barra degli indirizzi del tuo browser...immagina se si usasse GET per inviare la propria password... Qua entra in gioco POST, che permette di inviare grosse moli di dati. In particolare, una richiesta tramite il metodo POST è formata da un primo messaggio al server in cui si specifica che si sta inviando roba tramite POST, seguito da uno o più pacchetti TCP contenenti la roba da inviare, seguiti da un ulteriore messaggio in cui si avvisa che l'invio è finito... A questo punto, dovresti avere già le idee un po più chiare... Ora torniamo alle Servlet... Una HttpServlet serve fondamentalmente per generare la risposta in maniera dinamica... Le servlet sono gestite da un engine come Tomcat, che si preoccupa di fare in modo che una servlet sia raggiungibile dall'esterno come una pagina web normale...ugualmente, è l'engine che si preoccupa di mandare la request alla Servlet, e di prendere da questa la response da inviare al client. Una servlet, viene inizializzata (metodo init()) la prima volta che viene richiamata da un client...le volte successive sarà già disponibile. Viene distrutta (metodo destroy()) quando il server viene chiuso, oppure quando ha bisogno di liberare memoria... Per il resto, ogni volta che viene richiamata, viene invocato il metodo service, che è un metodo della classe HttpServlet, il quale invoca a sua volta il metodo goGet o doPost in base alla richiesta, passandogli appunto sia la request che la response. Detto ciò, il programmatore di una servlet, deve preoccuparsi soltanto di implementare i metodi doGet e/o doPost (ed eventualmente altri che gli servono, ma restiamo nel caso semplice), producendo una response, a partire dalla request, senza preoccuparsi di altro. Un PrintWriter è un oggetto che premette di scrivere su uno stream di output in maniera molto semplice (ad esempio col metodo println(String s))...una response ha uno stream di output, tramite il quale si può scrivere la pagina web di risposta (come nel tuo esempio). Come ti ho detto serve un engine per far funzionare il tutto...come Tomcat...che ti consiglio di installare... Puoi far funzionare il tutto anche in Eclipse... Ti linko una mia mini guida per configurare Tomcat ed Eclipse (parlo anche di Oracle e Postgres...salta quella parte..) -> Guida Spero di aver dissipato i tuoi dubbi...ti allego un piccolo esempio: pagina html con form che invia l'username alla servlet Codice:
<html> <title>Form di esempio</title> <body> <font size=4>Inserisci il tuo nome</font> <form method=GET action=http://127.0.0.1:8080/miawebapp/PrimaServlet> Username: <input type=text name=username /> <input type=submit value=Invia /> </form> </body> </html> Codice:
import java.io.IOException; import javax.servlet.*; import javax.servlet.http.*; /** Servlet che genera una pagina html usando un parametro della request */ public class PrimaServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res = setContentType("text/html"); // invia una pagina html // Preleva lo stream dalla response PrintWriter toClient = res.getWriter(); // prende il parametro "username" dalla request String username = req.getParameter("username"); // Prepara la pagina html di risposta String html = "<html>" + "<title>Esempio di Servlet</title>" + "<body>" + "<font size=4>Ciao " + username + "!</font>" + "</body>"); "</html>"); toClient.println( html ); toClient.close(); } } Ultima modifica di deadlyomen17 : 31-05-2010 alle 08:27. |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
|
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Ti ringrazio dei chiarimenti.
Comunque già sapevo a cosa servono le servlet, dei metodi get e post e dell'application server (noi dobbiamo usare GlassFish per richiesta del professore: dovremmo vedere anche i JavaBeans che Tomcat non supporta). Comunque mi hai chiarito molto le idee circa l'oggetto PrintWriter e la storia dei metodi init e destroy... Ho Eclipse con installato GlassFish...solo che ho difficoltà ad effettuare il deploy della mia servlet e a farla girare con GlassFish Mi sai dire qualcosa? Grazie |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Allora,
forse non mi sono spiegato bene, io ho già Eclipse e GlassFish installati e configurati (cioè ho fatto proprio scaricare GlassFish ad Eclipse...posso runnarlo e se vado in Firefox e faccio 127.0.0.1:4848 mi si apre la pagina di configurazione di GlassFish...quindi c'è...) ma non riesco a far runnare la mia servlet di esempio... Io ho fatto così: 1) Ho creato un nuovo Dynamic Web Project 2) Ho creato una servlet chiamata Esempio contenente il seguente codice banalissimo Codice:
/* CODICE DEL FILE Esempio.java */ import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Esempio extends HttpServlet { static final long serialVersionUID = 33; public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Io sono un titolo!</title>"); out.println("</head>"); out.println("<body bgcolor=\"white\">"); out.println("<h1>Questa è una prova!</h1>"); out.println("</body>"); out.println("</html>"); } } /* FINE CODICE DEL FILE Esempio.java */ Codice:
Name of the domain started: [domain1] and its location: [/home/andrea/GlassFish-Prelude/glassfishv3-prelude/glassfish/domains/domain1]. Admin port for the domain: [4848]. Codice:
Description Resource Path Location Type HttpServlet cannot be resolved to a type Esempio.java /test/src line 5 Java Problem HttpServletRequest cannot be resolved to a type Esempio.java /test/src line 9 Java Problem HttpServletResponse cannot be resolved to a type Esempio.java /test/src line 10 Java Problem ServletException cannot be resolved to a type Esempio.java /test/src line 11 Java Problem The import javax.servlet cannot be resolved Esempio.java /test/src line 2 Java Problem The import javax.servlet cannot be resolved Esempio.java /test/src line 3 Java Problem Grazie |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
non devi fare run normale devi fare run as server, e verifica che il progetto sia aggiunto a glassfish, dalla tab server di eclipse, tasto destro sul server interessato -> add and remove
__________________
Khelidan |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
beh questo era scontato...ovviamente ho aggiunto il progetto a GlassFish e gli ho detto di runnarmelo sul server
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Quote:
In pratica cosa dovrei provare a fare? Please help me :-( TNX TNX TNX :-) |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
Quote:
__________________
Khelidan |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Nov 2004
Città: Roma
Messaggi: 440
|
Quote:
__________________
Ho fatto affari con: Dasutera77,Fran123,Zibaldone, blade1983, cianuro, nemoRS, DDA, Dexter, Dax86+,... |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Quote:
|
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Nov 2004
Città: Roma
Messaggi: 440
|
Scusa me te glassfish come lo hai installato? Se ci dici in che ambiente stai, magari ti possiamo aiutare dove si trova la directory di installazione di Glassfish.
__________________
Ho fatto affari con: Dasutera77,Fran123,Zibaldone, blade1983, cianuro, nemoRS, DDA, Dexter, Dax86+,... |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Ciao,
allora GlassFish come avevo detto l'ho fatto installare ad Eclipse (visto che non voleva riconoscere la versione che avevo installato autonomamente in precedenza gli ho detto di scaricarlo e di installarlo lui) Comunque uso Linux Ubuntu e GlassFish dovrebbe essere installato nella direcoty: /home/andrea/GlassFish-Prelude/glassfishv3-prelude/ Che devo fare ora :-( Tnx |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Dentro la directory /lib di GlassFish mi pare che non sia presente il file servlet-api.jar che però ho trovato dentro la cartella: /usr/share/java/
Non sò proprio che cavolo fare... Grazie |
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Nov 2004
Città: Roma
Messaggi: 440
|
Quote:
/home/andrea/GlassFish-Prelude/glassfishv3-prelude/modules/servlet-api-2.5.jar ma cmq dai, devi sudare un pò. Fare delle ricerche su internet.Installa, disintalla, leggere i log, ecc. Per fortuna la documentazione della sun (la vecchia e buona Sun ![]() Cmq scarica il file server-api.jar e aggiungilo al /lib , al /modules se non c'e' e vedi se ti funziona. Non succede nulla se sbagli. Se non risolvi, passo al prossimo step.
__________________
Ho fatto affari con: Dasutera77,Fran123,Zibaldone, blade1983, cianuro, nemoRS, DDA, Dexter, Dax86+,... |
|
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Quote:
Allora...servlet-api-2.5.jar dentro /modules non c'è...da dove lo dovrei scaricare? |
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Nov 2004
Città: Roma
Messaggi: 440
|
Se potete, passate a tomcat che magari è più facile e vi posso assicurare che funziona alla grande.
Cmq questo link è il link al sito ufficiale di Glassfish. In questo sub link trovate la versione 3 open source e come potete vedere, avete bisogno della JDK (credo la JRE non basti) versione almeno 1.6.0_17. Vedete con in comando: $java -version se la java vostra rispetta questo vincolo.Per la servlet-api.jar,si dice in giro che ogni application server le contiene e cmq sono specifiche per ogni application server. Ti passo un ultimo link per scaricare la .jar per i servlet ma serve la conferma di qualche altro utente piu esperto di me con eclipse+glassfish per confermarlo: questo è il link Cmq non è detto che il problema è quello che dico io. Se passate a netbeans+tomcat (ambiente in cui sto personalmente lavorando) vi posso dare una mano sicura! ![]()
__________________
Ho fatto affari con: Dasutera77,Fran123,Zibaldone, blade1983, cianuro, nemoRS, DDA, Dexter, Dax86+,... |
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Ciao,
allora pare che NetBeans + GlassFish funzioni senza troppi problemi... Purtuttavia volevo fare un'ultima prova con Eclipse + GlassFish Allora, ho trovato questo file: http://dlc.sun.com.edgesuite.net/glassfish/eclipse/ che installa una versione preconfigurata di Eclipse + GlassFish Ok...installato...e...sorpresa: 1) Continua a darmi quel problema di prima che non mi riconosce le classi come HttpServletRequest 2) Ora se provo ad avviare il server GlassFish mi dice: "GlassFish v3 requires a JDK 1.6 and not a JRE. Please add/select the correct JDK in the Server properties 'Runtime Environment' section." Ma io le JDK le ho installate !!! e non capisco come fare a dire ad Eclipse di vederle... Comunque secondo te è normale che NetBeans funzioni alla grande (almeno pare) e che Eclipse mi dia tutti questi problemi? Cioè con NetBeans + GlassFish (che ho sempre fatto scaricare ed installare a lui automaticamente) ho inserito il codice della mia servlet...gli ho detto di eseguirla e ZAC...apre il broswer e la esegue...pareri? Almeno credo di avere le jdk correttamente installate, se faccio java -version su Win mi dice: Codice:
C:\Users\Andrea>java -version java version "1.6.0_20" Java(TM) SE Runtime Environment (build 1.6.0_20-b02) Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode, sharing) Ultima modifica di e-commerce84 : 01-06-2010 alle 19:22. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:58.