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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 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)咨询

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
15天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
18天前
|
Java 数据库 Android开发
图书销售系统【纯控制台】(Java课设)
图书销售系统【纯控制台】(Java课设)
22 1
|
17天前
|
SQL 设计模式 安全
Java单例模式几种写法以及代码案例拿来直接使用
Java单例模式几种写法以及代码案例拿来直接使用
31 0
|
1天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
26 10
|
1天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
8天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
15 0
|
10天前
|
人工智能 小程序 Java
JAVA开发智慧学校系统源码+人脸电子班牌布局
智慧校园是通过利用物联网,大数据技术来改变师生和校园资源相互交互的方式,以便提高交互的明确性、灵活性和响应速度,从而实现智慧化服务和管理的校园模式。
|
10天前
|
SQL Java Go
java项目超市购物管理系统
java项目超市购物管理系统
|
16天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
16天前
|
前端开发 Java API
构建RESTful API:Java中的RESTful服务开发
【4月更文挑战第3天】本文介绍了在Java环境中构建RESTful API的重要性及方法。遵循REST原则,利用HTTP方法处理资源,实现CRUD操作。在Java中,常用框架如Spring MVC简化了RESTful服务开发,包括定义资源、设计表示层、实现CRUD、考虑安全性、文档和测试。通过Spring MVC示例展示了创建RESTful服务的步骤,强调了其在现代Web服务开发中的关键角色,有助于提升互操作性和用户体验。
构建RESTful API:Java中的RESTful服务开发