利用session实现购物车功能,下面是具体的代码实现(这里是运用mvc的设计模式)
首先要导入相应的jar包
c3p0-0.9.1.2-jdk1.3.jar
c3p0-0.9.1.2.jar
commons-dbutils-1.3.jar
mysql-connector-java-5.1.46-bin.jar
servlet-api.jar
taglibs-standard-impl-1.2.5.jar
taglibs-standard-spec-1.2.5.jar
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login.do"
method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="userpass" /></td>
</tr>
<tr>
<td><input type="submit" name="submit" value="登录" /></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
main.jsp(主页面)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页面</title>
<style type="text/css">
input {
width: 200px;
height: 20px;
}
.register-button {
cursor: pointer;
width: 250px;
text-align: center;
height: 40px;
line-height: 40px;
background-color: dodgerblue;
border-radius: 5px;
margin: 0 auto;
margin-top: 50px;
color: white;
}
#select {
text-align: center;
}
td {
height: 30px;
width: 150px;
}
</style>
</head>
<body>
<h2 style="text-align: center">欢迎光临新华书店</h2>
<form action="${pageContext.request.contextPath}/lookBook.udd"
method="post">
<div class="register-button">
<input
style="border: 0; background-color: dodgerblue; font-size: 15px"
type="submit" value="查看书籍">
</div>
</form>
<br>
<br>
<table border="1px" cellpadding="0" cellspacing="0"
style="margin-left: 250px">
<tr>
<td>编号</td>
<td>书名</td>
<td>作者</td>
<td>出版社</td>
<td>价格</td>
<td>操作</td>
</tr>
<c:forEach items="${requestScope.list}" var="list">
<c:if test="${not empty list}">
<tr>
<td>${list.id}</td>
<td>${list.bookname}</td>
<td>${list.author}</td>
<td>${list.publish}</td>
<td>${list.price}</td>
<td><a
href="${pageContext.request.contextPath}/buy.udd?id=${list.id}">加入购物车</a></td>
</tr>
</c:if>
</c:forEach>
</table>
</body>
</html>
mybuyCar.jsp(购物车页面)
<%@page import="cn.bzu.mybuycar.entity.CartItem"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
td {
height: 30px;
width: 150px;
}
</style>
</head>
<body>
<%
Map<Integer, CartItem> car = (Map<Integer, CartItem>) session.getAttribute("buyCar");
%>
<table border="1px" cellpadding="0" cellspacing="0"
style="margin-left: 250px">
<tr>
<td>编号</td>
<td>书名</td>
<td>作者</td>
<td>价格</td>
<td>数量</td>
<td>操作</td>
</tr>
<%
double sumMoney = 0;
if (car != null) {
for (Map.Entry<Integer, CartItem> b : car.entrySet()) {
%>
<tr>
<td><%=b.getKey()%></td>
<td><%=b.getValue().getBook().getBookname()%></td>
<td><%=b.getValue().getBook().getAuthor()%></td>
<td><%=b.getValue().getBook().getPrice()%></td>
<td><%=b.getValue().getNumber()%></td>
<td><a
href="<%=request.getContextPath()%>/pay.udd?id=<%=b.getKey()%>">付钱</a>
</td>
</tr>
<%
}
}
%>
</table>
</body>
</html>
package cn.bzu.mybuycar.entity;
public class User {
private int id;
private String userName;
private String userPass;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPass() {
return userPass;
}
public void setUserPass(String userPass) {
this.userPass = userPass;
}
public User(int id, String userName, String userPass) {
super();
this.id = id;
this.userName = userName;
this.userPass = userPass;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + ", userPass=" + userPass + "]";
}
}
Book.java(Book实体类)
package cn.bzu.mybuycar.entity;
public class Book {
private int id;
private String bookname;
private String author;
private String publish;
private Double price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getBookname() {
return bookname;
}
public void setBookname(String bookname) {
this.bookname = bookname;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublish() {
return publish;
}
public void setPublish(String publish) {
this.publish = publish;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Book(int id, String bookname, String author, String publish, Double price) {
super();
this.id = id;
this.bookname = bookname;
this.author = author;
this.publish = publish;
this.price = price;
}
public Book() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Book [id=" + id + ", bookname=" + bookname + ", author=" + author + ", publish=" + publish + ", price="
+ price + "]";
}
}
CartItem.java(购物车实体类)
package cn.bzu.mybuycar.entity;
public class CartItem {
private Book book;
private int number;
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<c3p0-config>
<named-config name="mysql">
<!-- 配置基本的必须的属性 -->
<property name="user">root</property> // 注意这里name的值,一定要参考setXxxx里的Xxxx值
<property name="password">123456</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mvcproject</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 若数据库中的连接数量不足的时候,想数据库申请的连接数量 -->
<property name="acquireIncrement">5</property>
<!-- 初始化数据库连接池时连接的数量 -->
<property name="initialPoolSize">10</property>
<!-- 数据库连接池中的最小的数据库连接数 -->
<property name="minPoolSize">5</property>
<!-- 数据库连接池中的最大的数据库连接数 -->
<property name="maxPoolSize">100</property>
<!-- C3P0数据库连接池可以维护的Statement数量 -->
<property name="maxStatements">2</property>
<!-- 每个连接同时可以使用Statement的数量 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
package cn.bzu.mybuycar.utils;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DBUTils {
//声明一个连接池队象
private static DataSource datasource = null;
static {
datasource = new ComboPooledDataSource("mysql");
}
public static Connection getConnection() {
Connection conn = null;
try {
conn = datasource.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static void closeConn(Connection conn) {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package cn.bzu.mycarbus.dao;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import cn.bzu.mybuycar.utils.DBUTils;
public class BaseDao<T> {
//获得连接池得的驱动
QueryRunner qr = new QueryRunner();
//声明一个用于反射的变量
private Class<T> clazz;
public BaseDao() {
//获得调用这个方法的对象的父类的类型
Type sType = this.getClass().getGenericSuperclass();
if(sType instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType)sType;
Type[] arr = (Type[]) pt.getActualTypeArguments();
if(arr[0] instanceof Class<?>) {
clazz = (Class<T>)arr[0];
}
}
}
//查询一条记录的方法
public T get(String sql,Object...args) {
Connection conn = null;
T entity = null;
try {
conn = DBUTils.getConnection();
entity = (T) qr.query(conn, sql, new BeanHandler<>(clazz), args);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
DBUTils.closeConn(conn);
}
return entity;
}
//查询多条记录的方法
public List<T> getList(String sql,Object...args){
List list = null;
Connection conn = DBUTils.getConnection();
try {
list = qr.query(conn, sql,new BeanListHandler<>(clazz),args);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
DBUTils.closeConn(conn);
}
return list;
}
}
UBDao.java(这是一个接口)
package cn.bzu.mycarbus.dao;
import java.util.List;
public interface UBDao<T>{
public T login(String name,String pass);
}
UserDaoImplements.java(UBDao接口的实现类)
package cn.bzu.mycarbus.dao;
import java.util.List;
import cn.bzu.mybuycar.entity.User;
public class UserDaoImplements extends BaseDao<User> implements UBDao<User>{
//登录的方法
@Override
public User login(String name,String pass) {
String sql ="select userName , userPass from user where userName=? AND userPass=?";
User user = super.get(sql,name,pass);
System.out.println(sql);
return user;
}
}
BookDao.java(这是一个接口)
package cn.bzu.mycarbus.dao;
import java.util.List;
import cn.bzu.mybuycar.entity.Book;
public interface BookDao<T> {
//查询图书的方法
public List<Book> getBooks();
//查询一本书
public Book getOneBook(int id);
}
BookDaoImpl.java(BookDao接口的实现类)
package cn.bzu.mycarbus.dao;
import java.util.List;
import cn.bzu.mybuycar.entity.Book;
public class BookDaoImpl extends BaseDao<Book> implements BookDao<Book>{
@Override
public List<Book> getBooks() {
String sql = "SELECT `id`,`bookname`,`author`,`publish`,`price` FROM `book`";
List<Book> list = super.getList(sql);
return list;
}
@Override
public Book getOneBook(int id) {
String sql = "select id,bookname,author,publish,price from book where id = ?";
Book book = super.get(sql, id);
return book;
}
}
Factory.java(获得接口的实现类)
package cn.bzu.mycarbus.dao;
public class Factory {
public static UBDao getUbdao() {
return new UserDaoImplements();
}
public static BookDao getBookDao() {
return new BookDaoImpl();
}
}
UBService.java(这是一个接口)
package bzu.cn.mybuycar.service;
import java.util.List;
public interface UBService<T> {
//登录的方法
public T login(String name,String pass);
}
UserviceImplements.java
package bzu.cn.mybuycar.service;
import java.util.List;
import cn.bzu.mycarbus.dao.Factory;
import cn.bzu.mycarbus.dao.UBDao;
public class UserviceImplements<User> implements UBService<User>{
//得到接口的实现类的实例
UBDao<User> ubd = Factory.getUbdao();
@Override
public User login(String name,String pass) {
// TODO Auto-generated method stub
return ubd.login( name, pass);
}
}
BookService.java
package bzu.cn.mybuycar.service;
import java.util.List;
import cn.bzu.mybuycar.entity.Book;
public interface BookService<T> {
//查询图书的方法
public List<Book> getBooks();
// 得到一本书的方法
public Book getOneBook(int id);
}
BookServiceImpl.java
package bzu.cn.mybuycar.service;
import java.util.List;
import cn.bzu.mybuycar.entity.Book;
import cn.bzu.mycarbus.dao.BookDao;
import cn.bzu.mycarbus.dao.Factory;
public class BookServiceImpl implements BookService<Book>{
BookDao<Book> bd = Factory.getBookDao();
@Override
public List<Book> getBooks() {
return bd.getBooks();
}
//查询一本图书的方法
@Override
public Book getOneBook(int id) {
// TODO Auto-generated method stub
return bd.getOneBook(id);
}
}
Factory.java
package bzu.cn.mybuycar.service;
import cn.bzu.mybuycar.entity.Book;
import cn.bzu.mybuycar.entity.User;
public class Factory {
public static UBService<User> getUBservice(){
return new UserviceImplements<User>();
}
public static BookService<Book> getBookService(){
return new BookServiceImpl();
}
}
package bzu.cn.mybuycar.contraoller;
import java.io.IOException;
import java.lang.reflect.Method;
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 bzu.cn.mybuycar.service.Factory;
import bzu.cn.mybuycar.service.UBService;
import cn.bzu.mybuycar.entity.User;
@WebServlet(urlPatterns = { "*.do" })
public class UserController extends HttpServlet {
private static final long serialVersionUID = 1L;
UBService<User> ubs = Factory.getUBservice();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
// 获得到servlet的映射路径
String path = request.getServletPath();
String str = path.substring(1);
str = str.substring(0, str.length() - 3);
try {
Method method = this.getClass().getDeclaredMethod(str, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this, request, response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
// 登录的方法
private void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("username");
String pass = request.getParameter("userpass");
User user = null;
user = ubs.login(name, pass);
if (user != null) {
request.getSession().setAttribute("user", name);
response.sendRedirect(request.getContextPath() + "/main.jsp");
} else {
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
}
UserController.java
package bzu.cn.mybuycar.contraoller;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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;
import bzu.cn.mybuycar.service.BookService;
import bzu.cn.mybuycar.service.Factory;
import cn.bzu.mybuycar.entity.Book;
import cn.bzu.mybuycar.entity.CartItem;
@WebServlet(urlPatterns= {"*.udd"})
public class BookController extends HttpServlet {
private static final long serialVersionUID = 1L;
BookService<Book> bs = Factory.getBookService();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String path = request.getServletPath();
String str = path.substring(1);
str= str.substring(0,str.length()-4);
try {
Method method = this.getClass().getDeclaredMethod(str, HttpServletRequest.class,HttpServletResponse.class);
method.invoke(this, request,response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
//查询图书的方法
private void lookBook(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<Book> list = bs.getBooks();
if(list!=null) {
request.setAttribute("list", list);
request.getRequestDispatcher("/main.jsp").forward(request, response);
}else {
response.sendRedirect(request.getContextPath()+"/main.jsp");
}
}
//购买图书的方法
private void buy(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int id =Integer.parseInt(request.getParameter("id")) ;
Book book = bs.getOneBook(id);
if(book!=null) {
request.getSession().setAttribute("book", book);
System.out.println(book);
response.sendRedirect(request.getContextPath()+"/buyCar.udd");
}
}
//购物车的方法
private void buyCar(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
//得到购买的图书
Book book = (Book)session.getAttribute("book");
//得到购物车
Map<Integer,CartItem> car =(Map<Integer,CartItem>) session.getAttribute("buyCar");
//判断购物车是否为空,为空的话就创建一一个
if(car==null) {
car = new HashMap<Integer,CartItem>();
}
CartItem cartItem = car.get(book.getId());
if(cartItem ==null) {
cartItem = new CartItem();
cartItem.setBook(book);
cartItem.setNumber(1);
}else {
cartItem.setNumber(cartItem.getNumber()+1);
}
car.put(book.getId(), cartItem);
session.setAttribute("buyCar", car);
response.sendRedirect(request.getContextPath()+"/mybuyCar.jsp");
}
}