鹰击长空,鱼翔浅底,万类霜天竞自由

获取RequestDispatcher的两种方法及区别


SpringMVC应用或Struts应用,甚至是基本的Servlet应用中,在转发JSP的时候通常会用到如下方法:

RequestDispatcher dispatcher = httpServletRequest.getRequestDispatcher("xxx.jsp");
requestDispatcher.forward(httpServletRequest, httpServletResponse);

这里的参数可以是一个相对路径或者是一个绝对路径定位的资源。但是,细心的人会发现,servletContext也有一个相同的方法:

RequestDispatcher dispatch = getServletContext.getRequestDispatcher(arg);

为什么requestservletContext都有这样的方法?难道这两个方法的作用是相同的么?答案是否定的。

servletContextgetRequestDispatcher方法的参数必须是一个绝对路径(也就是说必须以“/”开始)、有效的servlet或者jsp

但是有时候,不想通过url-pattern来获取相应的servlet,而是通过servlet的名字来获取,一般人肯定会想到调用servletContextgetServlet(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: FilterServlet中调用httpServletRequest.getRequestDispatcher的区别,以及在servlet中调用了这个方法以后是否还会走Filter



版权声明

本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。 本站博文除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。