forword与include区别
forward方法是把请求的内容转发到另外的一个servlet.而include是把另一个servlet处理过后的内容拿过来.举例来说比如在servlet1打一句out.print("1111"),servlet2打上out.print("22222"),在servlet1中用forward命令会转到servlet2中,显示22222.而在servlet1中使用include方法会依然在servlet1的页面中,但是在1111后打出22222 forward与redirect区别forward仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;redirect则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,forward更加高效,在forward可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。
Forword与include还有一个重要的区别:
forword在调用者程序中设置的响应的状态码和响应头不会被忽略在被调用者程序中设置响应状态码和响应头也不会被忽略。
Include会被忽略
这也是乱码的一个原因,使用include的时候要调用程序中写上respose.setContentType(“text/html;charest=utf-8”)不管你是不是用filter统一处理过的字符。
RequestDispatcher.forward()方法
RequestDispatcher接口所定义的forward()方法可以将HTTP请求转送给其他Web资源(例如Servlet、JSP或HTML)进行处理,并产生HTTP回应。
调用forward()方法时必须注意下列两点:
在HTTP回应被“确认”(committed)以前才能调用forward()方法(这里的“确认”是指将HTTP回应的内容主体送回用户端),否则将拋出IllegalStateException异常。
调用forward()方法后,原先存放在HttpResponse对象中的内容将会自动被清除(本章稍后的实例演练2-3将探讨此议题)。
RequestDispatcher.include()方法
RequestDispatcher接口的include()方法与forward()方法非常类似,惟一的不同在于:利用include()方法将HTTP请求转送给其他Servlet后,被调用的Servlet虽然可以处理这个HTTP请求,但是最后的主导权仍然是在原来的Servlet。换言之,被调用的Servlet如果产生任何HTTP回应,将会并入原来的HttpResponse对象