重定向:地址栏有变化,一个Servlet,是二个请求
转发:地址栏没变化,至少2个Servlet,是一个请求(留头不留体,意思就是最好不要体(因为你都去叫别人帮忙了,你还做点事,那还不如不叫别人帮忙呢,自己做得了),留个头就行了,这个头用HttpWatch可以在刷新页面是看到)
包含:与转发的区别就是又留头又留体(意思是叫别人帮忙时,你自己也做点事情)
你的上司叫你做事,你对上司说行(其实自己不行),然后自己悄悄的去找李四帮自己做,这叫转发,如果自己也做点,那就叫包含。
重定向小结
l 重定向是两次请求;
l 重定向的URL可以是其他应用,不局限于当前应用;
l 重定向的响应头为302,并且必须要有Location响应头;
l 重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据,不然可能会出现异常;
request获取请求参数
最为常见的客户端传递参数方式有两种:
l 浏览器地址栏直接输入:一定是GET请求;
l 超链接:一定是GET请求;
l 表单:可以是GET,也可以是POST,这取决与<form>的method属性值;
GET请求和POST请求的区别:
l GET请求:
Ø 请求参数会在浏览器的地址栏中显示,所以不安全;
Ø 请求参数长度限制长度在1K之内;
Ø GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;
l POST请求:
Ø 请求参数不会显示浏览器的地址栏,相对安全;
Ø 请求参数长度没有限制;
请求转发与请求包含比较
l 如果在AServlet中请求转发到BServlet,那么在AServlet中就不允许再输出响应体,即不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由BServlet来完成;如果是使用请求包含,那么没有这个限制;
l 请求转发虽然不能输出响应体,但还是可以设置响应头的,例如:response.setContentType(”text/html;charset=utf-8”);
l 请求包含大多是应用在JSP页面中,完成多页面的合并;
l 请求转发大多是应用在Servlet中,转发目标大多是JSP页面;
请求转发与重定向比较
l 请求转发是一个请求,而重定向是两个请求;
l 请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;
l 请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;
l 请求转发对AServlet和BServlet的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;
l 重定向的第二个请求一定是GET;
有时一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳到另一个Servlet!
> 一个请求跨多个Servlet,需要使用转发和包含。
> 请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体,即使设置了响应体)
> 请求包含:由两个Servlet共同未完成响应体!(都留)
> 无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response!
* request域
Servlet中三大域对象:request、session、application,都有如下三个方法:
> void setAttribute(String name, Object value)
> Object getAttribute(String name)
> void removeAttribute(String name);
> 同一请求范围内使用request.setAttribute()、request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。
总之:重定向:地址栏有变化,一个Servlet,是二个请求
转发:地址栏没变化,至少2个Servlet,是一个请求(留头不留体,意思就是最好不要体,留个头就行了)
就比如:你的上司叫你做事,你对上司说这事我做不了,您去找李四做吧,这叫重定向
你的上司叫你做事,你对上司说行(其实自己不行),然后自己悄悄的去找李四帮自己做,这叫转发