-1

我在 web.xml(共存)中定义了常规 servlet 和 Spring MVC dispatcherServlet。web.xml 中 Spring MVC 的 DispatcherServlet 的映射是“/admin/*”。我有一个常规 servlet 向文件夹结构“/admin/...”下的 jsp 发出 request.getDispatcher().forward。由于这是内部转发,我希望 spring 的 dispatcherServlet 不会被注意到。事实证明,Spring 的 DispatcherServlet 确实注意到了这一点,并给了我一个没有找到到这个 JSP 的映射的异常。

有人知道这里到底发生了什么吗?

更新:对不起,我没有让问题更清楚:

我们有一个没有使用 Spring MVC 的现有应用程序。我们决定保持现有功能不变,并为任何其他新功能添加 Spring MVC。

所以这里是 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>

如果 ExistingServelt 调用 request.getRequestDispatcher().forward("/admin/...jsp"),那么 Spring 会报一个错误,找不到 "/admin/...jsp" 的映射。似乎调用 request.getRequestDispatcher().forward("/admin/...jsp") 将使 servlet 容器重新检查 web.xml 并通过 Spring 的 DispatchServlet 重新路由。

4

1 回答 1

0

如果我没记错的话,映射“/*”(星号)意味着您将所有扩展名(.jsp、.js 等)映射到 dispatcherServlet。

可能最简单的解决方案是让所有@RequestMapping 都具有“.do”扩展名并将调度程序servlet 映射到“*.do”,例如:

@RequestMapping("/myPage1.do")
public String getMyPage1() {
    // Some logic here

    return "myPage1";
}

@RequestMapping("/myPage2.do")
public String getMyPage2() {
    // Some logic here

    return "myPage2";
}

// And so on

然后你必须像这样改变你的 web.xml:

<servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/admin/*.do</url-pattern>
    </servlet-mapping>
于 2013-10-31T08:09:58.063 回答