Forward con servlets

Im using tomcat 4.06 and i have some problems with servlets and forwarding:
This is my servlet:
import java.io.PrintWriter;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
public class NTenant extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
String email = request.getParameter("tenant");
//insert new tenant into database.
System.out.println("Redirigiendo");
ServletContext sc = getServletConfig().getServletContext();
RequestDispatcher rdNext = sc.getRequestDispatcher("/tenantForm.html");
rdNext.forward(request, response);
System.out.println("Redirigido");
}
}
I get this error:
type Status report
message Servlet invoker is currently unavailable
Description The requested service (Servlet invoker is currently unavailable) is not currently available.
This is my dir structure:
webapps\form\NewTenant.html
webapps\form\tenantForm.html
webapps\form\WEB-INF\web.xml
webapps\form\WEB-INF\classes\NTenant.class
webapps\form\WEB-INF\classes\TenantServlet.class
The problem is that i cannot find my html, ¿what must i write here? Sc.getRequestDispatcher("/tenantForm.html"); <-----
Thank you very much

1 respuesta

Respuesta
1
English is not my mature language, I´m sorry about it
I think that the error is in the next line
RequestDispatcher rdNext = sc.getRequestDispatcher("/tenantForm.html");
The problem is that when you are executing a servlet the local path is http://yourserver/servlet so if you are looking ofr tenantForm.html it must be in this directory, so I though than the correct code line would be:
RequestDispatcher rdNext = sc.getRequestDispatcher("../tenantForm.html");
Try it, i think it must work properly.
Perdona que te escribiese en ingles, estoy trabajando en Londres...
Puse lo que me dijiste y obtuve:
java.lang.IllegalArgumentException: Path ../tenantForm.html does not start with a "/" character
at org.apache.catalina.core.ApplicationContext.getRequestDispatcher(ApplicationContext.java:572)
at org.apache.catalina.core.ApplicationContextFacade.getRequestDispatcher(ApplicationContextFacade.java:174)
at NTenant.doPost(NTenant.java:19)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
Ahora pruebo con:
RequestDispatcher rdNext = sc.getRequestDispatcher("/../tenantForm.html");
y... obtengo:
type Exception report
message Internal Server Error
description The server encountered an internal error (Internal Server Error) that prevented it from fulfilling this request.
exception
java.lang.NullPointerException
at NTenant.doPost(NTenant.java:20)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:465)
at org.apache.catalina.servlets.InvokerServlet.doPost(InvokerServlet.java:216)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1027)
at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1125)
at java.lang.Thread.run(Thread.java:536)
Muchas gracias por todo si se te ocurra algo mas me dices, ya que me estoy volviendo loco.
Esto funciona:
RequestDispatcher rdNext = sc.getRequestDispatcher("/tenantForm.jsp");
Sabes porque funciona con .jsp y no con .html??
gracias
La verdad es que ya no me quedan demasiadas ideas al respecto. ¿Has provado a meter el fichero html en el mismo directorio que el servlet?. De esta forma deveria funcionarte la primera version que me mandaste.
¿Y usando direcciones absolutas?
Esto limita que puedas ejecutar el servlet en otros servidores... pero puede ser una solucion rapida.
Aparte puedes intentar que sea independiente de la maquina usando la clase File. Con file. GetAbsolutePaht obtienes el path absoluto completo, en nuestro caso no nos sirve, pero si usas el metodo file. GetParent obtienes el path de nivel anterior. Es decir si estas en http://tuservidor/servlet
GetParent debe devolverte http://tuservidor y a partir de aqui solo tienes que concatenarlo con el nombre de la pagina, mas o menos seria:
file.getParent()+"/tenantForm.jsp");
Si esto no te funcionase intenta averiguar cual es el paht desde el que se invocan las paginas en cada momento, imprime por pantalla file. GetAbsoulutePath() para saberlo. Te puede ayudar a descubrir el error.
Respecto a porque funciona con jsp y no con html lo mas probroble es que se deba a temas del directorio en el que se ejecutan las jsp.
Espero que esto te pueda ayudar a solucionar el problema

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas