热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

JavaWeb实战之开发网上购物系统(超详细)

这篇文章主要介绍了JavaWeb实战之开发网上购物系统(超详细),文中有非常详细的代码示例,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下

一、项目描述

基于B/S三层架构设计的购物系统,可以更好地符合"高内聚,低耦合"的设计思想。表现层(UI)通过JSP在浏览器上实现界面展示,通过Servlet接受用户请求并生成验证码等实时信息;数据访问层(DAL)通过JDBC对DBMS进行访问;二者之间的业务逻辑层(BLL)通过Service进行连接。同时面向接口编程提高规范化。这只是我自己用两三天的时间做的小项目,距离真正的购物系统差距还是很大的,仅供初学者参考,很多逻辑缺陷不必太纠结,以后有时间会再写一篇博客对这个项目进行相关测试。

如果只需要代码可直接通过书签栏跳转至相关文件。

二、项目演示

这是购物系统首页,是仿照华为商城设计的,当然也可以说是仿照小米商城,这二者的页面设计并无本质区别,具体实现借助于Bootstrap,商品信息通过后台数据库读取,商品表见下

在这里插入图片描述
在这里插入图片描述

点击任意商品进入详情界面

在这里插入图片描述

如果此时点击加入购物车会调用Servlet中的doPost方法,进而通过登陆信息是否读取成功判断登陆状态,如果未登录则转至登录界面并提示相关信息,背景渐变色借助于webgradients选取,同时实现正则验证与验证码相关功能

在这里插入图片描述

我们先注册再登录,这里注册洛的相关信息

在这里插入图片描述

注册成功

在这里插入图片描述
在这里插入图片描述

之后我们登录并将心仪的商品加入购物车,查看购物车,这里会一致显示当前登录用户信息

在这里插入图片描述

提交订单后查看订单,这里借助jQuery做了一个下拉框,可以查看后台数据库关于此订单的全部信息,这里提交订单相当于付款,所以未设退货功能,因此数据删除只能借助于后台数据库。

在这里插入图片描述

最后点击注销返回主页

在这里插入图片描述

三、部分代码

JdbcUtils.java

用于加载驱动并获得与数据库的连接的工具类

package common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JdbcUtil {
	static Connection connection;
	public static Connection getCon() {
		//加载驱动
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String url = "jdbc:mysql://localhost:3306/shoppingsystem?characterEncoding=utf-8";
		String username = "root";
		String password = "123";
		
		//获得连接
		try {
			cOnnection= DriverManager.getConnection(url, username, password);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return connection;
	}
	public static void closeAll(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {
		if (resultSet != null) {
			try {
				resultSet.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (preparedStatement != null) {
			try {
				preparedStatement.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (connection != null) {
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
、

People.java

与数据库中用户表相匹配的用户类

package entity;

public class People {
	private String id;
	private String password;
	private String name;
	private String email;
	private String address;
	
	public People() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public People(String id, String password, String name, String email, String address) {
		super();
		this.id = id;
		this.password = password;
		this.name = name;
		this.email = email;
		this.address = address;
	}

	public String getId() {
		return id;
	}

	public void setId(String 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;
	}

	@Override
	public String toString() {
		return "People [id=" + id + ", password=" + password + ", name=" + name + ", email=" + email + ", address="
				+ address + "]";
	}
	
}

InterfacePeopleDao.java

对用户信息进行相关操作的接口

package dao;

import java.util.List;

import entity.People;

public interface InterfacePeopleDao {
	public abstract int insertPeople(String id, String password, String name, String email, String address);
	
	public abstract int deletePeople(String id);
	
	public abstract int updatePeople(String id, String password, String name, String email, String address);
	
	public abstract People checkPeople(String id, String password);
	
	public abstract List findAllPeople();
}

PeopleDao.java

对上述接口的实现

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import common.JdbcUtil;
import entity.People;

public class PeopleDao implements InterfacePeopleDao {
	private Connection connection;
	private PreparedStatement preparedStatement;
	private ResultSet resultSet;

	@Override
	public int insertPeople(String id, String password, String name, String email, String address) {
		String sql = "mistake";
		if (id != "" && password != "" && name != "" && email != "" && address != "") {
			sql = "insert into people (id, password, name, email, address)" + "values('" + id + "','" + 
					password + "','" + name + "','" + email + "','" + address + "');";
		}
		System.out.println("insertPeople()的sql语句:" + sql);
		
		int result = 0;
		cOnnection= JdbcUtil.getCon();
		try {
			preparedStatement = connection.prepareStatement(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			result = preparedStatement.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		JdbcUtil.closeAll(connection, preparedStatement, resultSet);
		return result;
	}

	@Override
	public int deletePeople(String id) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int updatePeople(String id, String password, String name, String email, String address) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public People checkPeople(String id, String password) {
		String sql = null;
		if (id != null && password != null) {
			sql = "select * from people where id = '" + id + "' and password = '" + password + "'";
		}
		System.out.println("checkPeople()的sql语句:" + sql);
		
		People people = null;
		cOnnection= JdbcUtil.getCon();
		try {
			preparedStatement = connection.prepareStatement(sql);
			resultSet = preparedStatement.executeQuery();
			if (resultSet.next()) {
				people = new People();
				people.setId(resultSet.getString(1));
				people.setPassword(resultSet.getString(2));
				people.setName(resultSet.getString(3));
				people.setEmail(resultSet.getString(4));
				people.setAddress(resultSet.getString(5));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(connection, preparedStatement, resultSet);
		}
		return people;
	}

	@Override
	public List findAllPeople() {
		// TODO Auto-generated method stub
		return null;
	}

}

InterfacPeopleService.java

在业务逻辑层中将表现层与数据访问层进行连接,由于项目本身并不复杂,所以只是简单实现了方法传递

package service;

import java.util.List;

import entity.People;

public interface InterfacePeopleService {
	public abstract int insertPeople(String id, String password, String name, String email, String address);
	
	public abstract int deletePeople(String id);
	
	public abstract int updatePeople(String id, String password, String name, String email, String address);
	
	public abstract People checkPeople(String id, String password);
	
	public abstract List findAllPeople();
}

PeopleService.java

对上述接口的实现

package service;

import java.util.List;

import dao.InterfacePeopleDao;
import dao.PeopleDao;
import entity.People;

public class PeopleService implements InterfacePeopleService {
	private InterfacePeopleDao peopleDao;
	
	public PeopleService() {
		peopleDao = new PeopleDao();
	}

	@Override
	public int insertPeople(String id, String password, String name, String email, String address) {
		return peopleDao.insertPeople(id, password, name, email, address);
	}

	@Override
	public int deletePeople(String id) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int updatePeople(String id, String password, String name, String email, String address) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public People checkPeople(String id, String password) {
		return peopleDao.checkPeople(id, password);
	}

	@Override
	public List findAllPeople() {
		// TODO Auto-generated method stub
		return null;
	}

}

CheckCode.java

在内存中生成验证码图片并输出到客户端

package servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

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;

@WebServlet("/CheckCode")
public class CheckCode extends HttpServlet {
	private static final long serialVersiOnUID= 1L;
	private static int width=70;
    private static int height=25;
       
	public CheckCode() {
		super();
		// TODO Auto-generated constructor stub
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/**
		 * request是客户端浏览器发出的请求被封装形成的一个HttpServletRequest公共接口类对象
		 * session对象存储特定用户会话所需的属性及配置信息, 这样当用户在应用程序的Web页之间跳转时, 存储在session对象中的变量将不会丢失, 而是在整个用户会话中一直存在下去
		 * getSession()与getSession(true)一样, 获取request对象关联的session对象, 如果没有session, 则返回一个新的session
		 */
		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);
		
		/**
		 * 创建内存图片并获得其图形上下文
		 * Image是一个抽象类, BufferedImage是其实现类, 是一个带缓冲区图像类, 主要作用是将一幅图片加载到内存中
		 * BufferedImage生成的图片在内存里有一个图像缓冲区, 利用这个缓冲区我们可以很方便地操作这个图片
		 */
		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);
		System.out.print("当前验证码:");
		System.out.println(rands);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

到此这篇关于Java实战之利用JavaWeb开发购物系统(超详细)的文章就介绍到这了,更多相关JavaWeb购物系统内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 视图分区_组复制常规操作网络分区amp;混合使用IPV6与IPV4 | 全方位认识 MySQL 8.0 Group Replication...
    网络分区对于常规事务而言,每当组内有事务数据需要被复制时,组内的成员需要达成共识(要么都提交,要么都回滚)。对于组成员资格的变更也和保持组 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • PRML读书会第十四章 Combining Models(committees,Boosting,AdaBoost,决策树,条件混合模型)...
    主讲人网神(新浪微博:豆角茄子麻酱凉面)网神(66707180)18:57:18大家好,今天我们讲一下第14章combiningmodel ... [详细]
  • Java工程师书单(初级,中级,高级)
    简介怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序 ... [详细]
  • 本文内容皆为作者原创,如需转载,请注明出处:https:www.cnblogs.comxuexianqip13045462.html1.自定义分页器的拷贝及使用当我们需要使用 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
author-avatar
专业拍片
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有