社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
Cookie技术可以将用户的信息保存在各自的浏览器中,并且可以在多次请求下实现数据的共享,但是如果传递的信息较多,使用Cookie技术就会增大服务器端程序的处理难度,这个时候我们就可以使用Session技术,
但是需要注意的是,Session技术同样需要Cookie技术来为其传递ID属性,下面通过一个模拟实现购物车的程序熟悉一下Session技术,
创建web-chapter05的web项目,并在其中创建cn.itcast.chapter05.session的包,并在包中创建一个Book类
package cn.itcast.chapter05.session;
import java.io.Serializable;
public class Book implements Serializable{
private static final long serialVersionUID = 1L;
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;
}
}
其中Book类之所以需要继承自Serializable,是因为Serializable表示此类是一个可序列化的类,
package cn.itcast.chapter05.session;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
public class BookDB {
private static Map<String,Book> books = new LinkedHashMap<String,Book>();
static {
books.put("1", new Book("1", "javaweb开发"));
books.put("2", new Book("2", "java数据库连接"));
books.put("3", new Book("3", "java基础入门"));
books.put("4", new Book("4", "MySQL入门"));
books.put("5", new Book("5", "spring开发"));
}
//获得所有图书的方法
public static Collection<Book> getAll(){
return books.values();
}
//根据指定学号查询指定图书
public static Book getBook(String id) {
return books.get(id);
}
}
代码中使用到了Map的相关知识,可以自行百度
用于显示所有可购买图书的列表,通过单击购买链接,便可将指定的图书添加到购物车中,
package cn.itcast.chapter05.session;
import java.io.*;
import java.util.Collection;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class ListBookServlet 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();
Collection<Book> books = BookDB.getAll();
out.write("本站提供的图书有以下:<br />");
for(Book book : books) {
String url = "/chapter05/PurchaseServlet?id="+book.getId();
out.write(book.getName()+"<a href='"+url+"'>点击购买</a><br />");
}
}
}
其中的PurchaseServlet还没有创建,接下来就是创建这个
该类用来将用户购买的图书信息保存到Session对象中,并在用户购买完图书后将页面重定向到已经购买的图书列表
该类中使用ArrayList集合模拟一个购物车,然后将购买的所有图书添加到购物车中,
package cn.itcast.chapter05.session;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class PurchaseServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("id");//获得用户购买的商品的id
if(id==null) {
//如果没有购买任何图书,则重定向到所有图书的界面,也就是ListBookServlet
String url = "/chapter05/ListBookServlet";
response.sendRedirect(url);
return;
}
Book book = BookDB.getBook(id);
//获取或创建用户的Session对象
HttpSession session = request.getSession();
//从session对象中获得用户的购物车
List<Book> cart = (List<Book>) session.getAttribute("cart");
if(cart==null) {
//若为首次购买则为用户创建一个购物车
cart = new ArrayList<Book>();
session.setAttribute("cart", cart);
}
//将商品放入购物车
cart.add(book);
//创建Cookie存放session的标记号
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60*30);//设置保存时间,此时设置为30分钟
cookie.setPath("/chapter05");
response.addCookie(cookie);
//重定向到购物车页面
String url = "/chapter05/CartServlet";
response.sendRedirect(url);
}
}
主要用于展示用户已经购买的图书列表
package cn.itcast.chapter05.session;
import java.io.*;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.*;
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();
//变量cart引用用户的购物车
List<Book> cart = null;
//变量pruFlag标记是否购买过商品
boolean pruFlag = true;
//获得用户的Session
HttpSession session = request.getSession(false);
//如果session为null,则将pruFlag设置为false
if(session==null) {
pruFlag = false;
}else {
//获得用户购物车
cart = (List<Book>) session.getAttribute("cart");
//如果购物车为null,pruFlag设置为false
if(cart==null) {
pruFlag = false;
}
}
if(pruFlag==false) {
out.write("对不起!你还没有购买任何商品!<br />");
}else {
//否则显示用户购买的信息
double price=0;
for(Book book : cart) {
out.write(book.getName()+"<br />");
}
}
}
}
<servlet>
<description></description>
<display-name>ListBookServlet</display-name>
<servlet-name>ListBookServlet</servlet-name>
<servlet-class>cn.itcast.chapter05.session.ListBookServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListBookServlet</servlet-name>
<url-pattern>/ListBookServlet</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>PurchaseServlet</display-name>
<servlet-name>PurchaseServlet</servlet-name>
<servlet-class>cn.itcast.chapter05.session.PurchaseServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PurchaseServlet</servlet-name>
<url-pattern>/PurchaseServlet</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>CartServlet</display-name>
<servlet-name>CartServlet</servlet-name>
<servlet-class>cn.itcast.chapter05.session.CartServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CartServlet</servlet-name>
<url-pattern>/CartServlet</url-pattern>
</servlet-mapping>
然后启动tomcat
在网址栏输入http://localhost:8080/web-chapter05/ListBookServlet会进入以下界面
然后点击几个购买链接之后的界面如下:
至此,使用session模拟购物车的程序就完成了
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!