2017-04-19 22 views
0

我正在尝试创建简单的Web应用程序。 这里是我的web.xmlstackoverflowerror尝试访问Web应用程序时

<servlet> 
    <servlet-name>basicServlet</servlet-name> 
    <servlet-class>com.pack.BasicServlet </servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>basicServlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

这是我index.jsp是位于webapp/WEB-INF/jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="UTF-8"> 
     <title>Basic web page</title> 
    </head> 
    <body> 
     <h2>Data provided by server:</h2> 
     <p> 
      <c:choose> 
       <c:when test="${ not empty message }"> 
        <h3>${message}</h3> 
       </c:when> 
       <c:otherwise> 
        <h3>none</h3> 
       </c:otherwise> 
      </c:choose> 
     </p> 
    </body> 
</html> 

这是我servlet

public class BasicServlet extends HttpServlet { 

    private IBasicService basicService; 

    @Override 
    public void init() throws ServletException { 
     basicService = new BasicService(); 
    } 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     req.setAttribute("message", basicService.provideMessage()); 
     req.getRequestDispatcher("/jsp/index.jsp").forward(req, resp); // 23 line 
    } 
} 

我建了一个war并在Tomcat中部署它。但是,当我尝试访问它,我得到很长的堆栈跟踪

javax.servlet.ServletException: Servlet execution threw an exception 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
com.pack.BasicServlet.doGet(BasicServlet.java:23) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:635) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
com.pack.BasicServlet.doGet(BasicServlet.java:23) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:635) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
com.pack.BasicServlet.doGet(BasicServlet.java:23) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:635) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
com.pack.BasicServlet.doGet(BasicServlet.java:23) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:635) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
com.pack.BasicServlet.doGet(BasicServlet.java:23) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:635) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
... 

root cause

java.lang.StackOverflowError 
com.pack.BasicServlet.doGet(BasicServlet.java:22) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:635) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
.... 

问题是什么?我很久以前使用了servlets,所以也许我忘了一些东西...

回答

3

您已经将您的servlet绑定到了URL模式/*,因此其上下文中的每个请求都将定向到该servlet。该servlet的doGet()方法尝试将请求转发到URL /jsp/index.jsp,但与servlet上下文中的每个其他URL一样,该请求将被引导(返回)到servlet。这会创建一个无限递归,这在您的堆栈跟踪中很明显。

将您的servlet绑定到更具体的URL模式。或者,如果您想要预处理每个入站请求,请考虑通过Filter而不是servlet来实现该请求。

相关问题