0

我们有一个不使用 Spring MVC 的现有应用程序。我们决定保持现有功能不变,并通过像“/admin/*.

所以这里是 web.xml 映射:

<servlet>
    <servlet-name>springRouted</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/mvc-config.xml</param-value>
    </init-param>
    <load-on-startup>4</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>springRouted</servlet-name>
    <url-pattern>/admin/*</url-pattern>
</servlet-mapping> 
<servlet-mapping>
   <servlet-name>ExistingServlet</servlet-name>
    <url-pattern>existing.do</url-pattern>
</servlet-mapping>

在 ExistingServlet 中,有一个对 request.getRequestDispatcher().forward("/admin/...jsp") 的调用,Spring 会以某种方式检测到这种转发并报告一个错误,即无法找到“/admin/ 的映射” ...jsp”。似乎调用 request.getRequestDispatcher().forward("/admin/...jsp") 将使 servlet 容器重新检查 web.xml 并通过 Spring 的 DispatchServlet 重新路由。是真的吗?我以为这种内部转发不会被Spring的DispatchServlet拦截

4

1 回答 1

0

ARequestDispatcher将针对您在部署描述符 (web.xml) 或其他Servlet配置中的映射进行解析,基本上所有 servlet 映射。

当你这样做

 request.getRequestDispatcher("/admin/...jsp");

Servlet容器找到用于处理该路径的(Servlet或其他资源)并将其包装在一个RequestDispatcher对象中。然后RequestDispatcher#forward(..)在返回的对象上执行时,您正在执行先前找到的service()方法。Servlet

在您的示例中,这将是DispatcherServlet. 如果您DispatcherServlet配置为处理对 的请求/admin/...jsp,那么它将这样做。如果没有,它将抛出自己的自定义异常,以 404 响应 HTTP 请求。

getRequestDispatcher()以下是有关如何工作的更多详细信息。

于 2013-11-01T21:21:11.810 回答