Я написал шаблон 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