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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 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
目录
相关文章
|
2天前
|
Java 数据安全/隐私保护 Spring
Java 中 Spring Boot 框架下的 Email 开发
Java 中 Spring Boot 框架下的 Email 开发
18 2
|
2天前
|
Java 关系型数据库 MySQL
【Java Spring开源项目】新蜂(NeeBee)商城项目运行、分析、总结
【Java Spring开源项目】新蜂(NeeBee)商城项目运行、分析、总结
13 4
|
2天前
|
存储 Java Maven
Maven 构建 Java 项目
使用 Maven 的 `maven-archetype-quickstart` 插件在 `C:\MVN` 创建 Java 应用项目 `consumerBanking`,命令行参数包括 `-DgroupId`, `-DartifactId` 和 `-DarchetypeArtifactId`。项目包含 src/main/java 和 src/test/java 目录,分别存放 Java 代码和测试代码,以及 src/main/resources 用于存储资源文件。默认生成的 `App.java` 和 `AppTest.java` 分别为应用主类和测试类。
|
2天前
|
移动开发 前端开发 Java
STS里的java 工程项目名称修改和目录设置成源代码
STS里的java 工程项目名称修改和目录设置成源代码
|
2天前
|
JavaScript 前端开发 Java
java项目的打包将vue放到.jar里面部署
java项目的打包将vue放到.jar里面部署
|
Java
Java中需要注意的一些案例
Java中需要注意的一些案例
100 0
|
2天前
|
安全 Java 调度
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第12天】 在现代软件开发中,多线程编程是提升应用程序性能和响应能力的关键手段之一。特别是在Java语言中,由于其内置的跨平台线程支持,开发者可以轻松地创建和管理线程。然而,随之而来的并发问题也不容小觑。本文将探讨Java并发编程的核心概念,包括线程安全策略、锁机制以及性能优化技巧。通过实例分析与性能比较,我们旨在为读者提供一套既确保线程安全又兼顾性能的编程指导。
|
1天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第15天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将通过实例分析,理解线程安全的重要性,并学习如何通过各种技术和策略来实现它。同时,我们也将探讨如何在保证线程安全的同时,提高程序的性能。
|
2天前
|
消息中间件 并行计算 Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第15天】 在现代计算机编程中,多线程是一个复杂但必不可少的概念。特别是在Java这种广泛使用的编程语言中,理解并掌握多线程编程是每个开发者必备的技能。本文将深入探讨Java中的多线程编程,从基础概念到实际应用场景,为读者提供全面的理论支持和实践指导。