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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kese7952/article/details/84037487

须知:

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

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

1.项目分析

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

功能思维导图

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

项目原型预览

1、项目前台预览

1.1前台首页展示:

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

1.2内容页展示:

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

1.3分类展示:

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

1.4购物车展示:

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

1.5个人用户注册展示:

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

1.6个人用户登录展示:

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

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

并自动跳转到主页:

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

1.7我的订单展示:

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

1.2、项目后台预览

1.2.1 后台首页展示

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

1.2.2 后台添加分类

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

1.2.3 后台查询分类

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

  1. 2.4 后台添加图书

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

1.2.5 后台查询图书

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

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(右侧)

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

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

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

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

    3. 导入Jar和配置文件:

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

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

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

      大家可以通过apache 网站,访问http://commons.apache.org进行下载http://commons.apache.org/
      大家也可以通过百度云链接进行下载当前文章所需Jar包:
      链接:https://pan.baidu.com/s/1h-geYZTe9v9BO4cdeDmR3w
      提取码:3jfz
      复制这段内容后打开百度网盘手机App,操作更方便哦
      JavaWeb实训项目案例开发之在线图书网站开发【非常适合初学者】

    4. 编程思想

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

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

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

  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. 效果

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

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

作者: 杨校

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

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

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

上一篇:JavaScript的数组知识案例之随机点名器


下一篇:MVC与三层架构有什么区别