为什么service.getPathInfo()在service方法中返回null?

时间:2010-09-19 10:10:41

标签: jsp tomcat servlets service

我写了Front Controller Pattern并运行测试。不知何故,request.getPathInfo()在返回路径信息时返回null。

1。调用servlet的HTML

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

2。在DD中映射servlet。
任何有.do扩展名(ex tmp.do)的东西都会调用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。从* .do

接收请求的servlet
 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

问题是request.getPathInfo()返回null。基于Head First的书,

  

servlet生命周期从   "does not exist"声明   "initialized"州(意思是准备好了)   开始服务客户的请求   用它的构造函数。 init()   总是在第一次通话之前完成   服务()。

这告诉我,在构造函数和init()方法之间,servlet是不完全成熟的servlet。

因此,这意味着,在调用service()方法时,servlet应该是完全成长的servlet,并且请求方法应该能够调用getPathInfo()并期望返回有效值而不是null。

UDPATE

非常有趣。 (http://forums.sun.com/thread.jspa?threadID=657991

(HttpServletRequest - getPathInfo())

如果网址如下所示:

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

如果你的web.xml描述servlet模式为/ mycontext / * getPathInfo()将返回myservlet / hello / test并且getQueryString()将返回paramName = value

(HttpServletRequest - getServletPath())

如果网址如下所示:

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

String servletPath = req.getServletPath();

返回“/ servlet / MyServlet”

这个页面也非常好: http://www.exampledepot.com/egs/javax.servlet/GetReqUrl.html

2 个答案:

答案 0 :(得分:17)

@Vivien是对的。您想使用HttpServletRequest#getServletPath()代替(抱歉,我在撰写你无疑正在阅读的answer时忽略了这一点,我已经更新了答案)。

澄清:getPathInfo() 包含web.xml中定义的servlet路径(仅此后的路径),getServletPath()基本上只返回 < / strong>在web.xml中定义的servlet路径(因此不是之后的路径)。如果url模式包含通配符,特别是包含部分。

答案 1 :(得分:4)

根据Javadoc

  

返回与客户端发出此请求时发送的URL关联的任何额外路径信息。额外路径信息遵循servlet路径,但在查询字符串之前。如果没有额外的路径信息,则此方法返回null。

使用带前缀的映射时,您没有任何路径信息(在您的情况下为*.do)。