Почему request.getPathInfo () в сервисном методе возвращает null? - PullRequest
15 голосов
/ 19 сентября 2010

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

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

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

2.Карта сервлета в DD. Все, что имеет расширение .do (ex tmp.do), будет вызывать сервлет «Перенаправитель»

<!-- 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.Основываясь на книге Head First,

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

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

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

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 = value

(HttpServletRequest - getServletPath ())

Если URL-адрес такой, как показано ниже:

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

String servletPath = req.getServletPath ();

Itвозвращает "/ servlet / MyServlet"

Эта страница также очень хорошая: http://www.exampledepot.com/egs/javax.servlet/GetReqUrl.html

Ответы [ 2 ]

17 голосов
/ 19 сентября 2010

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

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

4 голосов
/ 19 сентября 2010

Согласно Javadoc :

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...