-1

POSTまたはGETのいずれかを介して呼び出されるサーブレットを実装しようとしています。

だから私はこのようなものを書きました

 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  this.doGet(req, resp);
 }

 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  // .. do stuff

  // forward to welcome page
  this.getServletContext().getRequestDispatcher("/guestbook.jsp").forward(req, resp);
  return;
 }

しかし/または最後に転送が原因で、IllegalStateExceptionが発生します。これは警告にすぎませんが、それでも発生します。私は別の方法で何をすべきですか?

ありがとう、
-lony

編集:必要なスタックトレース

2012-05-26 18:02:16.422:WARN::/wsc/guestbook
java.lang.IllegalStateException: Committed
    at org.eclipse.jetty.server.Response.resetBuffer(Response.java:1056)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:216)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:115)
    at de.tum.in.dss.GuestbookController.doGet(GuestbookController.java:135)
    at de.tum.in.dss.GuestbookController.doPost(GuestbookController.java:37)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:538)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1352)
    at de.tum.in.dss.XSSFilter.doFilter(XSSFilter.java:76)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1323)
    at de.tum.in.dss.AccessFilter.doFilter(AccessFilter.java:55)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1323)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:476)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:517)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:225)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:937)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:406)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:871)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:247)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
    at org.eclipse.jetty.server.Server.handle(Server.java:346)
    at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:589)
    at org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:1065)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:823)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:220)
    at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:411)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:535)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:529)
    at java.lang.Thread.run(Thread.java:722)
4

3 に答える 3

3

あなたの具体的な問題は、GETとPOSTの両方に同じことをさせることとは関係ありません。問題は、サーブレットの応答に書き込み、転送を実行する前に暗黙的にコミットすることによって発生します。

response.getWriter()サーブレットに触れたり、サーブレットに触れたりせずresposne.getOutputStream()に、JSPにその作業を任せてください。JSPが表示する必要のあるデータを準備する必要がある場合は、データが保持する必要のあるスコープに応じて、リクエスト、セッション、またはアプリケーションスコープの属性として設定するだけです。

参照:

GETとPOSTで同じ仕事をするのは、ちなみに臭いです。これらの各メソッドが何に使用されるのかを正確に理解していますか?

于 2012-05-26T18:48:36.590 に答える
0

メソッドを直接オーバーライドできますservice()。すべてのリクエストメソッドに対して呼び出されます。

于 2012-05-26T08:11:26.513 に答える
-1

this.getServletContext()reqに置き換えます

于 2012-05-26T08:12:11.250 に答える