考查对Servlet基本知识的掌握

问:
    Servlet中,HttpServletResponse的哪个方法用来把一个HTTP请求重定向到另外的URL?
    a.sendURL()
    b.redirectURL()
    c.sendRedirect()
    d.redirectResponse()
    
解析:
    在Servlet编程中,服务器端重定向可以通过下面两个方法来实现
        运行javax.servlet.RequestDispatcher接口的forward()方法
        运行javax.servlet.http.HttpServletResponse接口
        
    要运行RequestDispatcher接口的forward()方法,首先要得到一个RequestDispatcher对象。Servlet技术提供了3种方式来得到它。
        运行javax.servlet.ServletContext接口的getRequestDispatcher()方法,将一个包含路径的字符串传递给其他资源。该路径是相对于ServletContext的根路径。
        运行javax.servlet.ServletRequest接口的getRequestDispatcher()方法,将一个包含路径的字符串传递给其他资源。该路径是相对于当前的HTTP请求的。
        运行javax.servlet.ServletContext接口的getNamedDispatcher()方法,传递一个包含其他资源名字的字符串。
        
    注:只有在客户端没有输出时才可以调用forward()方法。如果当前页面的缓冲区(buffer)不是空的,那么在调用forward方法前,必须清空缓冲区,否则,会抛出一个IllegalStateException异常,Forward()方法也可以用来将请求发送到一个静态页面。

    1.RequestDispatcher.forward()
        当使用forward()时,Servlet engine引擎将HTTP请求从当前的Servlet或JSP传递到另一个Servlet,JSP或普通HTML文件。form表单请求提交至a.jsp,a.jsp调用forward()重定向至b.jsp,此时form提交的所有信息在b.jsp都可以获得,参数自动传递。
        forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,例如servlet?name=frank的形式不合法,但可以在程序内通过response.setAttribute("name",name)来将变量传给下一个页面。
        说明:重定向后浏览器地址栏URL不变。
        forward()方法通常在Servlet中使用,不在JSP中使用。
    
    2.response.sendRedirect()
        在用户的浏览器端工作。sendRedirect()可以带参数传递,例如servlet?name=frank将参数传至下个页面。同时sendRedirect()方法可以重定向至不同主机上,sendRedirect()可以重定向有frank的文件。
        由于response是JSP页面中的隐含对象,故在JSP页面中可以用response.sendRedirect()直接实现重定位。
        注:
            (1).使用response.sendRedirect()方法时,前面不能有HTML输出。这并不是绝对的,不能有HTML输出其实是指不能有HTML被送到浏览器。事实上现在的服务器都有cache机制,一般在8K(JSP或SERVER)。这意味着关闭了cache或使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。
            (2).response.sendRedirect()方法之后,应紧跟一句return,因为response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才有实际的动作。
    
    比较:
        (1).RequestDispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址。
        (2).response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,浏览器的地址栏可以看到跳转后的链接地址。
        前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法。
    
    注:在有些情况下,如需跳转到一个其他服务器上的资源,则必须使用HttpServletResponse.sendRedirect()方法。
    
答:
    c