Servlets 在Java Servlet中转发请求时的无限循环

Servlets 在Java Servlet中转发请求时的无限循环,servlets,tomcat7,java-7,Servlets,Tomcat7,Java 7,我希望你能帮助我解决我面临的这个问题: 我使用NetBeans创建了一个简单的web应用程序。 到目前为止,这是非常基本的 servlet通过/verificon/*url模式接收请求 它提取/verificon/之后设置的任何字符串,即如果url是http://domain/context/verificon/blahblah,它提取blahblah 它检查这样的字符串是否为已知字符串,并简单地显示一个带有结果的jsp(true/false) 但是,尽管很简单,但在使用测试字符串运行应用程序时

我希望你能帮助我解决我面临的这个问题:

我使用NetBeans创建了一个简单的web应用程序。 到目前为止,这是非常基本的

  • servlet通过
    /verificon/*
    url模式接收请求
  • 它提取
    /verificon/
    之后设置的任何字符串,即如果url是
    http://domain/context/verificon/blahblah
    ,它提取
    blahblah
  • 它检查这样的字符串是否为已知字符串,并简单地显示一个带有结果的jsp(true/false)
  • 但是,尽管很简单,但在使用测试字符串运行应用程序时,我会遇到以下错误:

    javax.servlet.ServletException: 
    The server side component of the HTTP Monitor has detected a java.lang.StackOverflowError.
    This happens when there is an infinite loop in the web module.
    Correct the cause of the infinite loop before running the web module again.
    
    org.netbeans.modules.web.monitor.server.MonitorFilter.rethrow(MonitorFilter.java:1648)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:473)
    mx.tegu.kdor.web.iu.ServletVerificon.processRequest(ServletVerificon.java:51)
    mx.tegu.kdor.web.iu.ServletVerificon.doGet(ServletVerificon.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    mx.tegu.kdor.web.iu.ServletVerificon.processRequest(ServletVerificon.java:51)
    mx.tegu.kdor.web.iu.ServletVerificon.doGet(ServletVerificon.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    mx.tegu.kdor.web.iu.ServletVerificon.processRequest(ServletVerificon.java:51)
    mx.tegu.kdor.web.iu.ServletVerificon.doGet(ServletVerificon.java:70)
        ...
    
    然后它就不断地重复它自己

    我的servlet的processRequest方法如下所示
    TestData
    不过是一个助手类,如果字符串已知,则返回
    Mapeo
    对象;如果字符串未知,则返回
    null

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    
    String h = request.getRequestURI().replaceFirst(request.getContextPath() + "/verificon/", "");
    
    TestData td = TestData.getInstance();
    
    Mapeo m = td.getMapeo(h);
    
    boolean valido = false;
    if(m != null) {
      valido = true;
    }
    
    request.setAttribute("valido", valido);
    
    /*
    PrintWriter out = response.getWriter();
    out.write("Válido?: " + valido);
    out.close();
    */
    
    String respuesta = "WEB-INF/jsp/resultado.jsp";
    // Como regla general, forward se utiliza para los GET y sendRedirect para los POST
    RequestDispatcher rd = request.getRequestDispatcher(respuesta);
    rd.forward(request, response);
    
    }

    非常感谢您的帮助

    如果您需要知道任何其他信息,请告诉我

    谢谢大家!

    注1:servlet的第51行是processRequest方法末尾对rd.forward()的调用,第70行只是从doGet方法对processRequest()的调用。 注2:如果我对forward部分进行注释并取消对PrintWriter部分的注释,那么一切都会按预期进行。 注3:resultado.jsp是一个普通的HTML页面,带有适当的doctype def、HTML、head和body标记,如下所示:
    
    ...
    瓦利多

    因瓦里多

    看这里

    String respuesta = "WEB-INF/jsp/resultado.jsp";
    RequestDispatcher rd = request.getRequestDispatcher(respuesta);
    // ...
    
    您正在使用相对路径进行转发。它正在转发到
    http://domain/context/verificon/blahblah/WEB-INF/jsp/resultado.jsp
    再次匹配servlet。它依次使用相对路径转发到
    http://domain/context/verificon/blahblah/WEB-INF/jsp/resultado.jsp/WEB-INF/jsp/resultado.jsp
    再次匹配servlet。等等。如果您已经调试/记录了传入的请求URI,那么一切都会变得更加清楚

    您需要改为使用绝对路径进行转发。在其前面加上
    /

    String respuesta = "/WEB-INF/jsp/resultado.jsp";
    // ...
    

    与具体问题无关,在JSP中检查值的方法非常笨拙和老套。只需使用(已经存在十多年了,请确保您正在阅读正确的JSP/Servlet书籍/教程):

    ${valido?'Válido':'Inválido'}


    Pff,真不敢相信我错过了!谢谢你帮我做这个!。另外,谢谢你的建议,我会继续的。