如何映射“根”Servlet,以便其他脚本仍可运行?

2022-08-31 17:16:02

我正在尝试构建一个调用 JSP 页面的 Servlet,类似于以下内容:

public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException, ServletException {
    req.getRequestDispatcher("/WEB-INF/main.jsp").forward(req, resp);
}

我需要这个Servlet来响应域的根(例如:http://example.com/),所以我在Web中使用以下映射.xml:

<servlet-mapping>
    <servlet-name>MainServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

我遇到的问题是,这与所有内容都匹配,因此当调度程序转发到“/WEB-INF/main.jsp”时,这与url模式匹配,因此Servlet再次运行。这会导致一个循环运行,直到它使用java.lang.StackOverflowError死亡

如何在不阻止其他脚本可运行的情况下匹配根脚本?


答案 1

使用空图案,例如

<servlet-mapping>
    <servlet-name>MainServlet</servlet-name>
    <url-pattern></url-pattern>
</servlet-mapping>

servlet 3.0 规范已经阐明了这一点:

空字符串 (“”) 是一种特殊的 URL 模式,它完全映射到应用程序的上下文根目录

因此,它至少应该在3.0容器上运行,并且我已经验证了它在Jetty 8上工作。


答案 2

使用web的欢迎文件元素.xml在应用程序引擎上为我工作。这是我的:

<web-app>
    <servlet>
        <servlet-name>RootServlet</servlet-name>
        <servlet-class>com.foo.RootServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RootServlet</servlet-name>
        <url-pattern>/foo</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>foo</welcome-file>
    </welcome-file-list>
</web-app>

推荐