
代码如下
public class HttpServletTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp); 需要去掉,否则会报错
super.doGet(req, resp);
System.out.println("进入HttpServletTest doGet() ");
req.getRequestDispatcher("/index.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp); 需要去掉,否则会报错
super.doPost(req, resp);
this.doGet(req, resp);
}
}
查看 super.doGet(req,resp)的源码
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_get_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
} else {
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
}
}
这是因为,显示调用父类的super.doGet(req,resp)方法,且先执行完,就等于已经响应了一次,然后又去跳转又去响应,就会报错重复提交。所以去掉super.doGet(req,resp);
本文详细解析了在自定义Servlet时,如何正确覆盖doGet和doPost方法,避免因错误调用super.doGet(req, resp)而导致的重复响应错误。通过分析super.doGet方法的源码,揭示了其内部机制及为何直接调用会导致问题。

4989

被折叠的 条评论
为什么被折叠?



