Java requestDispatcher#forward()上的Tomcat infinte循环。堆栈溢出错误

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>/

在不断重复这些行之后,Tomcat给了我StackOverflowerError,其中
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>