Java 添加默认servlet并转发到HTML会创建StackOverflower错误
我在用码头。我的默认servlet在我的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
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准确注册为欢迎文件:
家