转发和重定向

1.转发 
一个web组件(servlet/jsp)将未完成的处理交给另外一个web组件继续做。
比如,一个servlet将处理结果转发给一个jsp来展现。
2.如何转发
step1,绑定数据到request上。
request.setAttribute(String name,Object obj);
注:
根据绑定名获得绑定值。
Object request.getAttribute(String name);
step2,获得转发器
RequestDispatcher rd = request.getRequestDispatcher(String uri);
uri:转发的地址。
step3,转发
rd.forward(request,response);
3.转发的特点
a.转发之后,浏览器地址栏的地址不变。
b.转发地址有限制(必须是同一个应用)。

include指令
告诉容器,在将jsp文件转换成servlet类时,将file属性指定的文件的内容
插入到指令所在的位置。
比如:<%@include file="header.jsp"%>

处理servlet运行时产生的异常
(1)编程式处理
step1,捕获异常
step2,转发
比如:
request.setAttribute("error_msg","系统繁忙,稍后重试");
request.getRequestDispatcher("error.jsp").forward(request,response);
(2)声明式处理(即交给容器来处理) 
step1,捕获异常,然后抛出异常给容器。
step2,配置异常处理页面
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/error.jsp</location>
</error-page>
声明式异常常常用来处理系统异常(异常发生之后不能回复,比如数据库服务停止),发生这类异常之后,提示用户稍后重试即可。
编程式异常(转发的方式)更灵活,可以用来处理应用异常(比如,用户输入错误的密码等)。


比较转发与重定向
(1)转发所涉及的各个web组件可以共享同一个request对象;重定向不可以。
注:
  容器收到请求之后,会创建request对象和response对象,当相应发送完毕,容器会立即删除request对象和response对象。
也就是说,request对象和response对象的生存时间是一次请求和响应期间。重定向是两次请求。
(2)重定向之后,浏览器地址栏的地址会变,但是转发不会变。
(3)重定向地址是任意的,而转发地址必须是同一个应用。
(4)转发是一件事未完成,而重定向是一件事已经完成。 

路径问题
链路地址,表单提交地址,重定向,转发这四种情况下,如果填写路径。
<a href=""></a>
<form action="">
response.sendRedirect("");
request.getRequestDispatcher("");
(1)相对路径
不以"/"开头的路径
(2)绝对路径
以"/"开头的路径。
(3)如何写绝对路径
链接地址,表单提交地址,重定向从应用名开始写;
转发从应用名之后开始写。 
注:
要使用String request.getContextPath();来获得实际部署时的应用名。


转发与重定向的区别
(1)能否共享request
转发可以,而重定向不行。
注:
容器收到请求之后,会创建request和response,
当响应发送完毕,会销毁这两个对象。
(2)浏览器地址栏的地址有无变化
转发无变化,而重定向有变化。
(3)目的地有无限制
转发有限制(同一个应用),而重定向无限制。

状态管理
(1)什么是状态管理
将浏览器与web服务器之间的多次交互作为一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来。
(2)cookie
1)什么是cookie?
服务器临时保存在浏览器端的少量的数据。
2)工作原理
当浏览器访问服务器时,服务器可以将少量数据以set-cookie消息头的方式发送给浏览器,浏览器会将这些数据临时保存下来。
当浏览器再次访问服务器,会将之前保存的这些数据以cookie消息头的方式发送给服务器。
3)添加cookie
Cookie c = new Cookie(String name,String value);
response.addCookie(c); 
4)读取cookie
Cookie[] cookies = request.getCookies();
String cookie.getName();
String cookie.getValue();
5)编码问题
cookie只能保存合法的ASCII字符,对于中文,需要将其转换成相应的ASCII
字符的表示形式。
URLEncoder.encode
URLDecoder.decode
注:
添加cookie时,建议最好统一编码处理。
6)生成时间问题
缺省情况下,浏览器会把cookie一直保存,只要浏览器不关闭,cookie就会一直存在,浏览器关闭,cookie就会被销毁。
setMaxAge(int seconds)
注:
单位是秒。
seconds > 0 浏览器会将cookie保存在硬盘上,如果超过了指定的时间,则cookie会被删除。
seconds < 0 缺省值
seconds = 0 删除cookie
比如,要删除一个名词为“cart”的cookie,
Cookie c = new Cookie("cart","");
c.setMaxAge(0);
respongse.addCookie(c);
7)路径问题
a.什么是cookie的路径问题
浏览器在向服务器上的某个地址发请求时,会比较该地址是否符合cookie的路径的要求,只有符合条件的cookie才会被发送出去。
b.cookie的默认的路径
等于添加该cookie的组件(servlet/jsp)的路径。
比如,/web07/biz01/addCookie.jsp添加一个名称为
"cart"的cookie,则该cookie有一个默认的路径("/web07/biz01/")。
c.匹配规则
请求地址必须等于cookie的路径,或者是其子路径。
/web07/findCookie1.jsp no
/web07/biz01/findCookie2.jsp yes
/web07/biz01/sub/findCookie3.jsp yes 
e.cookie只能保存字符串。

猜你喜欢

转载自www.cnblogs.com/crazypokerk/p/8986768.html