Почему метод request.getPathInfo() в методе службы возвращает null?

Я написал Front Controller Pattern и выполнил тест. Как-то request.getPathInfo() возвращает null, когда он должен возвращать информацию о пути.

1. HTML, который вызывает сервлет

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

2. Сопоставьте сервлет в DD.
Все, что имеет расширение .do(ex tmp.do), вызовет сервлет "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

 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. Основываясь на книге "Первая глава",

Жизненный цикл сервлета перемещается из "does not exist" состояние "initialized" состояние (означает готовность для обслуживания запроса клиента) с его конструктором. Функция init() всегда завершается до первого вызова для обслуживания().

Это говорит мне, что где-то между конструктором и методом init() сервлет не полностью вырос сервлетом.

Итак, это значит, что к моменту вызова метода service() сервлет должен быть полностью взрощенным сервлетом, а метод запроса должен иметь возможность вызвать getPathInfo() и ожидать, что возвращаемое значение вернется вместо нулевого.

UDPATE

Очень интересно. (http://forums.sun.com/thread.jspa?threadID=657991)

(HttpServletRequest - getPathInfo())

Если URL-адрес выглядит следующим образом:

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

Если вы web.xml опишите шаблон сервлета как /mycontext/ * getPathInfo() вернет myservlet/hello/test, а getQueryString() вернет paramName = значение

(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

@Vivien верен. Вместо этого вы хотите использовать HttpServletRequest#getServletPath() (извините, я забыл этот бит при записи ответ, который вы, несомненно, читали, я обновил ответ).

Чтобы уточнить: getPathInfo() содержит не путь сервлета, определенный в web.xml (только после этого путь) и getServletPath() в основном возвращает только путь сервлета как определено в web.xml (и, следовательно, не путь далее). Если шаблон url содержит подстановочный знак, в частности, эта часть включена.

Ответ 2

В соответствии с Javadoc:

Возвращает любую дополнительную информацию о пути, связанную с URL-адресом, отправленным клиентом при его выполнении. Дополнительная информация о пути следует по пути сервлета, но предшествует строке запроса. Этот метод возвращает null, если не было дополнительной информации о пути.

У вас нет информации о пути при использовании префиксного сопоставления (*.do, в вашем случае).