1.状态管理

(1)什么是状态管理?

将浏览器与web服务器之间多次交互当作一个整体来处理,并且将 多次交互所涉及的数据(即状态)保存下来。

(2)如何进行状态管理?

方式一: 将状态保存在浏览器端(Cookie)。

方式二: 将状态保存在服务器端(Session)。

(3)Cookie

1)什么是Cookie?

服务器临时存放在浏览器端的少量数据,用于跟踪用户的状态。

注:
    当浏览器第一次访问服务器时,服务器可以将少量数据
以set-cookie消息头的形式发送给浏览器,浏览器会将这些
数据临时保存下来。
    当浏览器再次访问服务器时,会将这些数据以cookie消息头
的形式发送给服务器。

2)添加Cookie

Cookie c = new Cookie(String name,String value);
response.addCookie(c);

3)读取Cookie

Cookie[] request.getCookies();
注:
    该方法有可能返回null。
String cookie.getName();
String cookie.getValue();

4)Cookie的生存时间

默认情况下,浏览器会将cookie保存在内存里面,浏览器如果关闭,则 cookie会被删除。可以调用setMaxAge方法来设置cookie的生存时间。

cookie.setMaxAge(int seconds);
注:
    单位是秒。
    seconds > 0: 浏览器会将cookie保存在硬盘上。超过指定的
                时间,cookie会被删除(失效)。
    seconds < 0: 默认情况(将cookie保存在内存里面)。
    seconds = 0: 删除cookie。
            比如,要删除一个名称为"username"的cookie:
            Cookie c = new Cookie("username","");
            c.setMaxAge(0);
            response.addCookie(c);  

5)cookie的编码问题

a.什么是cookie的编码问题?

cookie只能存放合法的ascii字符,对于非ascii字符(比如中文)
需要转换成对应的ascii字符的形式。

b.如何解决?

添加cookie时,使用encode方法对要添加的字符串进行编码,
读取cookie时,使用decode方法来解码。

String URLEncoder.encode(String str,String charset);
String URLDecoder.decode(String str,String charset);

建议:
    在添加cookie时,不管是否是ascii字符,
    统一使用encode方法来编码。

 6)Cookie的路径问题

a.什么是cookie的路径问题?

浏览器在访问服务器时,会比较请求路径是否与cookie的路径
匹配,只有匹配条件的cookie才会被发送出去。

b.cookie默认路径

cookie的默认路径等于添加该cookie的web组件的路径。
比如,/servlet07/biz01/addCookie.jsp添加了一个cookie,
则该cookie默认路径就是"/servlet07/biz01"

c.匹配规则

请求路径要么等于cookie的路径,要么是cookie的子路径,
该cookie才会被发送。

比如,cookie的路径是"/servlet07/biz01",则:
请求地址是/servlet07/findCookie1.jsp,则cookie不会被发送;
请求地址是/servlet07/biz01/findCookie2.jsp,会发送;
请求地址是/servlet07/biz01/sub/findCookie3.jsp,会发送。

d.如何修改cookie的路径?

cookie.setPath(String path);

练习:

写一个Servlet,该Servlet先查看有没有一个名称为"cart"的cookie, 如果有,则显示该cookie的值; 如果没有,则添加该cookie。