Java requestDispatcher#forward()上的Tomcat infinte循环。堆栈溢出错误
在不断重复这些行之后,Tomcat给了我StackOverflowerError,其中Java requestDispatcher#forward()上的Tomcat infinte循环。堆栈溢出错误,java,tomcat,servlets,requestdispatcher,deployment-descriptor,Java,Tomcat,Servlets,Requestdispatcher,Deployment Descriptor,在不断重复这些行之后,Tomcat给了我StackOverflowerError,其中DiceBoardDispatcher是我的HttpServlet,在第34行中,我调用requestDispatcher#forward() 我想这与我的部署有关,下面是我的web.xml的相关部分: <servlet-mapping> <servlet-name>DiceBoard</servlet-name> <url-pattern>/
DiceBoardDispatcher
是我的HttpServlet,在第34行中,我调用requestDispatcher#forward()
我想这与我的部署有关,下面是我的web.xml的相关部分:
<servlet-mapping>
<servlet-name>DiceBoard</servlet-name>
<url-pattern>/dices/*</url-pattern>
</servlet-mapping>
<filter-mapping>
<filter-name>RollDiceFilter</filter-name>
<url-pattern>/dices/roll</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>SetSettingsFilter</filter-name>
<url-pattern>/dices/setup</url-pattern>
</filter-mapping>
和过滤器:
public class RollDiceFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
HttpSession session = req.getSession();
DiceBoard diceBoard = (DiceBoard)session.getAttribute("diceBoard");
String[] lockedValues = req.getParameterValues("lock");
diceBoard.unlockAllDice();
if (lockedValues != null) {
for (String value : lockedValues) {
if (value != null) {
try {
diceBoard.lockDice(Integer.parseInt(value));
} catch (DiceNotInCollectionException e) {
// TODO: redirect to error page.
e.printStackTrace();
}
}
}
}
diceBoard.getCup().roll();
chain.doFilter(req, res);
}
public void init(FilterConfig fConfig) throws ServletException { }
public void destroy() { }
}
这是错误所在的行:
RequestDispatcher view = request.getRequestDispatcher("diceBoardPage.jsp");
根据,输入uri是相对于当前servlet上下文的,因此当您在
/dices/roll
。。。它向“diceBoardPage.jsp”执行分派,实际上是向
/dices/diceBoardPage.jsp
这个模式映射到哪个servlet?根据部署描述符,每个以“/dices/*”开头的URL都映射到DiceBoard
。即,相同的servlet。这是导致StackOverflower错误的无限循环
如果JSP必须保持在dices
uri中,则必须限制映射DiceBoard
servlet的URL模式。如果需要,请毫不犹豫地添加几个值:
<servlet-mapping>
<servlet-name>DiceBoard</servlet-name>
<url-pattern>/dices/one</url-pattern>
<url-pattern>/dices/two</url-pattern>
<url-pattern>/dices/three</url-pattern>
</servlet-mapping>
骰子
/骰子/一
/骰子/两个
/骰子/三
您的servlet将转发发送到哪里?请把你的代码的相关行贴出来。我现在已经贴出了相关的代码。我认为它与此有关,这就是为什么我认为代码与此问题不太相关的原因。谢谢!我刚刚也明白了。我将getRequestDispatcher()的参数改为/diceBoardPage.jsp
,因此现在它是相对于上下文根的。谢谢你的帮助和教导我,我可以提供多个!
/dices/diceBoardPage.jsp
<servlet-mapping>
<servlet-name>DiceBoard</servlet-name>
<url-pattern>/dices/one</url-pattern>
<url-pattern>/dices/two</url-pattern>
<url-pattern>/dices/three</url-pattern>
</servlet-mapping>