rd.include vs rd.forward()中的flush()

时间:2014-09-04 17:48:20

标签: servlets flush forward jspinclude requestdispatcher

我的网络应用中有以下代码段:

if (request.getParameter("user").equals("luke")||session == null && !(uri.endsWith("html") || uri.endsWith("LoginServlet"))) {  
    System.out.println("<<<----------denied------------->>>>");  
    pw.println("zzzzzzzzzz");  
    this.context.log("Unauthorized access request");  
    pw.flush(); 

    try {  
        Thread.sleep(5000);  
    } catch (InterruptedException e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
    }  

    //res.sendRedirect("login.html");  
    req.getRequestDispatcher("login.html").include(request,response);  
} 

当我在Forward()之前使用flush时,它会抛出IllegalStateException(因为响应是在我们调用flush时发送的,之后我们尝试使用forward重新发送响应)但是代码即使我在rd.include()之前提供了同花顺,也能正常工作。为什么不在这里抛出异常?

TIA

2 个答案:

答案 0 :(得分:1)

第9.4章中forward方法的Servlet Specification和第9.3章中的include方法解释了这种行为。

javadoc还详细解释了这一点。

HttpServletResponse#getWriter()州的javadoc条目

  

flush()上调用PrintWriter会提交回复。

提交响应意味着写入状态行和标题并刷新响应主体的任何部分在缓冲区中。

javadoc of forward

  

将来自servlet的请求转发到另一个资源(servlet,JSP   文件或HTML文件)在服务器上。这个方法允许一个servlet   做一个请求的初步处理和另一个资源   生成响应。

因此,转发到资源必须负责生成和提交响应。如果响应已经提交,则无法执行此操作。

javadoc of include

  

包含的servlet无法更改响应状态代码或设置   头;任何改变的尝试都会被忽略。

此方法仅获取另一个资源的内容并将其写入响应。它无法对标题或状态代码执行任何操作。因此,在之前或之后提交没有任何区别。

答案 1 :(得分:0)

forwardinclude是不同的方法,include方法允许您向响应中添加内容,jsp中有include tag,include方法类似但是在服务器中。

forward方法将请求处理转移到另一个进程(servlet,jsp),并且该进程必须更改响应,这就是您获得该异常的原因,您无法在转发之前更改响应

您可以查看这些方法的文档here