当前位置:  开发笔记 > 前端 > 正文

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

如何解决《为什么service.getPathInfo()在service方法中返回null?》经验,为你挑选了2个好方法。

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

1.调用servlet的HTML

Test link to invoke cool servlet

2.在DD中映射servlet.
任何有.do扩展名(ex tmp.do)的东西都会调用servlet"Redirector"


    
        RedirectHandler
        com.masatosan.redirector.Redirector
    
    
        RedirectHandler
        *.do
    

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,并且请求方法应该能够调用getPathInfo()并期望返回有效值而不是null.

UDPATE

很有意思.(http://forums.sun.com/thread.jspa?threadID=657991)

(HttpServletRequest - getPathInfo())

如果URL如下所示:

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

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

(HttpServletRequest - getServletPath())

如果URL如下所示:

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



1> BalusC..:

@Vivien是对的.你想使用HttpServletRequest#getServletPath()(对不起,我在写下你无疑正在阅读的答案时忽略了那一点,我已经更新了答案).

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


`/ foo/*.do`不是一个有效的url模式,所以它将无法返回任何东西:)即便如此,理论上它只会给`/ blah`.它不包括查询字符串.为此你有`getQueryString()`方法(或者只是通常的`getParameter()`方法).

2> Vivien Barou..:

根据Javadoc:

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

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

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有