获取RequestDispatcher的两种方法及区别
在SpringMVC
应用或Struts
应用,甚至是基本的Servlet
应用中,在转发JSP
的时候通常会用到如下方法:
RequestDispatcher dispatcher = httpServletRequest.getRequestDispatcher("xxx.jsp"); requestDispatcher.forward(httpServletRequest, httpServletResponse);
这里的参数可以是一个相对路径或者是一个绝对路径定位的资源。但是,细心的人会发现,servletContext
也有一个相同的方法:
RequestDispatcher dispatch = getServletContext.getRequestDispatcher(arg);
为什么request
和servletContext
都有这样的方法?难道这两个方法的作用是相同的么?答案是否定的。
servletContext
的getRequestDispatcher
方法的参数必须是一个绝对路径(也就是说必须以“/”开始)、有效的servlet
或者jsp
。
但是有时候,不想通过url-pattern
来获取相应的servlet
,而是通过servlet
的名字来获取,一般人肯定会想到调用servletContext
的getServlet(name)
方法,点开源码可以看到,这个方法被标注为过时,同时结果会返回null
。很明显,新的servlet
规范已经禁止这样使用。难道就不能通过servlet
的名字来获取对应的servlet
了?
肯定是可以的,这个方法就是第三种方法:
getServletContext().getNamedDispatcher("xxx");
这个方法返回的并不是一个servlet
,而是一个RequestDispatcher
,但是不要紧,看官方给的解释:
Returns a RequestDispatcher object that acts as a wrapper for the named servlet.
getNamedDispatcher(String) method takes the name of the Servlet as parameter which is declared via Deployment descriptor.
很明显,他其实就是一个目标servlet
的包装,拿到它,其实就相当于拿到了目标servlet
。
Question: Filter
和Servlet
中调用httpServletRequest.getRequestDispatcher
的区别,以及在servlet
中调用了这个方法以后是否还会走Filter
?
版权声明
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。 本站博文除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。