//获取商品id
try{
intid=Integer.parseInt(ids[i]);
StringgoodsName=goods[id];
out.println(goodsName);
}catch(Exceptione){}
}
}else{
out.println("您还没有浏览器过任何商品");
}
}
}
}else{
out.println("您还没有浏览器过任何商品");
}
%>
2、创建Servlet程序用于获取用户浏览商品的信息,并且给客户端写Cookie,保存用户浏览的商品记录
/*
*处理用户浏览器商品的记录信息
*/
publicclassGoodsServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//用户点击商品,就会访问到当前这个Servlet程序
Stringid=request.getParameter("id");
//获取Cookie,如果用户是第一次浏览器商品,
//就没有和商品对应的Cookie信息,如果用户不是第一次浏览器商品,那么就会携带者Cookie过来
Cookie[]cookies=request.getCookies();
Cookiecookie=findCookie(cookies,"goods");
//判断有没有和商品相关的Cookie
if(cookie==null){
cookie=newCookie("goods",id);
}else{
//获取原来Cookie的值
Stringold_id=cookie.getValue();
//判断获取的Cookie中的value值是否已经包含正在浏览器商品的id信息
if(!
old_id.contains(id)){
cookie.setValue(old_id+","+id);
}
}
//保存Cookie
cookie.setPath("/");
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
//重定向到显示所有商品的页面
response.sendRedirect("/day08/all.jsp");
}
privateCookiefindCookie(Cookie[]cookies,Stringkey){
//判断有没有Cookie对象
if(cookies==null){
returnnull;
}
for(Cookiec:
cookies){
if(c.getName().equals(key)){
//获取都和商品记录相关的Cookie信息
returnc;
}
}
//虽然用户带着Cookie过来,但不是和商品相关的Cookie
returnnull;
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
3、清空历史记录
/*
*清空Cookie
*/
publicclassCookieServlet2extendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//直接情况
Cookiec=newCookie("goods","");
//设置时间
c.setMaxAge(-1);
//设置路径
c.setPath("/");
//写给客户端
response.addCookie(c);
//重定向到显示所有商品的页面
response.sendRedirect("/day08/all.jsp");
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
2、Session原理和案例
2.1、Session原理分析
Session:
会话技术,从客户端打开浏览器访问服务器,到最后客户端关闭浏览器,整个过程称为一次会话。
在这个会话的过程中,服务器会针对每个客户端创建一个和客户端相关的唯一的临时容器,这个容器用于保存当前客户的所有信息。
并且在给客户端响应数据的时候,会给客户端回送一个唯一标识当前客户端相关的临时容器的id,在客户端下次访问服务器的时候,会携带这个id信息,在服务器端就可以找到和客户端相关的临时戎,继续使用这个临时容器。
如果获取这个Session对象,为每个客户端服务:
可以通过Request对象获取和当前客户端相关的唯一Session对象。
/*
*演示Session对象
*
*在Request对象中getSession方法有2个
*getSession()在第一次调用的时候,如果服务器端没有针对当前这个客户端创建Session对象,那么调用
*这个方法的时候,服务器会自动创建一个Session对象,并且和当前这个客户端对应起来。
*如果真的这个客户端已经有一个Session对象存在,那么在getSession方法的时候,就会返回这个已经存在的Session对象
*
*getSession(booleanboo)
*在调用可以传递boolean值的getSession方法的时候,如果传递的false,这时只会去获取已经存在的Session
*如果根本就没有Session对象这时,返回的就是null
*如果传递的是true,获取Session对象的时候,如果没有Session就会创建,如果有,返回原始Session对象
*
*服务器在获取和某个客户端相关的Session对象的时候,其实需要客户端给服务器发送一个Cookie,这个Cookie中必须有
*JSESSIONID=03825AE783B680E8B31925E6AEF24B22的数据。
在服务器端我们调用getSession的时候,
*服务器内部就会根据JSESSIONID获取和客户端对应的唯一的Session对象,如果客户端没有携带JSESSIONID,那么
*服务器就会为这个客户端创建一个新的Session对象,然后给客户端回送一个Cookie,在Cookie中添加了JSESSIONID信息
*
*每个一个Session对象它其实针对的不是一个用户,而是真的的用户使用的浏览器,只要打开浏览器访问服务器,需要使用Session的时候,
*服务器就会根据当前用户的这个浏览器创建一个唯一的Session对象。
如果用户使用多个浏览器访问同一个服务器,
*服务器会根据不同的浏览器创建出不同的Session对象。
*
*Session对象是基于浏览器的,只要用户不关闭浏览器,那么针对这个浏览器的Session在服务器端就会一直存在,
*不管用访问当前这个项目的那个程序,都可以去使用针对这个浏览器的Session对象。
*
*一般我们使用Session主要保存和用户当前访问某个网站的一系列的操作信息。
*我们一般使用Session来保存用打开浏览器开发访问网站的一系列的操作,
*然后在用户最后需要显示所有操作的时候,把Session中的所有数据取出即可
*
*使用同一个Session对象,在多个servlet之间完成数据的共享
*
*
*/
publicclassSessionServlet1extendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//获取Session对象
HttpSessionsession=request.getSession();
Stringip=request.getRemoteAddr();
//使用Session完成数据的共享
session.setAttribute("addr","上海传智播客"+ip);
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
2.2、思考:
关闭浏览器后再次访问能获取到Session吗
Session是如何工作的?
当用户第一次访问某个Servlet程序的时候,在Servlet中我们调用request.getSession(),那么会得到和当前这个浏览器对应的Session对象,在使用response给客户端响应数据的时候,会把当前这个Session对象的jsessionid以Cookie的形式发送给客户端,当客户端再次访问服务器中的资源时,就会携带这个jsessionid数据,以Cookie的形式提交给服务器,在服务器中我们就可以根据用户携带的jsessionid获取和客户端浏览器对应的Session对象,为用户继续服务。
浏览器关闭后再次访问服务器,无法获取到前一次的Session对象。
因为我们在Servlet中获取到Session之后,如果没有认为的去书写Cookie对象,这时服务器会自动的给客户端回写Cookie,Cookie中保存的是当前针对这个浏览器的Session对象的jsessionid数据,而这个Cookie恰好是一个会话级别的Cookie,当用户关闭了浏览器之后,这个会话级别的Cookie就会自动的消失,当用再次访问服务器的时候,并不会携带上次的会话Cookie一次到服务器端,所以在服务器端拿不到的jsessionid信息,就无法获取和当前浏览器对应的那个Session对象。
虽然在服务器无法拿到上次的Session对象,但是这个Sessoin对象在服务器端依然存在。
但是有没有拿不到jsessionid,所以无法获取上次的Session对象。
要保证浏览器关闭之后还可以获取到上次的Session对象,这时就需要把Cookie持久化。
就需要在Servlet中手动的在Cookie中保存jsessionid的信息
publicclassSessionServlet1extendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//获取Session对象
HttpSessionsession=request.getSession();
Stringip=request.getRemoteAddr();
//使用Session完成数据的共享
session.setAttribute("addr","上海传智播客"+ip);
//把这个Session的id持久化,创建Cookie对象
Cookiec=newCookie("JSESSIONID",session.getId());
//持久化,设置时间
c.setMaxAge(60);
//设置路径
c.setPath("/");
//添加Cookie
response.addCookie(c);
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
2.3、Session案例(购物车)
网上购物的过程:
首先我们会访问某个电商网站,这时会浏览到所有的商品,浏览到自己感兴趣的商品时,我们一般点击加入购物车,加入购物车成功之后,还可以继续购物。
继续购物的时候,即就是用户在继续选择新的商品,当用户选择到了商品,点击加入购物车之后,会把当前的这个商品和以前的商品加入到同一个购物车中。
实现购物把商品加入到购物车中:
1、需要一个页面显示所有的商品