须知:

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

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

1.项目分析

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

功能思维导图

项目原型预览

1、项目前台预览

1.1前台首页展示:

1.2内容页展示:

1.3分类展示:

1.4购物车展示:

1.5个人用户注册展示:

1.6个人用户登录展示:

并自动跳转到主页:

1.7我的订单展示:

1.2、项目后台预览

1.2.1 后台首页展示

1.2.2 后台添加分类

1.2.3 后台查询分类

  1. 2.4 后台添加图书

1.2.5 后台查询图书

2.编程准备

|--- 开发环境:

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

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

|--- 采用IDE:

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ivbo4UNQ-1654792198349)(C:\Users\Mryang\AppData\Local\Temp\1542109099587.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yFvQYGoR-1654792198351)(C:\Users\Mryang\AppData\Local\Temp\1542109117026.png)]

  1. 项目编码:

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

      步骤:

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

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

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

    3. 导入Jar和配置文件:

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

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

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

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

  ![](https://img.alicdn/imgextra/i2/1850677525/TB21LmqvNuTBuNkHFNRXXc9qpXa_!!1850677525.png)

5. 程序编码
5.1实体类 - 分类管理
  ```java
  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

  ```java
  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);
  
  }
  ```

  DAO实现类

  ```java
  package com.ambow.dao.impl;
  
  import java.sql.SQLException;
  import java.util.List;
  
  import org.apachemons.dbutils.QueryRunner;
  import org.apachemons.dbutils.handlers.BeanHandler;
  import org.apachemons.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

  ```java
  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.apachemons.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);
  		}
  	}
  }
  ```

  配置文件:

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

  5.4 业务逻辑服务层 service

  ```java
  package com.ambow.service;
  
  import java.util.List;
  
  import com.ambowmons.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);
  }
  ```

 Service 实现类

  ```java
  package com.ambow.service.impl;
  
  import java.util.List;
  import java.util.UUID;
  
  import com.ambowmons.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

  ```java
  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.apachemons.beanutils.BeanUtils;
  import org.apachemons.fileupload.FileItem;
  import org.apachemons.fileupload.FileItemIterator;
  import org.apachemons.fileupload.FileItemStream;
  import org.apachemons.fileupload.FileUploadException;
  import org.apachemons.fileupload.disk.DiskFileItemFactory;
  import org.apachemons.fileupload.servlet.ServletFileUpload;
  import org.apachemons.fileupload.util.FileItemHeadersImpl;
  import org.apachemons.fileupload.util.Streams;
  import org.apachemons.io.FilenameUtils;
  
  import com.ambowmons.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

  ```java
  package com.ambow.util;
  
  import javax.servlet.http.HttpServletRequest;
  
  import org.apachemons.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

  ```jsp
  <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  <%@ include file="/admin/header.jsp"%>
  <br />
  <h2>欢迎光临趣读书屋</h2>
  </body>
  </html>
  
  ```

  在admin下创建jsp:header.jsp

  ```jsp
  <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  <%@ taglib prefix="c" uri="http://java.sun/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

  ```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

  ```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

  ```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

  ```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;
  }
  	
  ```

6. 运行项目
7. 效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lrX3Rgi8-1654792198359)(https://wx3.sinaimg/large/007pkRGrly1fx6r24x3bug30hs0as4qu.gif)]

8.下载

https://github/yangsir1688/jlnk-school/tree/master/BookStore-teach
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3R7a7Hux-1654792198360)(http://img1.ph.126/ARpca6Dq040KI6CZU1If7g==/92323792381350400.gif)]

作者: 杨校

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

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

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

更多推荐

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