Java Servlet应该接受POST并获取
我尝试实现一个servlet,它应该通过POST或GET调用 所以我写了这样的东西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,
@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;)