要创建一个servlet来处理请求,您需要扩展 javax.servlet.http.HttpServlet 并重写您需要的任何方法(在您的示例中,它通常只是 doGet 以及 doPost . 您正在重写这些方法,但也调用的默认实现 javax.servlet.http.HttpServlet . javax.servlet.http.HttpServlet 不知道您要做什么,所以它的实现只是将错误返回给客户机。代码如下: 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);
}
}响应是用 resp.sendError . 如果您阅读了这个方法的javadoc,它会说(我的重点):如果已提交响应,则此方法将抛出illegalstateexception。使用此方法后,应将响应视为已提交,而不应将其写入。当你回到你的代码,你做了一个 dispatcher.forward(request, response); ,但响应已由 super.doGet 或者 super.doPost 打电话。无法再写入已提交的响应,因为响应内容已写入输出流并发送到客户端。当你这么做的时候,你会得到你在帖子中描述的,一个非法的状态例外:java.lang.illegalstateexception:提交响应后无法转发简言之:当你打电话的时候 super.doGet 或者 super.doPost 然后你的代码,你基本上试着写两次响应,所以你得到了非法的状态异常。删除对的呼叫 super.doGet 或者 super.doPost 只允许您的代码处理请求并生成单个响应,这就是它工作的原因。
|