我有我的工作代码片段
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
request.getRequestDispatcher("link.html").include(request, response);
String userName = request.getParameter("userName");
String passWord = request.getParameter("passWord");
我对这段代码没有任何问题,它按照我想要的方式工作。但是,如果我交换getWriter()和getRequestDispatcher()的位置,则会显示IllegalArgumentException。
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
request.getRequestDispatcher("link.html").include(request, response);
PrintWriter writer = response.getWriter();
String userName = request.getParameter("userName");
String passWord = request.getParameter("passWord");
java.lang.IllegalStateException: getOutputStream() has already been called for this response
org.apache.catalina.connector.Response.getWriter(Response.java:614)
org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:199)
com.servlet.LoginServlet.doPost(LoginServlet.java:34)
javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
它说
getOutputStream()
已经被调用。我一直在搜索此异常,但是我目前的情况没有任何适当的解释。这些是我的假设(如果我做错了,请纠正我)
getRequestDispatcher()
隐式调用getOutputStream()
,如果调用getWriter()
方法,则会显示异常,因为不能同时调用getOutputStream()
和`getWriter()。如果在
getWriter()
方法之前调用getRequestDispatcher()
方法,则getRequestDispatcher()
将使用返回的PrintWriter
对象而不是调用getOutputStream()
。如果我所有的假设都是错误的,您能告诉我这三种方法的正确关系是什么?
最佳答案
getOutputStream()和getWriter()之间存在关系。
但是,getRequestDispatcher()之间没有关系。getOutputStream()
和getWriter()
之间的关系是在请求处理期间不能同时使用它们。原因是,使用这两种方法都会交错数据。它不符合最终要求。
在您的情况下,getRequestDispatcher()
使用的是getOutputStream()
,因此您以后无法使用getWriter()
进行写入。
否则也可以。
关于java - getRequestDispatcher(),getOutputStream()和getWriter()有关系吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36928058/