Foro sobre Java EE > Problema con servlet y jsp: error 404
En el action del form tienes que llamar al servlet con servidor + ruta, si el servidor es localhost sería:
<form action="http://localhost/admin/administration/addprod" method="post" name="addprod" enctype="multipart/form-data" >
Perdona que no he podido terminar antes, la variable ${pageContext.request.contextPath}/ equivale a http://localhost:8080/TiendaOnline/ y no es esa la ruta que tienes configurada en el servlet.
Espero haberte servido de ayuda.
Hola! Gracias por la respuesta. Probé como me dijiste sin embargo cuando le doy al submit me sale esto: No se puede acceder a este sitio web La página localhost ha rechazado la conexión. ERR_CONNECTION_REFUSED.
Pero probé de esta forma:
<form action="localhost:8080/admin/administration/addprod" method="post" name="addprod" enctype="multipart/form-data" >
De esta forma ya no me tira mas error 404 sin embargo tampoco me ejecuta el servlet, ya que no me guarda el producto en la base de datos, es decir cuando le doy al botón de submit se queda en la misma pagina de agregar producto sin hacer nada, lo que no se si es otro tipo de error o sigue siendo lo mismo de antes. Y otra consulta cuando pones no es esa la ruta que tienes configurada en el servlet te referís a la ruta que esta en el url-pattern del web.xml o a otra cosa?
Saludos!
Me refiero al url-pattern del web.xml:
<url-pattern>/admin/administration/addprod</url-pattern>
Esa es la ruta que tienes que poner cuando quieras llamar al servlet.
Dices que el servlet no hace nada, lo llamas mediante post, en el código del servlet tendrías que tener el método doPost() con lo que quieres hacer, ¿es así?
De todas formas, pon en el servlet un System.out.println para ver si entra o no entra y donde falla.
Suerte!!!
El error de EE_CONNECTION_REFUSED era porque no había puesto el puerto 8080 en la dirección en mi mensaje, perdona, no me di cuenta!!
Hola! Si, he puesto un System.out.println y también probé con un breakpoint para ver si los datos tenían algún valor pero ninguno me funciono, así que no me ejecuta el servlet pero ya no me tira el error 404, se queda en la misma pagina de añadir producto, yo igual supongo debe ser problema que me sigue sin encontrar el servlet.
Saludos!
Llama directamente al servlet desde el navegador (tendrás que rellenar el método doGet también porque desde el navegador te llamara a este método):
http://localhost:8080/admin/administration/addprod
a ver si así te lo llama
Hola! Me volvió a tirar error 404 de esa forma, sin embargo cuando puse un system.out.println dentro del doget() me lo mostró en la consola. También probé con un breakpoint dentro del doget() pero no me lo ejecuto así que no me llamo al servlet tampoco. El código del servlet(sin completar el metodo doget()) es el siguiente:
public class AddProductServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public AddProductServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println(getServletInfo());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
if (validateForm(request)) {
try {
String nombre = Tools.getcontentPartText(request.getPart("name"));
double precio = Double.parseDouble(Tools.getcontentPartText(request.getPart("price")));
int nStock = Integer.parseInt(Tools.getcontentPartText(request.getPart("stock")));
String descripcion = Tools.getcontentPartText(request.getPart("desc"));
String detalles = Tools.getContentTextArea(request.getPart("detail"));
String codigo = Tools.generaUUID();
////----Guardar Imagen si hay, si hay error guardando se aborta y notifica
if (request.getPart("foto").getSize() > 0 && !Tools.recuperarYGuardarImagenFormulario(request, response, codigo)) {
return;
}
///-----Fin tratado de imagen
Producto prod = new Producto(codigo, nombre, precio, nStock, descripcion, detalles);
boolean ok = ProductoDao.getInstance().addProduct(prod);
request.setAttribute("resultados", "Resultados de la operación");
if (ok) {
Tools.anadirMensaje(request, "El producto se ha añadido correctamente");
} else {
Tools.anadirMensaje(request, "Ha ocurrido un error al añadir el producto. El producto está duplicado. Inténtelo de nuevo");
}
request.getRequestDispatcher("/TiendaOnline/admin/administration/products_administration.jsp").forward(request, response);
} catch (Exception ex) { //IntrusionException
request.setAttribute("resultados", "Intrusión detectada");
request.getRequestDispatcher("/TiendaOnline/admin/administration/addproduct.jsp").forward(request, response);
}
} else {
request.setAttribute("resultados", "Formulario no válido");
Tools.anadirMensaje(request, "El formulario recibido no tiene los campos esperados");
request.getRequestDispatcher("/TiendaOnline/admin/administration/addproduct.jsp").forward(request, response);
}
}
protected boolean validateForm(HttpServletRequest request) throws IOException, ServletException {
if (request.getParts().size() >= 6 && request.getPart("name") != null && request.getPart("price") != null
&& request.getPart("stock") != null && request.getPart("desc") != null
&& request.getPart("detail") != null && request.getPart("sendProd") != null) {
return true;
}
return false;
}
public String getServletInfo() {
return "Servlet para añadir productos al catálogo";
}
}
Si al llamarlo desde el navegador te ha escrito el System.out... es buena señal. Aunque pongas un breakpoint no te lo va a ejecutar porque se ejecuta en el servidor web.
Más que el código del servlet, ¿puedes poner el error que te da? a ver si así podemos ver algo, porque con el código...
Hola! El error que se me sigue mostrando es el de http 404 : el recurso solicitado no esta disponible.
En la consola de tomcat no me salta ningún error.
El del navegador, lo puedes copiar aqui?
Si, me muestra lo siguiente:
Estado HTTP 404 - /admin/administration/addprod
type Informe de estado
mensaje /admin/administration/addprod
descripción El recurso requerido no está disponible.
Apache Tomcat/7.0.57
Esto me muestra cuando ingreso http://localhost:8080/admin/administration/addprod directamente en la url del navegador, o sea con el método doget rellenado.
Cuando lo hago con el método post pasa lo que había posteado mas arriba, no me tira ningún error pero tampoco me ejecuta el servlet.
Saludos!
Dentro de la carpeta tomcat, tienes la carpeta webapss, ¿tienes alguna carpeta creada para el proyecto?
Hola tengo un problema cuando quiero ejecutar un servlet, el servlet es para registrar un producto una vez logueado como administrador, pero cuando doy submit al formulario de añadir producto me tira error 404:
web.xml
<servlet>
<servlet-name>AddProductServlet</servlet-name>
<servlet-class>servlet.admin.AddProductServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddProductServlet</servlet-name>
<url-pattern>/admin/administration/addprod</url-pattern>
</servlet-mapping>
addproduct.jsp
<form action="${pageContext.request.contextPath}/addprod" method="post" name="addprod" enctype="multipart/form-data" >
He intentando ademas con form action="admin/administration/addprod" y tampoco funciono, ¿Alguna posible solución?.
La url que me aparece en el browser cuando me tira el error es http://localhost:8080/TiendaOnline/addprod
addproduct.jsp se encuentra en el path: TiendaOnline -> WebContent -> admin -> administration -> addproduct.jsp