PDA

Visualizza la versione completa : [JAVA] Scrivere una servlet su Eclipse


cristal
07-07-2009, 15:26
Ciao a tutti...volevo chiedervi, sto seguendo la guida:

http://java.html.it/articoli/leggi/1752/tomcat-lapplicazione-e-servita/3/

come vedete, c'è il codice di una servlet.

Ora vorrei creare il file che contenga questa servlet per poi deployarla su Tomcat. Ho scaricato Eclipse, ma non riesco a capire come devo fare per scriverla...e in che formato salvarla.

Sapreste dirmi qualcosa in merito?

Grazie...

cristal
07-07-2009, 17:37
Allora...ho eseguito questa esaurientissima guida:

http://java.html.it/articoli/leggi/2047/usare-eclipse-per-applicazioni-web/1/

che spiega come creare una applicazione web con eclipse. L'applicazione fa inserire nome, cognome, età, e tramite una jsp risponde con una tabella con il nome, cognome, età inseriti.

mi trovo con tutto tranne che per il funzionamento finale...Ho fatto il deploy su Tomcat, lancio l'applicazione, mi fa inserire nome cognome età e quando premo su invia mi esce questa schermata:


HTTP Status 500 -

--------------------------------------------------------------------------------

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.io.FileNotFoundException: .\webapps\MySimpleWebApplication\WEB-INF\etc\users.txt (Impossibile trovare il percorso specificato)
java.io.FileOutputStream.openAppend(Native Method)
java.io.FileOutputStream.<init>(Unknown Source)
java.io.FileOutputStream.<init>(Unknown Source)
java.io.FileWriter.<init>(Unknown Source)
dati.UserIO.addItem(UserIO.java:11)
controller.SimpleController.doGet(SimpleController .java:40)
javax.servlet.http.HttpServlet.service(HttpServlet .java:690)
javax.servlet.http.HttpServlet.service(HttpServlet .java:803)


note The full stack trace of the root cause is available in the Apache Tomcat/6.0.6 logs.

Cosa vuol dire?

grazie...

andbin
07-07-2009, 17:54
Originariamente inviato da cristal
java.io.FileNotFoundException: .\webapps\MySimpleWebApplication\WEB-INF\etc\users.txt (Impossibile trovare il percorso specificato)

Cosa vuol dire?Che evidentemente il path non è appropriato! Nel senso che il path che hai usato è relativo alla directory corrente ma .... quale è la directory corrente?? Non lo sai a priori, dipende dal servlet container/application server!!

Puoi usare getRealPath() di ServletContext per ottenere un path reale sul file-system locale in base ad un path riferito alla root del tuo contesto.

Per chiarire, se chiedi il real path di "/WEB-INF/etc/users.txt" puoi ottenere ad esempio "C:\......\tomcat\webapps\nomeTuaApp\WEB-INF\etc\users.txt".

Nota: non funziona se la applicazione è deployata in un WAR e il servlet container/application server usa direttamente il WAR senza spacchettarlo (generalmente lo spacchettano ... perlomeno Tomcat lo fa per default).

cristal
08-07-2009, 09:25
Originariamente inviato da andbin
Che evidentemente il path non è appropriato! Nel senso che il path che hai usato è relativo alla directory corrente ma .... quale è la directory corrente?? Non lo sai a priori, dipende dal servlet container/application server!!

Nota: non funziona se la applicazione è deployata in un WAR e il servlet container/application server usa direttamente il WAR senza spacchettarlo (generalmente lo spacchettano ... perlomeno Tomcat lo fa per default).


ciao...grazie mille per la risposta.
Allora, ho inserito manualmente il percorso che è:
C:\Programmi\Apache Software Foundation\Tomcat 6.0\webapps\MySimpleWebApplication\WEB-INF\etc\users.txt

tuttavia adesso su eclipse ho proprio una segnalazione di problema:

Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )

penso sia dovuto agli spazi....come si può risolvere?



Puoi usare getRealPath() di ServletContext per ottenere un path reale sul file-system locale in base ad un path riferito alla root del tuo contesto.

Per chiarire, se chiedi il real path di "/WEB-INF/etc/users.txt" puoi ottenere ad esempio "C:\......\tomcat\webapps\nomeTuaApp\WEB-INF\etc\users.txt".

Con questo metodo getRealPath() non penso proprio di saperlo fare.... :(


Nota: non funziona se la applicazione è deployata in un WAR e il servlet container/application server usa direttamente il WAR senza spacchettarlo (generalmente lo spacchettano ... perlomeno Tomcat lo fa per default).

Uso Tomcat, quindi per questo non ho problemi...

grazie ancora

andbin
08-07-2009, 09:47
Originariamente inviato da cristal
ciao...grazie mille per la risposta.
Allora, ho inserito manualmente il percorso che è:
C:\Programmi\Apache Software Foundation\Tomcat 6.0\webapps\MySimpleWebApplication\WEB-INF\etc\users.txt

tuttavia adesso su eclipse ho proprio una segnalazione di problema:

Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )Se scrivi il path come stringa "literal" nel sorgente, il carattere \ è speciale, se vuoi avere davvero il carattere \ devi raddoppiarlo: \\

cristal
08-07-2009, 10:24
Originariamente inviato da andbin
Se scrivi il path come stringa "literal" nel sorgente, il carattere \ è speciale, se vuoi avere davvero il carattere \ devi raddoppiarlo: \\

Perfetto...avevo trovato una guida che diceva questo, ma più mettevo le \\ nel percorso, più mi segnava errore nel path e non sono arrivato fino alla fine... :)

ok ora funziona simulando da Eclipse, mentre su Tomcat ho ancora un problema. Dopo aver deployato il file .war, lancio l'applicazione e mi fa inserire nome, cognome, età ma poi premendo su invia mi esce:


HTTP Status 404 - /MySimpleWebApplication/SimpleController

type Status report

message /MySimpleWebApplication/SimpleController

description The requested resource (/MySimpleWebApplication/SimpleController) is not available.


Sai da cosa possa dipendere?

EDIT:
N.B. Mi viene segnalato questo marker:
The serializable class SimpleController does not declare a static final serialVersionUID field of type long


grazie ancora...

andbin
08-07-2009, 10:30
Originariamente inviato da cristal
HTTP Status 404 - /MySimpleWebApplication/SimpleController

type Status report

message /MySimpleWebApplication/SimpleController

description The requested resource (/MySimpleWebApplication/SimpleController) is not available.


Sai da cosa possa dipendere?Beh ma bisogna vedere a cosa fa riferimento quel SimpleController .... ad una servlet? L'hai dichiarata nel Deployment Descriptor (web.xml)??

cristal
08-07-2009, 10:35
Originariamente inviato da andbin
Beh ma bisogna vedere a cosa fa riferimento quel SimpleController .... ad una servlet? L'hai dichiarata nel Deployment Descriptor (web.xml)??

si è una servlet:



package controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;
import business.User;
import dati.UserIO;

/**
* Servlet implementation class for Servlet: SimpleController
*
*/
public class SimpleController extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet
{
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#HttpServlet()
*/
public SimpleController()
{
super();
}

/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doGet(HttpServletRe quest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String nome = request.getParameter("nome");
String cognome = request.getParameter("cognome");
String eta = request.getParameter("eta");

User user = new User();
user.setNome(nome);
user.setCognome(cognome);
user.setEta(eta);
// Ricordarsi di creare la directory etc specificata!
UserIO.addItem( user, "C:\\Program Files\\Apache Software Foundation\\Tomcat 6.0\\webapps\\MySimpleWebApplication\\WEB-INF\\etc\\users.txt");

HttpSession session = request.getSession();
session.setAttribute("user", user);

RequestDispatcher dispatcher;
dispatcher = getServletContext().getRequestDispatcher(
"/ShowUser.jsp");
dispatcher.forward(request,response);

}

/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doPost(HttpServletR equest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
this.doGet(request, response);
}
}



Nel web.xml c'è, penso si sia generata in automatico.

cristal
08-07-2009, 10:47
Originariamente inviato da cristal

EDIT:
N.B. Mi viene segnalato questo marker:
The serializable class SimpleController does not declare a static final serialVersionUID field of type long


Questo l'ho risolto con:
http://java.sun.com/j2se/1.5.0/docs/guide/serialization/spec/class.html#4100

inserendo:
private static final long serialVersionUID = 3487495895819393L;
nella servlet SimpleController, nella classe SimpleController.

cristal
08-07-2009, 11:31
Allora....funziona tutto anche su Tomcat.

Non ho fatto altro che sistemare quel marker e creare la cartella etc senza il file dentro users.txt (prima l'avevo creata con il file users.txt dentro e come prima schermata mi compariva già quella con il risultato - uscivano dei NULL - anzichè quella con l'inserimento).

Giusto per approfondire ho ancora qualche dubbio....

- come mai funziona senza creare il file users.txt nella cartella etc? Come fa ad autocrearsi?

- dicevi di usare il metodo getRealPath()....
sto leggendo qui:
http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletContext.html#getRealPath(java.lang.String)

ma come posso inserire l'url del file?



grazie ancora...

Loading