1. 程式人生 > >JavaWeb實訓專案案例開發之線上圖書網站開發【非常適合初學者】

JavaWeb實訓專案案例開發之線上圖書網站開發【非常適合初學者】

須知:

本篇教程僅限功能性開發,不包括真實業務邏輯,非常適合初學者上手開發。
手寫程式碼從前臺貫串後臺,沒有花哨的介面和友好性的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,操作更方便哦

1542109099587

	Navicat for Mysql 
                軟體|--- 連結:https://pan.baidu.com/s/1YMXyfPWZqXrp7NOblhyGGg 
                        提取碼:qufy 
                        複製這段內容後開啟百度網盤手機App,操作更方便哦

1542109117026

  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

分享是快樂的,也見證了個人成長曆程,文章大多都是工作經驗總結以及平時學習積累,基於自身認知不足之處在所難免,也請大家指正,共同進步。

本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出, 如有問題, 可郵件([email protected])諮詢