PDA

View Full Version : Chiamare servlet da form html


DoubleAJ
24-02-2006, 20:40
Ho creato una pagina che contiene un form che deve richiamare una servlet.
La pagina chiamante è in public_webapp/jsp/pagina.jsp;
la servlet che voglio chiamare è in public_webapp/WEB-INF/classes/servlet/ServletSend.class .

Il file web.xml contiene questo:
- <servlet>
<servlet-name>ServletSend</servlet-name>
<servlet-class>servlet.ServletSend</servlet-class>
</servlet>
- <servlet-mapping>
<servlet-name>ServletSend</servlet-name>
<url-pattern>/ServletSend</url-pattern>
</servlet-mapping>

Che valore deve avere l'attributo action del tag form?

Grazie!

anx721
25-02-2006, 09:58
prova con

action="ServletSend"

o

action="./ServletSend"

pinok
25-02-2006, 13:38
prova con

action="ServletSend"

o

action="./ServletSend"
Direi di no in entrambi i casi, perché cerca una risorsa nello stesso percorso della pagina chiamante.
Il valore corretto è:

action="/ServletSend"

Ovviamente, ServletSend deve essere nel package servlet per come hai strutturato la directory sotto WEB-INF

anx721
25-02-2006, 14:18
Direi di no in entrambi i casi, perché cerca una risorsa nello stesso percorso della pagina chiamante.
Il valore corretto è:

action="/ServletSend"

Ovviamente, ServletSend deve essere nel package servlet per come hai strutturato la directory sotto WEB-INF


La mia risposta assumeva che la pagina chiamante si trovasse nella root dela webapplication. Se cosi è la mia risposta è corretta. Se si trova in una sottocartella della root allora bisogna mettere ../ServletSend


La tua indicazione invece porta a mappare la servlet nel percorso

http://host/ServletSend

in quanto il browser risolve gli indirizzi che iniziano con / relativamente alla root del server, non alla root della webapplication. Se ad esempio hai l'appliazione in locale e l'indirizzo root dell'applicazione è

http://localhost:8080/miaWebapp

la servlet deve essere invocata come

http://localhost:8080/miaWebapp/ServletSend

ma scrivendo action="/ServletSend" il browser risolverà l'indirizzo come

http://localhost:8080/ServletSend

che è un errore.

Se ometti lo slash in action="/ServletSend, il percorso viene invece risolto relativamente alla posizione della pagina chiamante

pinok
25-02-2006, 18:06
La mia risposta assumeva che la pagina chiamante si trovasse nella root dela webapplication.

Ma non è così, infatti aveva scritto:

La pagina chiamante è in public_webapp/jsp/pagina.jsp;
la servlet che voglio chiamare è in public_webapp/WEB-INF/classes/servlet/ServletSend.class



Se cosi è la mia risposta è corretta. Se si trova in una sottocartella della root allora bisogna mettere ../ServletSend

E' ancora sbagliato, perché in quel modo risali di una directory rispetto alla pagina chiamante, per cui non avresti di nuovo certezza


La tua indicazione invece porta a mappare la servlet nel percorso

http://host/ServletSend


Si, che di solito è il caso più frequente per chi inizia...


in quanto il browser risolve gli indirizzi che iniziano con / relativamente alla root del server, non alla root della webapplication. Se ad esempio hai l'appliazione in locale e l'indirizzo root dell'applicazione è

http://localhost:8080/miaWebapp

la servlet deve essere invocata come

http://localhost:8080/miaWebapp/ServletSend

ma scrivendo action="/ServletSend" il browser risolverà l'indirizzo come

http://localhost:8080/ServletSend

che è un errore.

Se ometti lo slash in action="/ServletSend, il percorso viene invece risolto relativamente alla posizione della pagina chiamante
Vero. Se vogliamo indicare la soluzione migliore e, credo, più corretta in assoluto per vari motivi, bisogna:
1) mappare in web.xml non come /ServletSend ma come /servlet/ServletSend o, se non piace /servlet, qualsiasi cosa, ad es. /pippo/ServletSend
2) nelle pagine JSP e dovunque bisogna richiamare la servlet, mettere:
action="<%=request.getContextPath()%>/servlet/ServletSend"
oppure action="<%=request.getContextPath()%>/pippo/ServletSend"

La soluzione che hai indicato tu non è molto pratica come gestione: ogni volta che chiami una servlet, ti riscrivi l'albero da risalire? se per caso usi un RequestDispatcher, come te lo gestisci, visto che introduce "strani" comportamenti nei percorsi?
Inoltre crea dei problemi di amministrazione se si usa Apache+Tomcat (e penso anche con altri WebServer) perché per ogni mappatura di una servlet, devi scrivere la relativa voce nella configurazione del connettore che dice di smistare a Tomcat la gestione della risorsa (JkMount).
Se metti tutto sotto /servlet (o /pippo ;)), il JkMount per associare il percorso al workers relativo, lo devi fare una sola volta (ad es. JkMount /servlet/* mioWorker)

DoubleAJ
27-02-2006, 15:20
Grazie mille ragazzi!
Ho provato tutte le soluzioni proposte, e ho preferito lasciare web.xml così com'è e in action mettere il valore ../ServletSend :)