java - 重复 doGet 调用

标签 java servlets

我的 HttpServlet 片段:

   protected void doGet(HttpServletRequest httpServletRequest,
                         HttpServletResponse httpServletResponse) throws ServletException,
                                                                         IOException {
        final String[] values = httpServletRequest.getParameterValues("p");
        final int p;
        if (values != null && values.length > 0) {
            p = Integer.parseInt(values[0]);
        } else {
            p = 0;
        }
        final ServletContext context = super.getServletContext();
        switch (p) {
        case 0:
            {

                final CityRepresentationBean bean =
                    new CityRepresentationBean(ds);
                final RequestDispatcher rqDsp;
                try {
                    rqDsp =
                            context.getRequestDispatcher(bean.act(httpServletRequest));
                    rqDsp.forward(httpServletRequest, httpServletResponse);
                } catch (ConnectionException e) {
                    throw new ServletException(e);
                }
 ......
}

主要问题是我收到 StackOverFlow 异常。从调试中,我发现我得到 ConnectionException,然后在 抛出 new ServletException(e) 之后再次调用 doGet 方法(我什至不知道谁可以调用它)。

问题是如果浏览器只调用一次 URL,如何多次调用 servlet?

java.lang.StackOverflowError
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:303)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:523)
    at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:253)
    at project2.FrontController.doGet(FrontController.java:64)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:523)
    at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:253)
    at project2.FrontController.doGet(FrontController.java:64)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:523)
    at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:253)
    at project2.FrontController.doGet(FrontController.java:64)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:523)
    at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:253)
    at project2.FrontController.doGet(FrontController.java:64)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:523)
    at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:253)
    at project2.FrontController.doGet(FrontController.java:64)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)

最佳答案

该 servlet 的 URL 模式也与 bean.act(httpServletRequest) 返回的 URL 相匹配。在你的RequestDispatcher#forward() .

所以,你有两个选择:

  1. 将 servlet 映射到更具体的 URL 模式。至少/*或者其他的东西。例如,/pages/**.do .
  2. 确保 act() 返回的 URL与 servlet 的 URL 模式不匹配。

相关:

关于java - 重复 doGet 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8099633/

相关文章:

servlets - 如何通过 http 建立 Red5 隧道而不出现 NetConnection.Connect.Closed 错误?

java - 正在从 tomcat 服务下载部分文件

java - 如何对 servlet 进行单元测试?

java - 需要 while 循环程序的帮助

java - Android水平矩形审阅栏

java - 如何处理 SOAP :mustUnderstand ="1" in webservice

java - http 请求的 servlet-container 和调度程序 servlet 的顺序是什么?

用于解决性能问题的 Java 分析器

适用于 Windows Server 的 ServiceBus 上的 Java - 选项?

java - 无法解析为变量exportStr