cookie原理:
用户通过浏览器向myweb网站发送请求申请OneServlet,OneServlet在运行期间创建了一个cookie存储当前用户相关数据。OneServlet工作完毕后,将cookie写入到响应头交还给浏览器,浏览器收到响应包之后,将cookie存在浏览器的缓存中。
用户通过同一个浏览器再次向myweb网站发送请求申请TwoServlet时,浏览器需要无条件的将myweb网站之前推送过来的cookie写入到请求头发送过去。
cookie构造:
cookie(String key,String value)
实现流程图:
Java代码
//配置文件
<servlet>
<servlet-name>OneServlet</servlet-name>
<servlet-class>com.luna.controller.OneServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>TwoServlet</servlet-name>
<servlet-class>com.luna.controller.TwoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TwoServlet</servlet-name>
<url-pattern>/two</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>OneServlet</servlet-name>
<url-pattern>/one</url-pattern>
</servlet-mapping>
首先是用户申请会员卡的页面,用户将userName和money写入,通过表单提交给OneServlet
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>会员申请</title>
</head>
<body>
<center>
<font style="font-size: 40px;color: red">会员卡申请</font><br><br>
<form action="/myweb/one">
用户名:<input type="text" name="userName"><br><br>
预存金额:<input type="text" name="money"><br><br>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</center>
</body>
</html>
OneServlet拿到用户提交的参数后存入cookie,并将cookie写入响应头信息返回给浏览器,浏览器携带cookie重定向至第二个页面——用户点餐页面index2.html
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、调用请求对象读取请求头参数信息
String userName=request.getParameter("userName");
String money=request.getParameter("money");
//2、开卡
Cookie card=new Cookie("userName",userName);
Cookie card1=new Cookie("money",money);
//3、发卡
response.addCookie(card);
response.addCookie(card1);
//4、通知浏览器将点餐页面写入到响应体交给浏览器
response.sendRedirect("/myweb/index2.html");
}
}
以下是index2.html点餐页面…
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<center>
<font style="font-size: 40px;color: red">欢迎点餐</font>
<form action="/myweb/two">
<input type="radio" name="food" value="dumpling"> 饺子15元<br><br>
<input type="radio" name="food" value="noodle">面条12元<br><br>
<input type="radio" name="food" value="rice">米饭13元<br><br>
<input type="submit" value="划卡消费">
</form>
</center>
</body>
</html>
TwoServlet通过请求对象拿到cookie,对cookie中的值做消费处理。之后建立新的cookie,将计算后的值存入cookie写入响应头信息中并返回给浏览器,在界面上展现给用户。也就是说,Servlet拿到了旧cookie(消费之前的money)的值,将其修改(消费之后的money)存入新的cookie再放入响应头信息返回给浏览器。
public class TwoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int dumpling_money=15;
int noodle_money=12;
int rice_money=13;
String userName=null;
int money;
int spend=0;
int balance=0;
response.setContentType("text/html;charSet=UTF-8");
PrintWriter out=response.getWriter();
Cookie newCard=null;
//1、读取请求头参数信息 得到用户点餐类型
String food=request.getParameter("food");
//2、读取cookie
Cookie[] cookies=request.getCookies();
//3、刷卡消费
for(Cookie ele:cookies){
String key=ele.getName();
String value=ele.getValue();
if ("userName".equals(key)){
userName=value;
}else if("money".equals(key)){
money=Integer.valueOf(value);
if ("dumpling".equals(food)){
if(money>dumpling_money){
spend=dumpling_money;
balance=money-spend;
newCard=new Cookie("money",balance+"");
}else{
out.print("用户"+userName+"余额不足,请充值");
}
}else if("noodle".equals(food)){
if(money>noodle_money){
spend=noodle_money;
balance=money-spend;
newCard=new Cookie("money",balance+"");
}else{
out.print("用户"+userName+"余额不足,请充值");
}
}else if("rice_money".equals(food)){
if(money>rice_money){
spend=rice_money;
balance=money-spend;
newCard=new Cookie("money",balance+"");
}else{
out.print("用户"+userName+"余额不足,请充值");
}
}
}
}
//4、将用户会员卡返回给用户
response.addCookie(newCard);
//5、将消费记录写入到响应
out.print("用户"+userName+"消费了:"+spend+"元,余额:"+balance+"元");
}
}
注意:
1、cookie使用前提:两个servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于cookie进行数据共享。
2、一个cookie只能存放一个键值对
3、cookie中的key与value都只能是String类型
4、cookie中的key不能是中文