- 项目描述
- 项目演示
- 系统首页
- 注册与登录
- 商品详情
- 购物车信息
- 订单详情
- 注销
- 部分代码
- index.jsp
- JdbcUtils.java
- People.java
- PeopleDao.java
- PeopleDaoImpl.java
- PeopleService.java
- PeopleService.java
- CheckCodeServlet.java
- 相关文件
基于B/S三层架构设计的购物系统,可以更好地符合“高内聚,低耦合”的设计思想。表现层(UI)通过JSP在浏览器上实现界面展示,通过Servlet接受用户请求并生成验证码等实时信息;数据访问层(DAL)通过JDBC对DBMS进行访问;二者之间的业务逻辑层(BLL)通过Service进行连接。同时面向接口编程提高规范化。这只是我自己用两三天的时间做的小项目,距离真正的购物系统差距还是很大的,仅供初学者参考,很多逻辑缺陷不必太纠结。
如果只需要代码可直接通过书签栏跳转至相关文件。
项目演示 系统首页这是购物系统首页,仿照华为商城设计,具体实现借助于Bootstrap,商品信息通过后台数据库读取
如果此时点击商品会通过Session中的登陆信息判断登陆状态,若未登录则提示登录
注册与登录
我们先注册再登录,这里注册斯维因的相关信息。登录页面与注册页面通过js实现正则验证,通过Servlet实现验证码相关功能,背景渐变色借助于WebGradients选取
用刚刚注册的用户进行登录
商品详情
登陆后我们回到首页,点击商品,进入商品详情页
购物车信息
将商品加入购物车后查看购物车,这里会一致显示当前登录用户信息
订单详情
我们提交订单后再查看订单。这里借助jQuery做了一个下拉框,可以查看后台数据库关于此用户的全部订单的全部信息,这里提交订单相当于付款,所以未设退货功能,因此数据删除只能借助于后台数据库
注销
最后点击注销
<%-- // _ooOoo_ // o8888888o // 88" . "88 // (| -_- |) // O = /O // ____/`---'____ // . ' \| |// `. // / \||| : |||// // / _||||| -:- |||||- // | | \ - /// | | // | _| ''---/'' | | // .-__ `-` ___/-. / // ___`. .' /--.-- `. . __ // ."" '< `.____<|>_/___.' >'"". // | | : `- `.;` _ /`;.`/ - ` : | | // `-. _ __ /__ _/ .-` / / // ======`-.____`-.________/___.-`____.-'====== // `=---=' // // ............................................. // 佛祖保佑 永无BUG --%> <%@ page import="util.CustomUtil" %> <%@ page import="entity.People" %> <%@ page import="entity.Goods" %> <%@ page import="service.GoodsService" %> <%@ page import="service.impl.GoodsServiceImpl" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>JdbcUtils.java购物系统主页 "> <% People now_people = new People(0, null, null, null, null, 0); if (session.getAttribute("now_people") != null) { now_people = (People) session.getAttribute("now_people"); } CustomUtil.outPosition("yellow", "index.jsp"); CustomUtil.outParameter("yellow", "now_people", now_people.toString()); CustomUtil.outParameter("yellow", "base href", request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/"); Goods goods = new Goods(); GoodsService goodsService = new GoodsServiceImpl(); %>
热销单品
<% goods = goodsService.find(101); %><%=goods.getName()%>
<%=goods.getInfo_brief()%>
<%=goods.getNew_price()%>元
<%=goods.getOld_price()%>元
<% goods = goodsService.find(102); %><%=goods.getName()%>
<%=goods.getInfo_brief()%>
<%=goods.getNew_price()%>元
<%=goods.getOld_price()%>元
<% goods = goodsService.find(103); %><%=goods.getName()%>
<%=goods.getInfo_brief()%>
<%=goods.getNew_price()%>元
<%=goods.getOld_price()%>元
<% goods = goodsService.find(104); %><%=goods.getName()%>
<%=goods.getInfo_brief()%>
<%=goods.getNew_price()%>元
<%=goods.getOld_price()%>元
<% goods = goodsService.find(105); %><%=goods.getName()%>
<%=goods.getInfo_brief()%>
<%=goods.getNew_price()%>元
<%=goods.getOld_price()%>元
<% goods = goodsService.find(106); %><%=goods.getName()%>
<%=goods.getInfo_brief()%>
<%=goods.getNew_price()%>元
<%=goods.getOld_price()%>元
<% goods = goodsService.find(107); %><%=goods.getName()%>
<%=goods.getInfo_brief()%>
<%=goods.getNew_price()%>元
<%=goods.getOld_price()%>元
<% goods = goodsService.find(108); %><%=goods.getName()%>
<%=goods.getInfo_brief()%>
<%=goods.getNew_price()%>元
<%=goods.getOld_price()%>元
用于加载驱动并获得与数据库的连接的工具类
package util;
import java.sql.*;
public class JdbcUtil {
private static final String driver = "com.mysql.jdbc.Driver";
private static final String url =
"jdbc:mysql://localhost:3306/shoppingsystem?characterEncoding=utf-8";//连接字符串
private static final String user = "root";
private static final String password = "123";
private static Connection connection;
public static Connection getConnection() {
try {
Class.forName(driver);//通过反射机制加载驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
connection = DriverManager.getConnection(url, user, password);//获得连接
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return connection;
}
public static void closeAll(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
People.java
与数据库中用户表相匹配的用户类
package entity;
public class People {
private int id;//用户编号
private String password;//用户密码
private String name;//用户姓名
private String email;//用户邮箱
private String address;//用户地址
private int status;//用户状态
public People() {
super();
}
public People(int id, String password, String name, String email, String address, int status) {
this.id = id;
this.password = password;
this.name = name;
this.email = email;
this.address = address;
this.status = status;
}
@Override
public String toString() {
return "People{" +
"id=" + id +
", password='" + password + ''' +
", name='" + name + ''' +
", email='" + email + ''' +
", address='" + address + ''' +
", status=" + status +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
PeopleDao.java
对用户信息进行相关操作的接口
package dao;
import entity.People;
public interface PeopleDAO {
public abstract int doInsert(int id, String password, String name, String email, String address, int status);
public abstract int doDelete(int id, String password);
public abstract int doUpdate(int id, String password, String name, String email, String address, int status);
public abstract People findByLogin(int id, String password);
public abstract People findById(int id);
}
PeopleDaoImpl.java
对上述接口的实现
package dao.impl;
import dao.PeopleDAO;
import entity.People;
import util.CustomUtil;
import util.JdbcUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class PeopleDAOImpl implements PeopleDAO {
private Connection connection;
private PreparedStatement preparedStatement;
private ResultSet resultSet;
@Override
public int doInsert(int id, String password, String name, String email, String address, int status) {
int result = 0;
String sql = "INSERT INTO `people` VALUES (" +
id +
", '" + password +
"', '" + name +
"', '" + email +
"', '" + address +
"', '" + status +
"');";
connection = JdbcUtil.getConnection();
try {
preparedStatement = connection.prepareStatement(sql);
result = preparedStatement.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
JdbcUtil.closeAll(connection, preparedStatement, resultSet);
}
CustomUtil.outPosition("blue", "PeopleDAOImpl.doInsert()");
CustomUtil.outParameter("blue", "sql", sql);
CustomUtil.outParameter("blue", "result", String.valueOf(result));
return result;
}
@Override
public int doDelete(int id, String password) {
return 0;
}
@Override
public int doUpdate(int id, String password, String name, String email, String address, int status) {
return 0;
}
@Override
public People findByLogin(int id, String password) {
People people = new People();
String sql = "select * from `people` where `id` = '" + id + "' and password = '" + password + "';";
connection = JdbcUtil.getConnection();
try {
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
people.setId(resultSet.getInt(1));
people.setPassword(resultSet.getString(2));
people.setName(resultSet.getString(3));
people.setEmail(resultSet.getString(4));
people.setAddress(resultSet.getString(5));
people.setStatus(resultSet.getInt(6));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
JdbcUtil.closeAll(connection, preparedStatement, resultSet);
}
CustomUtil.outPosition("blue", "PeopleDAOImpl.findByLogin()");
CustomUtil.outParameter("blue", "sql", sql);
CustomUtil.outParameter("blue", "people", people.toString());
return people;
}
public People findById(int id) {
People people = new People();
String sql = "select * from `people` where `id` = '" + id + "';";
CustomUtil.outPosition("blue", "PeopleDaoImpl.findById()");
CustomUtil.outParameter("blue", "id", String.valueOf(id));
connection = JdbcUtil.getConnection();
try {
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
people.setId(resultSet.getInt(1));
people.setPassword(resultSet.getString(2));
people.setName(resultSet.getString(3));
people.setEmail(resultSet.getString(4));
people.setAddress(resultSet.getString(5));
people.setStatus(resultSet.getInt(6));
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
JdbcUtil.closeAll(connection, preparedStatement, resultSet);
}
CustomUtil.outPosition("blue", "PeopleDAOImpl.findById()");
CustomUtil.outParameter("blue", "sql", sql);
CustomUtil.outParameter("blue", "people", people.toString());
return people;
}
}
PeopleService.java
在业务逻辑层中将表现层与数据访问层进行连接,由于项目本身并不复杂,所以只是简单实现了方法传递
package service;
import entity.People;
public interface PeopleService {
public abstract int register(People people);
public abstract boolean login(People people);
public abstract People find(int id);
public abstract boolean alter(People people);
}
PeopleService.java
对上述接口的实现
package service.impl;
import dao.PeopleDAO;
import dao.impl.PeopleDAOImpl;
import entity.People;
import service.PeopleService;
import util.CustomUtil;
public class PeopleServiceImpl implements PeopleService {
private PeopleDAO peopleDAO = new PeopleDAOImpl();//不实例化会导致空指针异常
@Override
public int register(People people) {
CustomUtil.outPosition("red", "PeopleServiceImpl.register()");
CustomUtil.outParameter("red", "people", people.toString());
if (peopleDAO.findById(people.getId()).getId() == 0) {
if (peopleDAO.doInsert(
people.getId(), people.getPassword(), people.getName(),
people.getEmail(), people.getAddress(), people.getStatus()) == 1) {
return 0;
} else {
return 2;
}
}
return 1;
}
@Override
public boolean login(People people) {
if (peopleDAO.findByLogin(people.getId(), people.getPassword()).getId() != 0) {
return true;
}
return false;
}
@Override
public People find(int id) {
return peopleDAO.findById(id);
}
@Override
public boolean alter(People people) {
return false;
}
}
CheckCodeServlet.java
在内存中生成验证码图片并输出到客户端
package servlet;
import util.CustomUtil;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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 java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@WebServlet(name = "CheckCodeServlet", urlPatterns = "/CheckCodeServlet")
public class CheckCodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static int width=70;
private static int height=25;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session=request.getSession();
response.setContentType("image/jpeg");//设置生成的文档类型为jpg
ServletOutputStream servletOutputStream = response.getOutputStream();
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics graphics = image.getGraphics();
char[] rands = generCode();//产生随机的验证码
drawRands(graphics, rands);//产生图像
graphics.dispose();//结束图像的绘制过程,完成图像
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
ImageIO.write(image, "jpeg", byteArrayOutputStream);
byte[] buf = byteArrayOutputStream.toByteArray();
response.setContentLength(buf.length);
servletOutputStream.write(buf);
byteArrayOutputStream.close();
servletOutputStream.close();
session.setAttribute("checkcode", new String(rands));//将当前的验证码写入到session中
}
private char[] generCode() {
String chars = "0123456789";
char[] rands = new char[5];
for (int i = 0; i < 5; i++) {
int rand = (int) (Math.random()*10);
rands[i] = chars.charAt(rand);
}
return rands;
}
private void drawRands(Graphics g, char[] rands) {
g.setColor(Color.WHITE);
g.setFont(new Font(null, Font.ITALIC|Font.BOLD, 18));
g.drawString("" + rands[0], 0, 18);
g.drawString("" + rands[1], 14, 18);
g.drawString("" + rands[2], 28, 18);
g.drawString("" + rands[3], 42, 18);
g.drawString("" + rands[4], 56, 18);
CustomUtil.outPosition("green", "CheckCode.drawRands()");
CustomUtil.outParameter("green", "rands", String.valueOf(rands));
}
}
相关文件
GitHub链接
项目最初是在Eclipse上做的,后来又在IDEA上进行了大量修改与优化,不过基本功能没有发生太大变化。由于代码差异过多,我将旧版本文件单独备份在ShoppingSystem/web/src/others/old version file/路径下。













