JavaWeb图书商城 网上书城

前言

博主使用JavaWeb开发的一款商城项目,可以衍生出其他各种商品销售网站
前台: 书籍查看,分页,购物车,个人信息,登录注册,按类别检索
后台: 用户管理,类别管理,用户管理,订单管理

JavaWeb网上书店运行视频


购物车
下面介绍下该项目的实现过程

数据库设计

首先是数据库:请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述

项目目录:

请添加图片描述

工具类

数据库操作

public class DBUtil {
	// 数据库驱动程序
	private String driver;
	// 数据库连接信息
	private String url;
	// 连接数据库的用户名
	private String username;
	// 连接数据库的密码
	private String password;
	// 连接对象
	private Connection con;
	// 预编译语句对象
	private PreparedStatement pstmt;
	// 查询结果分页时,每页显示记录数。
	public static final long PAGE_REC_NUM = 8;

	public void setDriver(String driver) {
		this.driver = driver;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public void setPassword(String password) {
		this.password = password;
	}
     
	public DBUtil() {
		driver = "com.mysql.jdbc.Driver";
		url = "jdbc:mysql://localhost:3306/good_shop?characterEncoding=utf8&serverTimezone=UTC&useSSL=false";	// 数据库名meal可变
		username = "root";
		password = "px980305";	// 数据库密码可变
	}

	// 初始化方法,加载驱动程序,获得数据库的连接对象。
	private void init() {
		try {
			Class.forName(driver);
			con = DriverManager.getConnection(url, username, password);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	// 数据库操作对象的关闭
	private void close() {
		if (pstmt != null) {
			try {
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (con != null) {
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	// 为预编译的SQL语句中的占位符?设置值,值被放在字符串数组params中。
	private void setParams(String[] params) {
		if (params != null) {
			for (int i = 0; i < params.length; i++) {
				try {
					pstmt.setString(i + 1, params[i]);
				} catch (SQLException e) {
					e.printStackTrace();
				}

			}

		}
	}

	// 执行更新类(增删改)的SQL语句,SQL语句中含有占位符。
	public int update(String sql, String[] params) {
		int result = 0;
		init();
		try {
			pstmt = con.prepareStatement(sql);
			setParams(params);
			result = pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return result;
	}

	// 执行更新类(增删改)的SQL语句,SQL语句中不含有占位符。
	public int update(String sql) {
		return update(sql, null);
	}

	// 执行返回多条记录的查询操作,结果被封装到List中。
	public List<Map<String, String>> getList(String sql, String[] params) {
		List<Map<String, String>> list = null;
		init();
		try {
			pstmt = con.prepareStatement(sql);
			setParams(params);
			ResultSet rs = pstmt.executeQuery();
			list = getListFromRS(rs);
			rs.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return list;
	}

	public List<Map<String, String>> getList(String sql) {
		return getList(sql, null);
	}

	// 执行返回至多一条记录的查询操作,结果被封装到Map中。
	public Map<String, String> getMap(String sql, String[] params) {
		Map<String, String> m = null;
		List<Map<String, String>> l = getList(sql, params);
		if (l != null && l.size() != 0) {
			m = (Map<String, String>) (l.get(0));
		}
		return m;
	}

	public Map<String, String> getMap(String sql) {
		return getMap(sql, null);
	}

	// 将结果集中的内容封装到List中
	private List<Map<String, String>> getListFromRS(ResultSet rs) throws SQLException {
		List<Map<String, String>> list = new ArrayList<Map<String, String>>();
		ResultSetMetaData rsmd = rs.getMetaData();
		while (rs.next()) {
			Map<String, String> m = new HashMap<String, String>();
			for (int i = 1; i <= rsmd.getColumnCount(); i++) {
				String colName = rsmd.getColumnLabel(i);
				String s = rs.getString(colName);
				if (s != null) {
					m.put(colName, s);
				}
			}
			list.add(m);
		}
		return list;
	}

	// 查询结果分页时,返回分页信息的Map,包括总页数,每页记录数和当前页中的记录。
	public Map<String, Object> getPage(String sql, String[] params, String curPage) {
		Map<String, Object> page = new HashMap<String, Object>();
		String newSql = sql + " limit " + (Long.parseLong(curPage) - 1) * PAGE_REC_NUM + "," + PAGE_REC_NUM;
		List<Map<String, String>> pageList = getList(newSql, params);
		sql = sql.toLowerCase();
		String countSql = "";
		if (sql.indexOf("group") >= 0) {
			countSql = "select count(*) as tempNum from (" + sql + ") as temp";
		} else {
			countSql = "select count(*) as tempNum " + sql.substring(sql.indexOf("from"));
		}
		String count_s = (String) getMap(countSql, params).get("tempNum");
		long count = Long.parseLong(count_s);
		long totalPage = 0;
		if (count % PAGE_REC_NUM == 0)
			totalPage = count / PAGE_REC_NUM;
		else
			totalPage = count / PAGE_REC_NUM + 1;
		page.put("list", pageList);
		page.put("totalPage", totalPage);
		page.put("curpage", curPage);
		page.put("recNum", PAGE_REC_NUM);
		return page;
	}

	public Map<String, Object> getPage(String sql, String curPage) {
		return getPage(sql, null, curPage);
	}
}

文件下载与图片上传

package util;

import java.io.File;
import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;

public class FileUploadUtil {

	// 上传单一文件
	public static String uploadSingleFile(Part part, HttpServletRequest request) {
		String path = null;
		String fileName = getFileName(part);
		if (!fileName.equals("")) {
			// 得到上传文件的文件扩展名
			String fileExtName = getFileExtName(part);
			String newFileName = System.currentTimeMillis() + fileExtName;
			// 得到上传文件保存路径的服务器端硬盘物理路径
			String savePath = request.getServletContext().getRealPath("/img");
			File f = new File(savePath);
			if (!f.exists()) {
				f.mkdirs();
			}
			// 文件上传
			try {
				part.write(savePath + File.separator + newFileName);
				path = "img/" + newFileName;
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return path;
	}

	/**
	 * 根据请求头解析出文件名 请求头的格式:火狐和google浏览器下:form-data; name="file";
	 * filename="snmp4j--api.zip" IE浏览器下:form-data; name="file";
	 * filename="E:\snmp4j--api.zip"
	 * 
	 * @param header 请求头
	 * @return 文件名
	 */
	public static String getFileName(Part part) {
		/**
		 * String[] tempArr1 = header.split(";");代码执行完之后,在不同的浏览器下,tempArr1数组里面的内容稍有区别
		 * 火狐或者google浏览器下:tempArr1={form-data,name="file",filename="snmp4j--api.zip"}
		 * IE浏览器下:tempArr1={form-data,name="file",filename="E:\snmp4j--api.zip"}
		 */
		String header = part.getHeader("content-disposition");
		String[] tempArr1 = header.split(";");
		/**
		 * 火狐或者google浏览器下:tempArr2={filename,"snmp4j--api.zip"}
		 * IE浏览器下:tempArr2={filename,"E:\snmp4j--api.zip"}
		 */
		String[] tempArr2 = tempArr1[2].split("=");
		// 获取文件名,兼容各种浏览器的写法
		String fileName = tempArr2[1].substring(tempArr2[1].lastIndexOf("\\") + 1).replaceAll("\"", "");
		return fileName;
	}

	public static String getFileExtName(Part part) {
		String fileName = getFileName(part);
		if(fileName.equals("")) {
			return "";
		}else {
			return fileName.substring(fileName.lastIndexOf("."));
		}
	}
}

时间格式转换

public class Times {
	public String getTime(){
		Long timeStamp = System.currentTimeMillis();  //获取当前时间戳
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp)))); 
        return time;
	}

}

Controller控制器(servlet)

请添加图片描述
管理员获取所有商品的servlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		String gname=request.getParameter("gname");
		if(gname==""){
			gname="";
		}
		String curpage=request.getParameter("curpage");
		
		if(curpage==""){
			curpage="1";
		}
		Map<String, Object> cars=gs.getGoodsPage(gname, curpage);
		request.setAttribute("goods", cars);
		request.getRequestDispatcher("/admin/good_list.jsp").forward(request, response);
	}

商品数据库操作 service和dao结合了

public class GoodService {
	DBUtil db=new DBUtil();
	 public  List<Map<String,String>> getGoods(String gname){
			String sql = "select goods.id id,goods.gname gname,goods.price price ,types.typename typename,goods.image image from goods inner join types on types.id=goods.typeid where goods.gname like '%"+gname+"%' order by id";
			return db.getList(sql);
	}
	 public  Map<String, Object> getGoodsPage(String gname,String curpage,String uid){
			String sql = "select goods.id id,goods.gname gname,goods.price price ,types.typename typename,goods.image image from goods inner join types on types.id=goods.typeid where goods.gname like '%"+gname+"%' and goods.uid=? ";
			String[] params = new String[]{uid};
			return db.getPage(sql, params, curpage);
	}
	 public  Map<String, Object> getGoodsPage(String gname,String curpage){
			String sql = "select goods.id id,goods.gname gname,goods.price price ,types.typename typename,goods.image image from goods inner join types on types.id=goods.typeid where goods.gname like '%"+gname+"%' ";
			return db.getPage(sql, null, curpage);
	}
	 public  List<Map<String,String>> getGoodsByType(String type){
			String sql = "select goods.id id,goods.gname gname,goods.price price ,goods.info info,types.typename typename,goods.image image from goods inner join types on types.id=goods.typeid where types.typename like '%"+type+"%' ";
			return db.getList(sql);
	}
	public int addGood(Good good) {
		// 带占位符的sql语句
		String sql = "insert into goods(gname,price,image,typeid,uid,info) values(?,?,?,?,?,?)";
		String[] params = new String[]{good.getGname(),good.getPrice(),good.getImage(),good.getTypeid(),good.getUid(),good.getInfo()};
		// 得到预编译的语句对象
		return db.update(sql, params);
	}
	public int delGood(String id) {
		String sql = "delete from goods where id=?";
		String[] params= {id};
		return db.update(sql,params);
	}
	public int update(Good good) {
		String sql= "update goods set gname=?,price=?,image=?,typeid=? where id=?";
		String[] params= {good.getGname(),good.getPrice(),good.getImage(),good.getTypeid(),String.valueOf(good.getId())};	
		return db.update(sql,params);
	}
	 public  Good getGoodById(String id){
		 String sql = "select goods.id id,goods.gname gname,goods.price price ,goods.info info,goods.uid uid,types.typename typename,goods.image image from goods inner join types on types.id=goods.typeid where goods.id=?  order by id";
			String[] params = {id};
			Map<String,String> g=db.getMap(sql, params);
			Good good=new Good();
			if(g!=null){
				good.setId(Integer.valueOf(id));
				good.setGname(g.get("gname"));
				good.setImage(g.get("image"));
				good.setPrice(g.get("price"));
				good.setInfo(g.get("info"));
				good.setUid(g.get("uid"));
				good.setTypename(g.get("typename"));
			}else{
				good=null;
			}
			return good;
			
	    }
}

前端显示所有商品

<c:forEach items="${requestScope.goods.list }" var="good">
			<tr>
				<td style="width:80px;height:70px"><img src="${basePath}/${good.image }" style="width:60px;height:50px"></td>
				<td>${good.gname }</td>
				<td>${good.price }元</td>
				<td>${good.typename }</td>
				<td><a href="${basePath}/GoodGetById?id=${good.id }"><button type="button" class="btn btn-success">编辑</button></a>
					<a href="${basePath}/GoodDelServlet?id=${good.id }"><button type="button" class="btn btn-danger">删除</button></a>
					</td>
			</tr>
			</c:forEach>

以下是项目界面展示

书城首页
商品详情
后台订单管理
商品管理

  • 9
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彭祥.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值