Java Servlet应该接受POST并获取

Java Servlet应该接受POST并获取,java,servlets,Java,Servlets,我尝试实现一个servlet,它应该通过POST或GET调用 所以我写了这样的东西 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } @Override protected void doGet(HttpServletRequest req,

我尝试实现一个servlet,它应该通过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;
 }
但是/或者因为最后的前锋,我得到了一个非法状态例外,这只是一个警告,但仍然是。我应该怎么做

谢谢,
-孤独的

编辑:跟踪

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)

您可以直接重写
service()
方法,它是为所有请求方法调用的。

这个.getServletContext()替换为req

让GET和POST都做同样的事情与您的具体问题无关。您的问题是由于在servlet中写入响应,从而在执行转发之前隐式地提交它而引起的

不要触摸servlet中的
response.getWriter()
resposne.getOutputStream()
,让JSP来完成这项工作。如果需要准备JSP需要显示的数据,只需将其设置为请求、会话或应用程序范围中的属性,具体取决于数据需要保存的范围

另见:

顺便说一句,在GET和POST上做同样的工作很难闻。您确定您了解这些方法的具体用途吗?

非法状态异常绝不仅仅是一个警告。代码做什么,异常的完整堆栈跟踪是什么?异常包含有意义的消息,这些消息旨在被读取,并有助于诊断问题。请阅读以下内容:为什么要在末尾使用return?请阅读这些,希望helps@JBNizet:我添加了堆栈跟踪。对所有其他人。谢谢你的链接。读了你的东西却不知道这能帮我什么忙?正如我所说,我不知道异常是从哪里来的。也许我太没经验了?读吧。答复已经提交。因为您还没有显示代码,所以无法确定原因。javadoc说:此方法与ServletContext#getRequestDispatcher的区别在于此方法可以采用相对路径。@JBNizet ans可能适合此要求。但这没有错,对吗?是的,错了。两种方法都做相同的事情,除了一个接受相对路径,而另一个不接受。OP使用的是一个绝对路径。它可以使用更多的解释,更多的细节,一个它正确的原因,一个链接来支持你认为它正确的原因。总的来说,你的答案没有太多的深度,如果不做我自己的研究,我无法知道它是对还是错,但到那时,我就可以写我自己的答案了。简言之,不清楚为什么这会解决问题,因此答案应该是一个知识库,以帮助其他人不仅解决他们的问题,而且理解解决方案的工作原理。希望这有帮助:)在我的代码中查找了一下,只找到了一个可能出现这种情况的片段。在XSSFilter内部,我做
chain.doFilter(新的FilteredRequest(请求),响应)
和紧接着的
chain.doFilter(请求、响应)可能需要
返回
语句?我想我知道POST和GET有什么好处,但这段代码是一个练习的一部分,这就是为什么这种方式很方便。想要有一个控制器来处理表单POST和url GET请求,这两个请求做同样的事情。如果它们都在一次调用中被调用,那么是的,这可能是错误的。无论如何,请删除该XSS筛选器。XSS预防应该在响应(JSP)时进行,而不是在请求时进行。也见下文。但这是一个练习,需要XSSFilter;)