一尘不染

服务方法中的request.getPathInfo()为什么返回null?

jsp

我编写了前端控制器模式并进行了测试。当request.getPathInfo()应该返回路径信息时,它以某种方式返回null。

1.调用servlet的HTML

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

2.在DD中映射servlet。
具有.do扩展名(例如tmp.do)的任何内容都将调用Servlet“重定向器”

<!-- 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()始终在第一次调用service()之前完成。

这告诉我,在构造函数和init()方法之间的某个地方,该servlet不是完全生长的servlet。

因此,这意味着,在调用service()方法时,该servlet应该是完全生长的servlet,而request方法应该能够调用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

字符串ServletPath = req.getServletPath();

它返回“ / servlet / MyServlet”


阅读 1184

收藏
2020-06-08

共1个答案

一尘不染

@Vivien是正确的。您想使用它HttpServletRequest#getServletPath()忽略了这一点,我已经更新了答案)。

澄清:getPathInfo()
作为definied包括servlet路径web.xml(仅在此后的路径)和getServletPath()基本上返回
作为definied servlet路径web.xml(并因此不是路径之后)。如果url模式包含通配符,则特别包含 部分。

2020-06-08