Wie kommt es, dass request.getPathInfo () in der Dienstmethode null zurückgibt?

Ich habe Front Controller Pattern geschrieben und den Test ausgeführt. In gewisser Weise gibt request.getPathInfo () null zurück, wenn die Pfadinformationen zurückgegeben werden sollen.

1. HTML, das servlet @ aufru

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

2. Ordnen Sie das Servlet in DD zu.
Alle Dateien mit der Erweiterung .do (ex tmp.do) rufen das Servlet "Redirector" auf.

<!-- 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. Das Servlet, das eine Anfrage von * .do @ entgegennim

 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

Das Problem ist, dass request.getPathInfo () null zurückgibt. Basierend auf dem Head First-Buch,

Der Servlet-Lebenszyklus bewegt sich von"does not exist" state to"initialized" state (dh bereit, die Anfrage des Kunden zu bedienen), beginnend mit seinem Konstruktor. Das init () wird immer vor dem ersten Aufruf von service () abgeschlossen.

Dies sagt mir, dass das Servlet irgendwo zwischen dem Konstruktor und der Methode init () ein nicht ausgewachsenes Servlet ist.

Wenn also die Methode service () aufgerufen wird, sollte das Servlet ein ausgewachsenes Servlet sein und die Anforderungsmethode sollte getPathInfo () aufrufen können und erwarten, dass der gültige Wert anstelle von null zurückgegeben wird.

UDPATE

Sehr interessant. http: //forums.sun.com/thread.jspa? threadID = 657991)

(HttpServletRequest - getPathInfo ())

Wenn die URL wie folgt lautet:

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

Wenn Sie in der Datei web.xml das Servlet-Muster so beschreiben, dass / mycontext / * getPathInfo () myservlet / hello / test und getQueryString () paramName = value @ zurückgib

(HttpServletRequest - getServletPath ())

Wenn die URL wie folgt lautet:

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

String servletPath = req.getServletPath ();

It gibt "/ servlet / MyServlet" zurück

Diese Seite ist auch sehr gut:http: //www.exampledepot.com/egs/javax.servlet/GetReqUrl.htm

Antworten auf die Frage(4)

Ihre Antwort auf die Frage