2010-09-19 8 views
14

Escribí el patrón del controlador frontal y realicé la prueba. De alguna manera, request.getPathInfo() devuelve nulo cuando debería devolver la información de la ruta.¿Cómo es que request.getPathInfo() en el método de servicio devuelve null?

1. HTML que llama servlet

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

2. Asignar el servlet en DD.
Todo lo que tiene 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 se lleva a petición 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 El problema es que request.getPathInfo() devuelve null. Sobre la base de la cabeza primer libro,

el servlet del ciclo de vida pasa de un estado a "does not exist" "initialized" estado (es decir, listo para dar servicio a petición del cliente) a partir 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 llame al método service(), el servlet debería ser un servlet totalmente desarrollado y el método de solicitud debería poder llamar a getPathInfo() y esperar que el valor válido sea devuelto en lugar de nulo.

UDPATE

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

(HttpServletRequest - getPathInfo())

Si la URL es como a continuación:

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

Si web.xml describirlo con el patrón de servlets como/myContext/* getPathInfo() devolverá myservlet/hola/prueba y getQueryString() devolverá paramName = valor

(HttpServletRequest - getServletPath())

Si la URL es como abajo:

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

Respuesta

15

@Vivien es correcto. En su lugar, le gustaría usar HttpServletRequest#getServletPath() (lo siento, pasé por alto ese bit al escribir el answer que, sin duda, estaba leyendo, actualicé la respuesta).

Para aclarar: getPathInfo() hace no ruta de inclusión servlet como definied en web.xml (sólo la ruta de acceso a partir de entonces) y getServletPath() devuelve básicamente solamente el camino servlet como definied en web.xml (y por tanto no la ruta a partir de entonces). Si el patrón de URL contiene un comodín, particularmente , se incluye la parte.

+0

Debería haber buscado el documento, ¡no sabía que getServletPath() existe! –

+0

Gottya así en DD, si especifico /foo/*. Do, getPathInfo() solo obtendría la ruta DESPUÉS del ".do"
Eso significa, /foo/test.do/blah?name = myname luego devuelve "/ blah? name = myname" –

+2

'/ foo/*. do' no es un patrón de URL válido, por lo que no podrá devolver nada :) Incluso entonces, en teoría, solo daría '/ blah'. No incluye la cadena de consulta. Para eso tienes el método 'getQueryString()' (o simplemente los métodos 'getParameter()' usuales). – BalusC

4

De acuerdo con la Javadoc:

Devuelve información de la ruta adicional asociado a la URL el cliente envió cuando hizo esta solicitud. La información de ruta adicional sigue la ruta del servlet pero precede a la cadena de consulta. Este método devuelve nulo si no había información de ruta adicional.

No tiene ninguna información de ruta al utilizar una asignación prefijada (*.do, en su caso).

+0

¡Gracias por la sugerencia! –

Cuestiones relacionadas