`

sendRedirect,forward,include区别

阅读更多
又是一个好老的题目.
首先,sendRedirect与forward,include的最大区别是request,response..
sendRedirect产生新的请求与响应,前后已没有联系.
相当于在页面中重新输入一个URL,只是自动完成而已.
forward,include是共用同一请求.客户端完全不知道(浏览器中的URL不变)

使用方式:
servlet和jsp里面一样

response.sendRedirect(); 



其次,forward与include的区别.
调用forward()方法时必须注意下列两点:
在HTTP回应被“确认”(committed)以前才能调用forward()方法(这里的“确认”是指将HTTP回应的内容主体送回用户端),否则将拋出IllegalStateException异常。[include没有这种情况]
调用forward()方法后,原先存放在HttpResponse对象中的内容将会自动被清除(也就是在forward方法前,使用PrintWriter,ServletOutputStream输出的内容都被忽略)
[include不会]

使用方式
Servlet中
getServletContext().getRequestDispatcher(path).include(request,response);
getServletContext().getRequestDispatcher(path).forward(request,response);

这里面的path必须以"/",相对于当前WEB应用程序根目录
request.getRequestDispatcher(path).include(request,response);
request.getRequestDispatcher(path).forward(request,response);

这里面的path可以是以"/"开头,也可以使用相对路径.

在JSP中
<jsp:include page=""/>
<jsp:forward page=""/>


forward在SERVLET与JSP中表现不一致:servlet中:运行forward方法,后面的语句会执行完,再去执行forward方法 (符合JAVA程序运行顺序)
在jsp中,运行到forward后,直接跳转,后面的语句不再执行.


两者的区别:
forward方法是把请求的内容转发到另外的一个servlet/jsp.
include是把另一个servlet/jsp处理过后的内容拿过来与此时servlet的内容一同输出.

----------------------------------------------------------
forward与include还有一个重要的区别:
forward在调用者程序中设置的响应状态码和响应头不会被忽略,在被调用者程序中设置的响应状态码和响应头也不会被忽略.
include会被忽略..
这也是乱码的一个原因..
使用include时候,要要调用程序中写上response.setContentType("text/html;charset=utf-8")
不管你是不是用filter统一处理过字符.

===================================================================
总结下:
sendRedirect与include,forward的区别在于是不是同一个request
include与forward的区别在于输出内容,以及响应头!

分享到:
评论
1 楼 hydex 2010-05-27  
getRequestDispatcher("xxxURL").forward(req, res);//include(req, res);

相关推荐

Global site tag (gtag.js) - Google Analytics