¿Cómo es que request.getPathInfo () en el método de servicio devuelve nulo?

Escribí el patrón del controlador frontal y ejecuté la prueba. De alguna manera, request.getPathInfo () devuelve nulo cuando debería devolver la información de ruta.

1. HTML que llama servlet

<a href="tmp.do">Test link to invoke cool servlet</a>

2. Asigne el servlet en DD.
Cualquier cosa que tenga la extensión .do (ex tmp.do) invocará el servlet "Redirector"

<!-- SERVLET (centralized entry point) -->
    <servlet>
        <servlet-name>RedirectHandler</servlet-name>
        <servlet-class>com.masatosan.redirector.Redirector</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RedirectHandler</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

3. El servlet que toma la solicitud de * .do

 public class Redirector extends HttpServlet {

        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try {
                //test - THIS RETURNS NULL!!!!
                System.out.println(request.getPathInfo());

                Action action = ActionFactory.getAction(request); //return action object based on request URL path
                String view = action.execute(request, response); //action returns String (filename) 
                if(view.equals(request.getPathInfo().substring(1))) {
                    request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response);
                }
                else {
                    response.sendRedirect(view);
                }
            }
            catch(Exception e) {
                throw new ServletException("Failed in service layer (ActionFactory)", e);
            }
        }
    }//end class

El problema es que request.getPathInfo () devuelve nulo. Basado en el libro Head First,

El ciclo de vida del servlet se mueve desde"does not exist" declarar a"initialized" estado (es decir, listo para atender la solicitud del cliente) que comienza con su constructor. El init () siempre se completa antes de la primera llamada al servicio ().

Esto me dice que en algún lugar entre el constructor y el método init (), el servlet no es un servlet completamente desarrollado.

Entonces, eso significa que, cuando se llama al método service (), el servlet debería ser un servlet completamente desarrollado y el método request debería poder llamar a getPathInfo () y esperar que el valor válido regrese en lugar de nulo.

UDPATE

Muy interesante. (http://forums.sun.com/thread.jspa?threadID=657991)

(HttpServletRequest - getPathInfo ())

Si la URL es la siguiente:

http://www.myserver.com/mycontext/myservlet/hello/test?paramName=value.

Si web.xml describe el patrón de servlet como / mycontext / * getPathInfo () devolverá myservlet / hello / test y getQueryString () devolverá paramName = value

(HttpServletRequest - getServletPath ())

Si la URL es la siguiente:

http://hostname.com:80/mywebapp/servlet/MyServlet/a/b;c=123?d=789

Cadena servletPath = req.getServletPath ();

Devuelve "/ servlet / MyServlet"

Esta página también es muy buena:http://www.exampledepot.com/egs/javax.servlet/GetReqUrl.html

Respuestas a la pregunta(2)

Su respuesta a la pregunta