会话概述
在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程,例如,一个用户在某网站上的整个购物过程就是一个会话。
在打电话过程中,通话双方会有通话内容,同样,在客户端与服务器端交互的过程中,也会产生一些数据。例如,用户甲和乙分别登录了购物网站,甲购买了一个Nokia手机,乙购买了一个iPad,当这两个用户结账时,Web服务器需要对用户甲和乙的信息分别进行保存。在前面章节讲解的对象中,HttpServletRequest 对象和ServletContext对象都可以对数据进行保存,但是这两个对象都不可行,具体原因如下。
(1)客户端请求Web服务器时,针对每次HTTP 请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买请求中的数据将会丢失。
(2)使用ServletContext 对象保存数据时,由于同一个Web应用共享的是同一一个ServletContext对象,因此,当用户在发送结账请求时,由于无法区分哪些商品是哪个用户所购买的,而会将该购物网站中所有用户购买的商品进行结算,这显然也是不可行的。
为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是cookie和Session。关于cookie和Session的相关知识,将在下面的小节进行详细讲解。
cookie对象
cookie是一种会话技术,它用于将会话过程中的数据保存到用户的浏览器中,从而使浏览器和服务器可以更好地进行数据交互。接下来,本节将针对cookie
什么是cookie
在现实生活中,当顾客在购物时,商城经常会赠送顾客一张会员卡, 卡上记录用户的个人信息(姓名、手机号等人消费额度和积分额度等。顾客一旦接受了会员卡,以后每次光临该商场时,都可以使用这张会员卡,商场也将根据会员卡上的消费记录计算会员的优惠额度和累加积分。在Web应用中,cookie的功能类似于这张会员卡,当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息都保存在cookie 中。这样,当该浏览器再次访问服务器时,都会在请求头中将cookie 发送给服务器,方便服务器对浏览器做出正确的响应。
服务器向客户端发送cookie时,会在HTTP响应头字段中增加Set-cookie响应头字段。Set-cookie头字段中设置的cookie遵循一定的语法格式, 具体示例如下。
Set-cookie: user=itcast; Path=/;
在上述示例中,user表示cookie的名称,itcast 表示cookie的值,Path 表示cookie的属性。需要注意的是,cookie 必须以键值对的形式存在,其属性可以有多个,但这些属性之间必须用分号和空格分隔。
了解了cookie信息的发送方式后,接下来,通过一-张图来描述cookie在浏览器和服务器之间的传输过程,具体如图5-1所示。
cookie API
为了封装cookie信息,在Serlet API中提供了一个javax. serttp.Cooke类o,该类包含了生成cookie信息和提取cookie信息各个属性的方法。cookie的构造方法和常用方法具体
1.构造方法
cookie类有且仅有-一个构造方法,具体语法格式如下。
public cookie (java.lang.String name, java.lang .String value)
在cookie的构造方法中,参数name用于指定cookie的名称,value 用于指定cookie的值。需要注意的是,cookie 一旦创建,它的名称就不能更改,cookie 的值可以为任何值,创建后允许被修改。
[任务5-1 ]显示用户上次访问时间
[任务目标]
当用户访问某些Web应用时,经常会显示出该用户上-次的访问时间。例如,QQ登录成功后,会显示用户上次的登录时间。通过本任务,读者将学会如何使用cookie技术实现显示用户上次的访问时间的功能。
[实现步骤]
1.创建Servlet
在Eclipse中新建Web项目chapter05 ,并在该项目下新建-一个 名称为cn.itcast.chapter05.cookie.example的包,在该包中编写一个名称为LastAccessServlet的Servlet类,该类主要用于实现获取cookie信息并将当前时间作为cookie值发送给客户端。LastAccessServlet 类的具体实现代码如文件5-1所示。
** LastAccessServletjava**
package cn.itcast.chapter05.cookie;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/last")
public class LastAcess extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(“text/html;charset=utf-8”);
cookie[] cookies=request.getcookies();
String lasttime=null;
for(int i=0;cookies!=null&&i
if(“lastAccess”.equals(name)) {
lasttime=cookies[i].getValue();
}
}
if(lasttime==null) {
response.getWriter().print(“你是第一次访问本网站”);
}else {
response.getWriter().print(“你是第一次访问的时间是:”+lasttime);
}
String time = String.format("%tF% cookie cookie= new cookie(“lastAccess”,time);
cookie cookie2=new cookie(“lastAccess”,“123”);
response.addcookie(cookie);
response.addcookie(cookie2);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
example
package cn.itcast.chapter05.session;
import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/example")
public class example extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String time = String.format("%tF% cookie cookie= new cookie(“lastAccess”,time);
cookie cookie2=new cookie(“lastAccess”,“123”);
response.addcookie(cookie);
response.addcookie(cookie2);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
Session对象
cookie技术可以将用户的信息保存在各自的浏览器中,并且可以在多次请求下实现数据的共享。但是,如果传递的信息比较多,使用cookie技术显然会增大服务器端程序处理的难度,这时,可以使用Session技术。Session 是-种将会话数据保存到服务器端的技术。接下来,本节将针对Session进行详细的讲解。
1.创建封装图书信息类
在chapter05项目下新建一一个名称为cn.itcast.chapter05 .session.example01的包,在该包中创建一个名称为Book的类,该类用于封装图书的信息,其中定义了id 和name属性。分别用来表示书的编号和名称。其实现代码如文件5-2所示。
Book.java
package cn.itcast.chapter05.session;
public class Book {
private String id;
private String name;
public Book() {
}
public Book(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
创建数据库模拟类
*# cn.itcast.chapter05. session.example01包中创建一个名为 BookDB t#. à#AFl拟保存所有图书的数据库。其实现代码如文件5-3所示。
BookDB.java*
}
package cn.itcast.chapter05.session;
import java.util.Collection;
import java.util.linkedHashMap;
import java.util.Map;
public class BookDB {
private static Map
static{
map.put(“1”, new Book(“1”,“javaWeb”));
map.put(“2”, new Book(“2”,“jdbc入门”));
map.put(“3”, new Book(“3”,“java基础”));
map.put(“4”, new Book(“4”,“struts框架”));
map.put(“5”, new Book(“5”,“hibernate框架”));
} //1.得到所有图书 public static CollectiongetAll(){ return map.values(); } //2.根据map的key,也就是图书的id,得到某本图书 public static Book getBook(String id){ return map.get(id); }
** 3.创建Servlet
( 1)创建一个名称为ListBookServlet的Servlet类,该Servlet用于显示所有可购买图书的列表,通过单击“购买”链接,便可将指定的图书添加到购物车中。其实现代码如文件5-4所示。
ListBookServlet.java**
package cn.itcast.chapter05.session;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/list")
public class ListBookServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public ListBookServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(“text/html;charset=utf-8”);
Collection books=BookDB.getAll();
PrintWriter out=response.getWriter();
out.print("本网站售卖的书籍如下: ");
for(Book b:books) {
String name =b.getName();
String id=b.getId();
String url="点击购买";
out.print("图书名称: "+name+" "+url+"
");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
**(2)创建一个 名称为PurchaseServlet的Servlet类,其实现代码。
PurchaseServlet.java
package cn.itcast.chapter05.session;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/purcharse")
public class PucharseServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(“text/html;charset=utf-8”);
String id =request.getParameter(“id”);
if(idnull) {
response.sendRedirect("/chapter05/list");
return;
}
Book book=BookDB.getBook(id);
//
HttpSession session= request.getSession();
List list=(List) session.getAttribute("");
if(listnull) {
list= new ArrayList();
session.setAttribute(“cart”, list);
}
list.add(book);
cookie cookie =new cookie(“JEAAIONID”,session.getId());
response.addcookie(cookie);
response.sendRedirect("/chapter05/cart");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
**以上实现了两个功能,一一个是将用户购买的图书信息保存到Session对象中:一个是在用户购买图书结束后,将页面重定向到用户已经购买的图书列表。该类在实现时,通过ArrayList集合模拟了一个购物车,然后将购买的所有图书添加到购物车中,最后通过Session对象传递给CartServlet,由CartServlet 展示用户已经购买的图书。
(3)创建一一个名称为CartServlet的Servlet类,该类主要用于展示用户已经购买的图书列表,其实现代码。
CartServlet.java
package cn.itcast.chapter05.session;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/cart")
public class CartServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response. setContentType(“text/html;charset=utf-8”);
PrintWriter out =response.getWriter();
List cart =null;
HttpSession session=request.getSession(false);
boolean cartflag=true;
if(session==null) {
}else {
cart=(List) session.getAttribute(“cart”);
if(cart==null) {
cartflag=false;
}
}
if(!cartflag) {
out.print(“对不起,请前往购买图书”);
}else {
out.print(“购买图书如下: “+”
”);
for(Book b:cart) {
out.print(“购买图书: “+b.getName()+”
”);
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
通过getSession(获取到所有的Session对象,然后判断用户是否已经购买图书,如果已经购买过,则显示购买的图书列表,否则在页面显示友好的提示“对不起!您还没有购买任何商品!”。
4.运行项目,查看结果
在web.xml中对相应的Servlet进行配置,然后启动Tomcat服务器,在浏览器中输入地址http://ocalhost:8080/chapter05/L istBookServlet”访问ListBookServlet,浏览器显示的结果如



