2017-04-19 11 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> 

これは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> 

にある私のindex.jspであり、これは私がwarを構築し、Tomcatの中でそれを展開し、私の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 
    } 
} 

です。私はそれにアクセスしようとすると、しかし、私は長い間、スタックトレース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) 
.... 

問題は何であると

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) 
... 

取得しますか?私はservletsを長年使用していましたので、何かを忘れたかもしれません...

答えて

3

あなたのサーブレットはURLパターン/*にバインドされているので、そのコンテキストに関するすべてのリクエストはサーブレットに送られます。サーブレットのdoGet()メソッドは、リクエストをURL /jsp/index.jspに転送しようとしますが、サーブレットのコンテキスト内の他のすべてのURLと同様に、サーブレットに向けられます。これは、無限の再帰を作成します。これは実際にスタックトレースに明白です。

より具体的なURLパターンにサーブレットをバインドします。あるいは、すべてのインバウンドリクエストを前処理する場合は、サーブレットではなくFilterで実装することを検討してください。

関連する問題