我编写了前端控制器模式并进行了测试。以某种方式,request.getPathInfo()在应返回路径信息时返回null。
1。调用servlet的HTML
<a href="tmp.do">Test link to invoke cool servlet</a>
2。在DD中映射servlet。具有.do扩展名(例如tmp.do)的任何东西都将调用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。根据《第一本》,
Servlet生命周期从
"does not exist"
状态为"initialized"
状态(表示准备就绪服务客户的要求)开始及其构造函数。 init()总是在第一个电话之前完成到service()。
这告诉我,在构造函数和init()方法之间的某个地方,该servlet不是完全生长的servlet。
因此,这意味着在调用service()方法时,该servlet应该是完全生长的servlet,而request方法应该能够调用getPathInfo()并期望返回的是有效值,而不是null。
非常有趣。 (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”
getPathInfo()
中定义的servlet路径(仅此后的路径),并且web.xml
基本返回only如getServletPath()
中定义的servlet路径(而不是之后的路径)。如果url模式包含通配符,则特别包含
that部分。
使用前缀映射时,您没有任何路径信息(在您的情况下为Javadoc。