我编写了前端控制器模式并进行了测试。当request.getPathInfo()应该返回路径信息时,它以某种方式返回null。
1.调用servlet的HTML
<a href="tmp.do">Test link to invoke cool servlet</a>
2.在DD中映射servlet。 具有.do扩展名(例如tmp.do)的任何内容都将调用Servlet“重定向器”
<!-- 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》一书,
Servlet生命周期从其构造函数开始,从"does not exist"状态到"initialized"状态(即准备好服务客户的请求)在 状态之间移动 。init()始终在第一次调用service()之前完成。
"does not exist"
"initialized"
这告诉我,在构造函数和init()方法之间的某个地方,该servlet不是完全生长的servlet。
因此,这意味着,在调用service()方法时,该servlet应该是完全生长的servlet,而request方法应该能够调用getPathInfo()并期望返回的是有效值而不是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
(HttpServletRequest-getServletPath())
http://hostname.com:80/mywebapp/servlet/MyServlet/a/b;c=123?d=789
字符串ServletPath = req.getServletPath();
它返回“ / servlet / MyServlet”
@Vivien是正确的。您想使用它HttpServletRequest#getServletPath()忽略了这一点,我已经更新了答案)。
HttpServletRequest#getServletPath()
澄清:getPathInfo()不 不 作为definied包括servlet路径web.xml(仅在此后的路径)和getServletPath()基本上返回 仅 作为definied servlet路径web.xml(并因此不是路径之后)。如果url模式包含通配符,则特别包含 该 部分。
getPathInfo()
web.xml
getServletPath()