RequestDispatcher转发后out.println失效问题及原因咨询
Servlet转发与输出问题解答
代码示例
public class Uploadservlet extends HttpServlet { public void doPost(HttpServletRequest req,HttpServletResponse res) throws IOException, ServletException { String name="arul"; PrintWriter out=res.getWriter(); if(name=="arul") { req.getRequestDispatcher("uploadfile.jsp").forward(req,res); out.println("<h3>hello world</h3>"); System.out.println("hello world"); System.out.println("hi"); } else { out.println("hi hello"); System.out.println("hi hello"); } } }
问题解答
1. RequestDispatcher转发后后续代码的执行逻辑
- 调用
forward()方法后,当前Servlet中后续的代码会继续执行,比如你代码里的out.println("<h3>hello world</h3>")、两次System.out.println都会按顺序执行完毕。 forward()只是把请求和响应的处理权转交给目标uploadfile.jsp,让它生成响应内容,但并不会终止当前Servlet的代码执行流程。
2. out.println无法输出但System.out.println正常的原因
System.out.println是直接输出到服务器控制台,和HTTP响应的输出流完全无关,只要代码执行到这一行,就会在服务器的控制台打印内容,不受请求转发的影响。PrintWriter out是用来向客户端输出HTTP响应内容的流,调用forward()后会出现以下情况导致它无法输出:- 当
forward()执行后,服务器会将响应的输出控制权移交到目标JSP页面。如果目标JSP已经完成了响应的提交(比如输出了HTML内容并刷新了响应流),此时HTTP响应的状态码、响应头已经确定,后续当前Servlet再通过out输出内容,服务器会直接忽略这些输出,因为响应已经无法被修改。 - 即使目标JSP没有提交响应,
forward()操作后,当前Servlet的输出流会被服务器标记为不可用,后续的输出不会被发送到客户端。
- 当
- 额外提醒:你代码里的字符串比较
name=="arul"是错误写法,Java中比较字符串内容应该用equals()方法,即name.equals("arul"),==比较的是对象引用地址,虽然这里因字符串常量池可能碰巧生效,但这是不严谨的写法。
内容的提问来源于stack exchange,提问作者ARULVIJAY
相关产品推荐
相关产品推荐

