本文介绍了服务方法中的 request.getPathInfo() 如何返回 null?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编写了前端控制器模式并运行了测试.不知何故 request.getPathInfo() 在应该返回路径信息时返回 null.

I wrote Front Controller Pattern and ran the test. Somehow request.getPathInfo() is returning null when it should return the path info.

1.调用servlet的HTML

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

2.在 DD 中映射 servlet.
任何具有 .do 扩展名(例如 tmp.do)的东西都将调用 servlet重定向器"

2. Map the servlet in DD.
Anything that has .do extension (ex tmp.do) will invoke the 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 的书,

The problem is that request.getPathInfo() returns null. Based on the Head First book,

servlet 生命周期从不存在" 状态为"initialized" 状态(意思是准备好了服务客户的要求)开始与其构造函数.init()总是在第一次调用之前完成到服务().

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

This tells me that somewhere between the constructor and init() method, the servlet is not-fully-grown servlet.

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

So, that means, by the time service() method is called, the servlet should be fully-grown servlet and request method should be able to call getPathInfo() and expect the valid value to return instead of null.

非常有趣.(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

If you web.xml discribe the servlet pattern as /mycontext/* getPathInfo() will return myservlet/hello/test and getQueryString() will return paramName=value

(HttpServletRequest - getServletPath() )

如果网址如下:

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

String servletPath = req.getServletPath();

String servletPath = req.getServletPath();

它返回/servlet/MyServlet"

It returns "/servlet/MyServlet"

推荐答案

@Vivien 是正确的.您想使用 HttpServletRequest#getServletPath() 代替(抱歉,我在编写 答案 您无疑正在阅读,我已经更新了答案).

@Vivien is correct. You'd like to use HttpServletRequest#getServletPath() instead (sorry, I overlooked that bit while writing the answer which you undoubtely was reading, I've updated the answer).

澄清:getPathInfo() 确实包括 web.xml 中定义的 servlet 路径(仅此后的路径)和 getServletPath() 基本上返回 web.xml 中定义的 servlet 路径(因此不是之后的路径).如果 url 模式包含通配符,特别是 那个 部分被包括在内.

To clarify: getPathInfo() does not include servlet path as definied in web.xml (only the path thereafter) and getServletPath() basically returns only the servlet path as definied in web.xml (and thus not the path thereafter). If the url pattern contains a wildcard, particularly that part is included.

这篇关于服务方法中的 request.getPathInfo() 如何返回 null?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-04 20:14