PDA

View Full Version : [JAVA EE] Prima servlet, aiutatemi a capire :-(


e-commerce84
30-05-2010, 18:19
Ciao,
ho appena iniziato a studiare le servlet ma le slide non sono chiarissime...

Allora ho creato questa prima servlet di esempio:


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();
}

}


Ho più di qualche dubbio in merito...

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

khelidan1980
30-05-2010, 19:12
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

deadlyomen17
30-05-2010, 21:51
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 (http://en.wikipedia.org/wiki/Servlet)

Più a monte, ti serve capire almeno a grandi linee il protocollo HTTP (http://en.wikipedia.org/wiki/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 (http://java.sun.com/j2se/1.4.2/docs/api/java/io/PrintWriter.html) è 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 (http://code.google.com/p/lmadb/wiki/ConfigurazioneTomcatOraclePostgres)

Spero di aver dissipato i tuoi dubbi...ti allego un piccolo esempio:

pagina html con form che invia l'username alla servlet

<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>


servlet
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();
}

}

nuovoUtente86
30-05-2010, 22:22
In particolare, una richiesta POST è formata da una prima richiesta GET in cui si specifica che si sta inviando roba tramite POST, seguita da uno o più pacchetti TCP contenenti la roba da inviare, seguiti da un ulteriore GET in cui si avvisa che l'invio è finito...

Le richieste attraverso il metodo POST non prevedono alcun preambolo GET e terminano (come da specifica) con una riga vuota (<crlf><crlf>)

e-commerce84
31-05-2010, 09:05
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

e-commerce84
31-05-2010, 10:01
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 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 */


3) Vado nella view Server di Eclipse e c'è il mio simpatico GlassFish messo in stopped, premo il tastino verde (start the server) e quello si runna ed infatti mi dà il seguente messaggino di conferma:

Name of the domain started: [domain1] and
its location: [/home/andrea/GlassFish-Prelude/glassfishv3-prelude/glassfish/domains/domain1].
Admin port for the domain: [4848].


4) Ora mi metto sulla mia classe Esempio e provo a farla eseguire clickando sul tastino verde che dice: "Run Esempio.java" ma non succede nulla...se vado nella view markers mi segna i seguenti problemi:


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


Perchè ?!?! che significa ?!? l'esempio è banalissimo e dovrebbe essere corretto...mi sai aiutare?

Grazie

coocooche
31-05-2010, 17:55
vedi qua (http://www.webspheretools.com/sites/webspheretools.nsf/docs/HttpServlet%20cannot%20be%20resolved%20to%20a%20type%20when%20adding%20a%20servlet%20using%20Eclipse.) se puoi aiutarti a risolvere.

khelidan1980
31-05-2010, 18:16
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

e-commerce84
31-05-2010, 19:48
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

beh questo era scontato...ovviamente ho aggiunto il progetto a GlassFish e gli ho detto di runnarmelo sul server

e-commerce84
31-05-2010, 19:54
vedi qua (http://www.webspheretools.com/sites/webspheretools.nsf/docs/HttpServlet%20cannot%20be%20resolved%20to%20a%20type%20when%20adding%20a%20servlet%20using%20Eclipse.) se puoi aiutarti a risolvere.

mmm...forse dipende proprio da qualcosa di simile ma non capisco bene cosa devo fare: praticamente quelle API non fanno parte della mia JRE? Io glassfish ce l'ho già installato (me lo ha installato ben bene direttamente Eclipse e se lo provavo a far puntare alla versione standalone che avevo installato prima non funzionava)...

In pratica cosa dovrei provare a fare? Please help me :-(

TNX TNX TNX :-)

khelidan1980
31-05-2010, 21:12
mmm...forse dipende proprio da qualcosa di simile ma non capisco bene cosa devo fare: praticamente quelle API non fanno parte della mia JRE? Io glassfish ce l'ho già installato (me lo ha installato ben bene direttamente Eclipse e se lo provavo a far puntare alla versione standalone che avevo installato prima non funzionava)...

In pratica cosa dovrei provare a fare? Please help me :-(

TNX TNX TNX :-)

ma hai scaricato la versione prelude? Mi sa che richiede java 7...prova con la versione stable di glassfish

coocooche
31-05-2010, 21:44
mmm...forse dipende proprio da qualcosa di simile ma non capisco bene cosa devo fare: praticamente quelle API non fanno parte della mia JRE? Io glassfish ce l'ho già installato (me lo ha installato ben bene direttamente Eclipse e se lo provavo a far puntare alla versione standalone che avevo installato prima non funzionava)...

In pratica cosa dovrei provare a fare? Please help me :-(

TNX TNX TNX :-)
Prima che ti faccio la traduzione, puoi vedere sotto la /lib di glassfish se contiene la libreria servlet-api.jar??? Non riesce a risolvere il package javax.servlet quindi il problema secondo me sta nel caricamento del servlet-api.jar....io uso netbeans con tomcat e ce l'ho sotto {CATALINA_HOME}/lib e il tuo esempio funziona benissimo.

e-commerce84
31-05-2010, 22:58
Prima che ti faccio la traduzione, puoi vedere sotto la /lib di glassfish se contiene la libreria servlet-api.jar??? Non riesce a risolvere il package javax.servlet quindi il problema secondo me sta nel caricamento del servlet-api.jar....io uso netbeans con tomcat e ce l'ho sotto {CATALINA_HOME}/lib e il tuo esempio funziona benissimo.

mmm e come faccio a vederlo esattamente? (cmq forse è come dici te perchè quando ho fatto downlodare ed installare GlassFish ad Eclipse prima di iniziare il download mi diceva proprio che mancava quel jar (almeno così mi sembra di ricordare)

coocooche
31-05-2010, 23:23
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.

e-commerce84
01-06-2010, 05:48
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

e-commerce84
01-06-2010, 07:38
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

coocooche
01-06-2010, 10:13
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
Prova a vedere dentro modules:
/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 ;) ) è immensa. Putroppo sotto mano ho solo tomcat e netbeans. Eclipse non l'ho mai visto e glassfish l'ho isntallato tanto tempo fa e devo dire ho dovuto fare diverse installazione per arrivare a farlo funzionare.
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.

e-commerce84
01-06-2010, 11:14
Prova a vedere dentro modules:
/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 ;) ) è immensa. Putroppo sotto mano ho solo tomcat e netbeans. Eclipse non l'ho mai visto e glassfish l'ho isntallato tanto tempo fa e devo dire ho dovuto fare diverse installazione per arrivare a farlo funzionare.
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.

Guarda...siamo in 3 e sono 2 giorni che stiamo facendo ricerche ed impazzendo...

Allora...servlet-api-2.5.jar dentro /modules non c'è...da dove lo dovrei scaricare?

coocooche
01-06-2010, 13:14
Se potete, passate a tomcat che magari è più facile e vi posso assicurare che funziona alla grande.
Cmq questo link (https://glassfish.dev.java.net/) è il link al sito ufficiale di Glassfish.
In questo sub link (https://glassfish.dev.java.net/downloads/v3-final.html) 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 (http://download.java.net/maven/glassfish/org/glassfish/javax.servlet/3.0-Prelude/)
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! ;)

e-commerce84
01-06-2010, 19:13
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:

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)

khelidan1980
01-06-2010, 20:30
ma che versione di eclipse hai scaricato?quella jee vero?

e-commerce84
01-06-2010, 20:31
ma che versione di eclipse hai scaricato?quella jee vero?

si

coocooche
01-06-2010, 22:27
Almeno credo di avere le jdk correttamente installate, se faccio java -version su Win mi dice:

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)

Ma non hai detto che lavoravi sotto linux/ubuntu?
Cmq se non mi sbaglio, si possono avere anche diverse versioni di jdk installata sullo stesso sistema ed è probabile che eclipse non punti a quello più recente. Dove si vede su eclipse non ti posso aiutare che non conosco eclipse, sorry!

e-commerce84
02-06-2010, 00:06
Ma non hai detto che lavoravi sotto linux/ubuntu?
Cmq se non mi sbaglio, si possono avere anche diverse versioni di jdk installata sullo stesso sistema ed è probabile che eclipse non punti a quello più recente. Dove si vede su eclipse non ti posso aiutare che non conosco eclipse, sorry!

Uso entrambi...ho voluto far la prova se sotto Windows funzionasse...invece dà gli stessi problemi...cmq almeno su Win sono sicuro di aver installato una ed una sola JDK

Vabbè...secondo te NetBeans può essere una valida alternativa ad Eclipse? a questo punto penso che useremo NetBeans e chissene frega di Eclipse...anche se...stò rosicando e voglio risolvere per non sentirmi scemo

DanieleC88
02-06-2010, 01:30
Sicuro che servlet-api.jar (ed eventualmente jsp-api.jar) sia(no) nel CLASSPATH?

e-commerce84
02-06-2010, 10:39
Sicuro che servlet-api.jar (ed eventualmente jsp-api.jar) sia(no) nel CLASSPATH?

ehh come faccio a vederlo ed eventualmente come faccio a mettercele? è questo che non riesco a capire...mi sai dire la procedura esatta?

Grazie

e-commerce84
02-06-2010, 18:44
Pare risolto DOH...bastava inserire il file Javaee.jar nelle librerie del progetto...io pensavo fosse in un classpath generale di Eclipse