Java Servlet返回HTML文件时抛出异常问题求助
嘿,我刚仔细看了你的问题和排查结果,其实你遇到的是一个非常典型的请求转发无限循环问题,并不是缺少Jar包导致的!
问题原因分析
当你把Servlet的<url-pattern>设置为/时,这个Servlet就会成为Web应用的默认Servlet。在Tomcat这类Servlet容器中,默认Servlet的作用是处理所有其他已映射Servlet都不匹配的请求——包括静态资源(比如你的index.html)。
当你的LoginServlet执行request.getRequestDispatcher("index.html").forward(request, response)时,容器会尝试寻找能处理index.html请求的组件。这时候因为你的LoginServlet是默认Servlet,容器会把这个请求再次交给它处理,于是就陷入了无限转发循环:LoginServlet.doGet → 转发到index.html → 容器再次调用LoginServlet.doGet → 再次转发……最终导致StackOverflowError(从你提供的Eclipse异常堆栈里也能清楚看到,forward和doGet一直在重复调用)。
解决方案
你自己找到的修改<url-pattern>为/login的方案完全正确!
修改后的映射配置:
<servlet-mapping> <servlet-name>Login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
这时候你的LoginServlet只会处理路径为/login的请求,而静态资源(比如index.html)的请求会由Tomcat自带的默认Servlet(org.apache.catalina.servlets.DefaultServlet)来处理。当你在doGet里转发到index.html时,容器会正确找到处理静态资源的默认Servlet,不会再触发你的LoginServlet,循环也就终止了。
如果之后你有特殊需求,需要自定义默认Servlet同时能转发静态资源,可以通过getServletContext().getNamedDispatcher("default")获取容器自带的默认Servlet来处理静态资源请求,但对于你的新手场景来说,修改URL映射路径是最简单直接的解决方式。
内容的提问来源于stack exchange,提问作者Yyyeey

