JavaWeb实训项目案例开发之在线图书网站开发【非常适合初学者】

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kese7952/article/details/84037487 须知:本篇教程仅限功能性开发,不包括真实业务逻辑,非常适合初学者上手开发。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kese7952/article/details/84037487

须知:

本篇教程仅限功能性开发,不包括真实业务逻辑,非常适合初学者上手开发。
手写代码从前台贯串后台,没有花哨的界面和友好性的js脚本提示
由于功能性较多,目前只手写了添加和查询功能。
修改和删除功能后续上线

有疑问、或者又更简单、更优秀的方法请在下方评论区留言!感谢支持!

1.项目分析

网上书店: 使用所学的javaweb知识
邮件的发送
在线支付
添加分类
查询分类
添加图书
查询书籍
分页显示和分类名称获取
权限控制

功能思维导图

1542115954816

项目原型预览

1、项目前台预览

1.1前台首页展示:

img

1.2内容页展示:

img

1.3分类展示:

img

1.4购物车展示:

img

1.5个人用户注册展示:

img

1.6个人用户登录展示:

img

并自动跳转到主页:

img

1.7我的订单展示:

img

1.2、项目后台预览

1.2.1 后台首页展示

img

1.2.2 后台添加分类

img

1.2.3 后台查询分类

img

  1. 2.4 后台添加图书

img

1.2.5 后台查询图书

img

2.编程准备

|--- 开发环境:

	Java环境  	1.8 JDK	
    				安装|--- 链接:https://pan.baidu.com/s/1FSeR4KYZwl2dg6btBkN80Q 
                            提取码:ftav 
                            复制这段内容后打开百度网盘手机App,操作更方便哦

	数据库环境:    5.6版本
					安装|--- 链接:https://pan.baidu.com/s/16uuaxxu12td5EczlwGVAvQ 
                            提取码:21pv 
                            复制这段内容后打开百度网盘手机App,操作更方便哦

|--- 采用IDE:

	Java's IDE: MyEclipse2016
                    软件|--- 链接:https://pan.baidu.com/s/1LZWkopNa6mEAmFndQjDSSg 
                            提取码:g1gt 
                            复制这段内容后打开百度网盘手机App,操作更方便哦
                    破解|--- 链接:https://pan.baidu.com/s/1OtE2jFCPMrEWH9rIrPYmAw 
                            提取码:heva 
                            复制这段内容后打开百度网盘手机App,操作更方便哦

	Navicat for Mysql 
                软件|--- 链接:https://pan.baidu.com/s/1YMXyfPWZqXrp7NOblhyGGg 
                        提取码:qufy 
                        复制这段内容后打开百度网盘手机App,操作更方便哦

  1. 项目编码:

    1. 程序编码设置为UTF-8

      步骤:

      |-- window - perferences - General - Workspace - Text File Encoding(右侧)

      1542108811526

    2. jsp 模板编码设置UTF-8

      |-- window - perferences - MyEclipse - File and Editors - JSP - Encoding(UnicodeUtf-8) (右侧)

      1542109051729

    3. 导入Jar和配置文件:

      所需哪些jar包?
      |----1. MySQL驱动
      |----2. dbcp和pool
      |----3. dbUtils
      |----4. beanUtils和logging

      配置文件
      |----1. jdbc.properties

      1542109293351

      大家可以通过apache 网站,访问http://commons.apache.org进行下载http://commons.apache.org/
      大家也可以通过百度云链接进行下载当前文章所需Jar包:
      链接:https://pan.baidu.com/s/1h-geYZTe9v9BO4cdeDmR3w
      提取码:3jfz
      复制这段内容后打开百度网盘手机App,操作更方便哦
      1542109821435

    4. 编程思想

      程序使用分层思想及三层架构的MVC模式进行开发

1542113356497

  1. 程序编码

    5.1实体类 - 分类管理

    package com.ambow.entity;
    
    import java.io.Serializable;
    
    @SuppressWarnings("serial")
    public class Category implements Serializable {
    
    	private String id;//UUID
    	private String name;
    	private String description;
    	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;
    	}
    	public String getDescription() {
    		return description;
    	}
    	public void setDescription(String description) {
    		this.description = description;
    	}
    }
    

    5.2 数据访问层 dao

    package com.ambow.dao;
    
    import java.util.List;
    
    import com.ambow.entity.Category;
    
    public interface CategoryDao {
    	/**
    	 * 添加分类
    	 * @param category
    	 */
    	void save(Category category);
    	/**
    	 * 查询所有分类
    	 * @return 没找到返回null
    	 */
    	List<Category> getAllCategories();
    	/**
    	 * 根据主键查找主键
    	 * @param categoryId
    	 * @return 没找到返回null
    	 */
    	Category getCategoryById(String categoryId);
    
    }
    

    实现类

    package com.ambow.dao.impl;
    
    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 com.ambow.dao.CategoryDao;
    import com.ambow.entity.Category;
    import com.ambow.util.DbcpUtils;
    
    public class CategoryDaoImpl implements CategoryDao {
    
    	QueryRunner  queryRunner = new QueryRunner(DbcpUtils.getDataSource());
    	
    	@Override
    	public void save(Category category) {
    		try {
    			queryRunner.update("insert into categories(id,name,description) values (?,?,?)",category.getId(),category.getName(),category.getDescription());
    		} catch (SQLException e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    	@Override
    	public List<Category> getAllCategories() {
    		try {
    			return queryRunner.query("select * from categories", new  BeanListHandler<Category>(Category.class));
    		} catch (SQLException e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    	@Override
    	public Category getCategoryById(String categoryId) {
    		try {
    			return queryRunner.query("select * from categories where id = ?", new  BeanHandler<Category>(Category.class),categoryId);
    		} catch (SQLException e) {
    			throw new RuntimeException(e);
    		}
        }
    }
    

    5.3 工具类:数据源连接池DbcpUtil

    package com.ambow.util;
    
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.Properties;
    
    import javax.sql.DataSource;
    
    import org.apache.commons.dbcp2.BasicDataSourceFactory;
    
    public class DbcpUtils {
    	public static DataSource dataSource;
    
    	static {
    
    		try {
    			InputStream in = DbcpUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
    			Properties properties = new Properties();
    			properties.load(in);
    			dataSource = BasicDataSourceFactory.createDataSource(properties);
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    	public static DataSource getDataSource() {
    		return dataSource;
    	}
    
    	public static Connection getConnection() {
    		try {
    			return dataSource.getConnection();
    		} catch (SQLException e) {
    			throw new RuntimeException(e);
    		}
    	}
    }
    

    配置文件:

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql:///webbookstore
    username=root
    password=sorry
    

    5.4 业务逻辑服务层 service

    package com.ambow.service;
    
    import java.util.List;
    
    import com.ambow.commons.Page;
    import com.ambow.entity.Book;
    import com.ambow.entity.Category;
    
    public interface BusinessService {
    
    	/*-------------------图书分类逻辑--------------------*/
    	/**
    	 * 添加分类
    	 * @param category
    	 */
    	void addCategory(Category category);
    	
    	/**
    	 * 查询所有分类
    	 * @return 没找到返回null
    	 */
    	List<Category> findAllCategories();
    
    	/**
    	 * 根据主键查找主键
    	 * @param categoryId
    	 * @return 没找到返回null
    	 */
    	Category findCategoryById(String categoryId);
    }
    

    实现类

    package com.ambow.service.impl;
    
    import java.util.List;
    import java.util.UUID;
    
    import com.ambow.commons.Page;
    import com.ambow.dao.BookDao;
    import com.ambow.dao.CategoryDao;
    import com.ambow.dao.impl.BookDaoImpl;
    import com.ambow.dao.impl.CategoryDaoImpl;
    import com.ambow.entity.Book;
    import com.ambow.entity.Category;
    import com.ambow.service.BusinessService;
    /**
     * 业务逻辑接口的实现类
     * @author Mryang
     *
     */
    public class BusinessServiceImpl implements BusinessService {
    	
    	CategoryDao categoryDao = new CategoryDaoImpl();
    	BookDao bookDao = new BookDaoImpl();
    	
    	/*-------------------图书分类逻辑--------------------*/
    	@Override
    	public void addCategory(Category category) {
    		category.setId(UUID.randomUUID().toString());
    		categoryDao.save(category);
    	}
    
    	@Override
    	public List<Category> findAllCategories() {
    		return categoryDao.getAllCategories();
    	}
    
    	@Override
    	public Category findCategoryById(String categoryId) {
    		return categoryDao.getCategoryById(categoryId);
    }
    

    5.5 控制器 servlet

    package com.ambow.controller;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    import java.io.Reader;
    import java.lang.reflect.InvocationTargetException;
    import java.nio.channels.FileChannel;
    import java.util.List;
    import java.util.UUID;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.beanutils.BeanUtils;
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileItemIterator;
    import org.apache.commons.fileupload.FileItemStream;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.apache.commons.fileupload.util.FileItemHeadersImpl;
    import org.apache.commons.fileupload.util.Streams;
    import org.apache.commons.io.FilenameUtils;
    
    import com.ambow.commons.Page;
    import com.ambow.entity.Book;
    import com.ambow.entity.Category;
    import com.ambow.service.BusinessService;
    import com.ambow.service.impl.BusinessServiceImpl;
    import com.ambow.util.FilePathUtil;
    import com.ambow.util.FillBeanUtils;
    
    public class ControlServlet extends HttpServlet {
    
    	private static final long serialVersionUID = 1L;
    	
    	BusinessService service = new BusinessServiceImpl();
    	
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    				
    		String  op = request.getParameter("op");
            
    		if("addCategory".equals(op)){
    			addCategory(request, response);
    		}else if("showAllCategories".equals(op)){
    			showAllCategories(request, response);
    		}else if("showAllBooks".equals(op)){
    			showAllBooks(request, response);
    		}
    		else{
    			System.out.println("error");
    		}
    }
    	/***************************图书分类**********************************/
    	/**
    	 * 查询所有分类
    	 * @param request
    	 * @param response
    	 * @throws ServletException
    	 * @throws IOException
    	 */
    	public void showAllCategories(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    		List<Category> categoryList = service.findAllCategories();
    		request.setAttribute("categoryList", categoryList);
    		request.getRequestDispatcher("/admin/listCategory.jsp").forward(request, response);
    		
    		
    		
    	}
    
    	/**
    	 * 添加分类
    	 * @param request
    	 * @param response
    	 * @throws ServletException
    	 * @throws IOException
    	 */
    	public void addCategory(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		Category category = FillBeanUtils.fillBean(request,Category.class);
    		service.addCategory(category);
    		request.setAttribute("msg", "保存成功");
    		request.getRequestDispatcher("/message.jsp").forward(request, response);
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    		doGet(request, response);
    	}
    }
    

    5.6 工具类 封装对象的工具类:FillBeanUtils

    package com.ambow.util;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.commons.beanutils.BeanUtils;
    
    /**
     * 使用自定义泛型进行封装JavaBean
     * @author Mryang
     */
    public class FillBeanUtils {
    
    	public static <T> T fillBean(HttpServletRequest request, Class<T> clazz) {
    		
    		 try {
    			T bean  = clazz.newInstance();
    			BeanUtils.copyProperties(bean, request.getParameterMap());
    			return bean;
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}		
    	}
    }
    

    5.7 前台页面: jsp

      注: 在WebRoot下创建文件夹 命名为admin,在admin下创建jsp:index.jsp
    
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ include file="/admin/header.jsp"%>
    <br />
    <h2>欢迎光临趣读书屋</h2>
    </body>
    </html>
    
    

    在admin下创建jsp:header.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    <%
    	String path = request.getContextPath();
    	String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
    			+ path + "/";
    	pageContext.setAttribute("basePath", basePath);
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    
    <title>趣读书屋后台管理</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <link rel="stylesheet" type="text/css" href="${basePath}css/main.css">
    
    </head>
    
    <body>
    	<br />
    	<br />
    	<h1>趣读书屋后台管理</h1>
    	<br />
    	<a href="${basePath}admin/addCategory.jsp">添加分类</a>
    	<a href="${basePath}servlet/ControlServlet?op=showAllCategories">查询分类</a>
    	<a href="">添加书籍</a>
    	<a href="">查询书籍</a>
    	<a href="">待处理订单</a>
    	<a href="">已处理订单</a>
    	<br />
    	<hr/>
    </body>
    </html>
    
    

    addCategory.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ include file="/admin/header.jsp"%>
    <form action="${basePath}/servlet/ControlServlet?op=addCategory"
    	method="post">
    	<table border="1px" width="438px">
    		<tr>
    			<td>添加分类</td>
    			<td><input type="text" name="name"></td>
    		</tr>
    		<tr>
    			<td>查询分类</td>
    			<td><textarea rows="3" cols="38" name="description"></textarea>
    			</td>
    		</tr>
    		<tr>
    			<td colspan="2"><input type="submit" value="保  存"></td>
    		</tr>
    	</table>
    </form>
    </body>
    </html>
    

    查询分页:listCategory.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ include file="/admin/header.jsp"%>
    <br />
    <table border="1" width="438">
    	<tr>
    		<th>选择</th>
    		<th>分类名称</th>
    		<th>分类描述</th>
    		<th>操作</th>
    	</tr>
    	<c:forEach items="${categoryList}" var="cl" varStatus="vcl">
    		<tr class="${vcl.index%2==0?'odd':'even' }">
    			<td><input type="checkbox" name="ids" value="${cl.id}">
    			</td>
    			<td>${cl.name }</td>
    			<td>${cl.description }</td>
    			<td>
                    <a href="javascript:alert('略')">修改</a> 
                    <a href="javascript:alert('略')">删除</a>
                </td>
    		</tr>
    	</c:forEach>
    </table>
    <br />
    </body>
    </html>
    

    注: 在WebRoot下创建jsp:message.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ include file="/admin/header.jsp" %>	
     	<h1>
     	${msg }
     	</h1>
      </body>
    </html>
    

    5.8 在WebRoot下创建一个文件夹,命名为css,在css下创建一个文件,命名为main.css

    @CHARSET "UTF-8";
    body{
    	font-size: 12px;
    	text-align: center;
    }
    table{
    	font-size: 12px;
    	 margin:  0 auto;
    }
    .odd{
    	background-color: f3c3f3;
    }
    .even{
    	background-color: c3f3c3;
    }
    	
    
  2. 运行项目

  3. 效果

    Mryang制作

作者: 杨校

出处: https://blog.csdn.net/kese7952

分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(397583050@qq.com)咨询

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
11天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
33 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
8天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
23 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
9天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
21 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统
|
9天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的美容预约管理系统
基于Java+Springboot+Vue开发的美容预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的美容预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
21 3
基于Java+Springboot+Vue开发的美容预约管理系统
|
11天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的房产销售管理系统
基于Java+Springboot+Vue开发的房产销售管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的房产销售管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
25 3
基于Java+Springboot+Vue开发的房产销售管理系统
|
9天前
|
存储 网络协议 Java
Java NIO 开发
本文介绍了Java NIO(New IO)及其主要组件,包括Channel、Buffer和Selector,并对比了NIO与传统IO的优势。文章详细讲解了FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel及Pipe.SinkChannel和Pipe.SourceChannel等Channel实现类,并提供了示例代码。通过这些示例,读者可以了解如何使用不同类型的通道进行数据读写操作。
Java NIO 开发
|
6天前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
22 2
|
Java 开发工具 git
Java开发初级6.24.3
5.在Git使用过程中,进行Git配置的操作命令是哪个() A. config B. config -g C. config -a D. git config 相关知识点: 在git中,经常使用git config 命令用来配置git的配置文件,git配置级别主要有:仓库级别 local 【优先级最高】、用户级别 global【优先级次之】、系统级别 system【优先级最低】 正确答案:D 10.RDBMS是什么? A. Rela Database Management Systems B. Relational Database Management Systems C. Relation
127 0
|
SQL 前端开发 JavaScript
Java开发初级6.24.2
3.Java网站src/main/java目录保存的是什么资源? A. Java源代码文件 B. 测试代码 C. JavaScript、CSS等文件 D. 图片资源 正确答案:A 4.什么是索引Index? A. SQL数据库里的表管理工具 B. SQL数据库里的查询工具 C. SQL数据库里的目录工具 D. SQL数据库用来加速数据查询的特殊的数据结构 正确答案:D
134 0
|
Java
Java开发初级6.24.1
1.下面关于泛型的描述中错误的一项是? A. “? extends 类”表示设置泛型上限 B. “? super 类”表示设置泛型下限 C. 利用“?”通配符可以接收全部的泛型类型实例,但却不可修改泛型属性内容 D. 如果类在定义时使用了泛型,则在实例化类对象时需要设置相应的泛型类型,否则程序将无法编译通过 相关知识点: https://edu.aliyun.com/course/35 正确答案:D 2.下列选项中属于SVN中控制鉴权用户访问版本库的权限默认权限的是() A. write B. read C. none D. null 相关知识点: auth-access:取值范围为"writ
227 0
下一篇
无影云桌面