Author Topic: Servlets para un novato  (Read 5177 times)

calimero_78

  • Newbie
  • *
  • Posts: 21
  • Karma: 0
    • View Profile
Servlets para un novato
« on: Marzo 24, 2015, 03:41:37 pm »
Wenas:

Tengo un problema, creo que bastante simple, pero que no acabo de ver la solución.

Tengo que hacer una aplicación con Servlets y JSP, sin frameworks. Lo que quiero hacer es que mi Servlet controlador, sólo tengo ese Servlet, centralice todas las llamadas del cliente, para que éste lo mapee.

¿Cómo puedo hacer esto?, poruqe estoy poniendo en el descriptor :

Code: [Select]
<servlet-mapping>
        <servlet-name>Controlador</servlet-name>
        <url-pattern>/*</url-pattern>
</servlet-mapping>

.. pero no hace otra cosa que lanzar 404. Dónde está el error? Debo hacerlo con filtros? que parece que sé de lo que hablo cuando digo filtros, pero tampoco me quedan muy claros.

Cualquier ayuda será bienvenida. Gracias.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Servlets para un novato
« Reply #1 on: Marzo 24, 2015, 06:03:27 pm »
Hola:

En principio es correcto. ¿tu servlet devuelve 404 en algún caso?

Se bueno.

calimero_78

  • Newbie
  • *
  • Posts: 21
  • Karma: 0
    • View Profile
Re: Servlets para un novato
« Reply #2 on: Marzo 24, 2015, 08:57:38 pm »
Hola:

Ante todo gracias por responder.

Lo de los 404 era culpa mía, por poner rutas que no existían, pero corregido esto me salen otros errores.

Concretamente me sale una reatila de errores importante, pero vamos, por lo que observo se trata de un bucle, porque son iguales todos. Así, seguro seguro el fallo es mío, pero no sé donde lo cometo.

Si te parece te pongo algo de código haber si fuera por ahí el fallo.

El servlet que pretendo sea el controlador:

Code: [Select]
package controlador;

import java.io.IOException;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Controlador extends HttpServlet {
   
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        //response.getWriter().write("HOLA");
        HashMap<String, String> mapa = new HashMap<>();
        mapa.put("uno", "uno.jsp");
        mapa.put("dos", "dos.jsp");
        mapa.put("tres", "tres.jsp");
        String ruta = "";
        if(request.getParameter("ctl") == null || request.getParameter("ctl").isEmpty()){
            ruta = "uno";
        } else {
            if(mapa.containsKey(request.getParameter("ctl"))){
                ruta = mapa.get(request.getParameter("ctl"));
            } else {
                //ERROR
            }
        }
        request.getRequestDispatcher(ruta).forward(request, response);
    }
   
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
   
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }

}
Cada una de las páginas JSP tiene un texto muy sencillo como "Hola desde la página tal". Posteriormente querré meterle enlaces que ser dirijan al controlador etc. pero por el momento es esto simplemente.

El contenido del descriptor:

Code: [Select]
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <servlet>
        <servlet-name>Controlador</servlet-name>
        <servlet-class>controlador.Controlador</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Controlador</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

y eso es todo. Aun no me he conectado a la BBDD, ni he procesado las sesiones ni nada de nada. Es esto y al probar la aplicación falla.

La salida desde el explorador es:

Code: [Select]
type Informe de Excepción

mensaje La ejecución del Servlet lanzó una excepción

descripción El servidor encontró un error interno que hizo que no pudiera rellenar este requerimiento.

excepción

javax.servlet.ServletException: La ejecución del Servlet lanzó una excepción
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
controlador.Controlador.processRequest(Controlador.java:30)
controlador.Controlador.doGet(Controlador.java:36)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727) ... y se repite hasta casi el infinito

Y debajo de esta salida pone:

Code: [Select]
causa raíz

java.lang.StackOverflowError
org.apache.catalina.connector.Request.isAsyncStarted(Request.java:1676)
org.apache.catalina.connector.RequestFacade.isAsyncStarted(RequestFacade.java:1035)
javax.servlet.ServletRequestWrapper.isAsyncStarted(ServletRequestWrapper.java:396)

No comprendo que falla. Llevo poco tiempo con esto y es frustrante no poder hacer ni una aplicación sencilla.

Se te ocurre algo? Muchas gracias.

calimero_78

  • Newbie
  • *
  • Posts: 21
  • Karma: 0
    • View Profile
Re: Servlets para un novato
« Reply #3 on: Marzo 25, 2015, 04:52:50 pm »
Hola:

No se bien por qué, pero la aplicación funciona ya. Lo que he hecho es crear un index.jsp y a partir de ahí he ido llamando a las vistas. Sabrías decirme si esto es por imperativo legal o se puede hacer de tal forma que se pueda prescindir de un index.jsp?

Gracias.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5466
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Servlets para un novato
« Reply #4 on: Marzo 25, 2015, 08:03:36 pm »
Hola:

Hasta donde yo se, no debería ser necesario index.jsp

Lo de StackOverflowError suena a error de memoria. Si tu aplicación no es muy "tocha", en la excepción deberías mirar si por un casual se están llamando a los mismos métodos una y otra vez recusrivamente, suele ser un motivo habitual de StackOverflowError.

Se bueno.

calimero_78

  • Newbie
  • *
  • Posts: 21
  • Karma: 0
    • View Profile
Re: Servlets para un novato
« Reply #5 on: Marzo 26, 2015, 04:43:04 pm »
Hola:

Ya está solucionado.

Probablemente lo StackOverflowError se debiera a un error en el descriptor, originado porque no estaba bien definido <url-pattern>.

Ahora ya funciona todo con normalidad sin necesidad de un index.jsp.

Gracias.

 

ey