Java 添加默认servlet并转发到HTML会创建StackOverflower错误

Java 添加默认servlet并转发到HTML会创建StackOverflower错误,java,servlets,jetty,web.xml,Java,Servlets,Jetty,Web.xml,我在用码头。我的默认servlet在我的WEB-INF文件夹中对HTML文件进行简单转发,该文件导致java.lang.StackOverflowerError错误。如果将转发的文件从.html重命名为.jsp DefaultServlet.java public class DefaultServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServlet

我在用码头。我的默认servlet在我的
WEB-INF
文件夹中对HTML文件进行简单转发,该文件导致
java.lang.StackOverflowerError
错误。如果将转发的文件从
.html
重命名为
.jsp

DefaultServlet.java

public class DefaultServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException{
            req.getRequestDispatcher("WEB-INF/home.html").forward(req, resp);

    }
}
web.xml

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <servlet>
        <servlet-name>Default</servlet-name>
        <servlet-class>DefaultServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

Web应用程序创建的原型
违约
DefaultServlet
违约
/
我的猜测是,转发不是在响应正文中插入html内容,而是向浏览器发送一个重定向到
/WEB-INF/home.html
。这再次调用
DefaultServlet
,并进入无限循环。我怎样才能防止这种情况


谢谢。

您需要一种以“html”结尾的排除URL

例如,请参阅此链接,解释类似的问题解决方案。

映射到特殊URL模式
/
上的“默认servlet”是一个非常特殊的servlet,当有请求与映射到更具体URL模式(如
*.jsp
)上的任何servlet不匹配时,就会调用该servlet,
/foo/*

当您转发到
home.html
(显然没有注册任何servlet)时,将再次调用默认servlet。但是,默认servlet会再次无意识地转发到同一个HTML文件,而不是实际为请求的HTML文件提供服务。它仍然会在转发中发现没有一个servlet与转发URL匹配,并且它仍然会再次调用默认servlet。一次又一次。等。当执行此操作的次数如此之多,以致堆栈无法继续跟踪顺序中调用的所有
doGet()
方法(通常大约1000次),那么您将得到一个
StackOverflowError

它与JSP文件一起工作实际上有一个非常简单的原因:在
*.JSP
的URL模式上已经注册了一个
JspServlet
。因此,没有调用设计糟糕的默认servlet

您的默认servlet应该通过
ServletContext#getResourceAsStream()
获取HTML文件的内容,并将其写入
HttpServletResponse#getOutputStream()

然而,您也很可能完全误解了“默认servlet”的全部含义和/或URL模式的特殊含义,而实际上只希望servlet充当主页。在这种情况下,您应该将servlet映射到更具体的URL模式上(请将当前显然非常混乱的类名
DefaultServlet
重命名为其他名称):


家
com.example.HomeServlet
家
/家
然后将该URL准确注册为欢迎文件: