JavaWeb實(shí)戰(zhàn)之開發(fā)網(wǎng)上購物系統(tǒng)(超詳細(xì))
一、項(xiàng)目描述
基于B/S三層架構(gòu)設(shè)計(jì)的購物系統(tǒng),可以更好地符合"高內(nèi)聚,低耦合"的設(shè)計(jì)思想。表現(xiàn)層(UI)通過JSP在瀏覽器上實(shí)現(xiàn)界面展示,通過Servlet接受用戶請(qǐng)求并生成驗(yàn)證碼等實(shí)時(shí)信息;數(shù)據(jù)訪問層(DAL)通過JDBC對(duì)DBMS進(jìn)行訪問;二者之間的業(yè)務(wù)邏輯層(BLL)通過Service進(jìn)行連接。同時(shí)面向接口編程提高規(guī)范化。這只是我自己用兩三天的時(shí)間做的小項(xiàng)目,距離真正的購物系統(tǒng)差距還是很大的,僅供初學(xué)者參考,很多邏輯缺陷不必太糾結(jié),以后有時(shí)間會(huì)再寫一篇博客對(duì)這個(gè)項(xiàng)目進(jìn)行相關(guān)測試。
如果只需要代碼可直接通過書簽欄跳轉(zhuǎn)至相關(guān)文件。
二、項(xiàng)目演示
這是購物系統(tǒng)首頁,是仿照華為商城設(shè)計(jì)的,當(dāng)然也可以說是仿照小米商城,這二者的頁面設(shè)計(jì)并無本質(zhì)區(qū)別,具體實(shí)現(xiàn)借助于Bootstrap,商品信息通過后臺(tái)數(shù)據(jù)庫讀取,商品表見下
點(diǎn)擊任意商品進(jìn)入詳情界面
如果此時(shí)點(diǎn)擊加入購物車會(huì)調(diào)用Servlet中的doPost方法,進(jìn)而通過登陸信息是否讀取成功判斷登陸狀態(tài),如果未登錄則轉(zhuǎn)至登錄界面并提示相關(guān)信息,背景漸變色借助于webgradients選取,同時(shí)實(shí)現(xiàn)正則驗(yàn)證與驗(yàn)證碼相關(guān)功能
我們先注冊(cè)再登錄,這里注冊(cè)洛的相關(guān)信息
注冊(cè)成功
之后我們登錄并將心儀的商品加入購物車,查看購物車,這里會(huì)一致顯示當(dāng)前登錄用戶信息
提交訂單后查看訂單,這里借助jQuery做了一個(gè)下拉框,可以查看后臺(tái)數(shù)據(jù)庫關(guān)于此訂單的全部信息,這里提交訂單相當(dāng)于付款,所以未設(shè)退貨功能,因此數(shù)據(jù)刪除只能借助于后臺(tái)數(shù)據(jù)庫。
最后點(diǎn)擊注銷返回主頁
三、部分代碼
JdbcUtils.java
用于加載驅(qū)動(dòng)并獲得與數(shù)據(jù)庫的連接的工具類
package common; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class JdbcUtil { static Connection connection; public static Connection getCon() { //加載驅(qū)動(dòng) try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } String url = "jdbc:mysql://localhost:3306/shoppingsystem?characterEncoding=utf-8"; String username = "root"; String password = "123"; //獲得連接 try { connection = DriverManager.getConnection(url, username, password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return connection; } public static void closeAll(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } 、
People.java
與數(shù)據(jù)庫中用戶表相匹配的用戶類
package entity; public class People { private String id; private String password; private String name; private String email; private String address; public People() { super(); // TODO Auto-generated constructor stub } public People(String id, String password, String name, String email, String address) { super(); this.id = id; this.password = password; this.name = name; this.email = email; this.address = address; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "People [id=" + id + ", password=" + password + ", name=" + name + ", email=" + email + ", address=" + address + "]"; } }
InterfacePeopleDao.java
對(duì)用戶信息進(jìn)行相關(guān)操作的接口
package dao; import java.util.List; import entity.People; public interface InterfacePeopleDao { public abstract int insertPeople(String id, String password, String name, String email, String address); public abstract int deletePeople(String id); public abstract int updatePeople(String id, String password, String name, String email, String address); public abstract People checkPeople(String id, String password); public abstract List<People> findAllPeople(); }
PeopleDao.java
對(duì)上述接口的實(shí)現(xiàn)
package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import common.JdbcUtil; import entity.People; public class PeopleDao implements InterfacePeopleDao { private Connection connection; private PreparedStatement preparedStatement; private ResultSet resultSet; @Override public int insertPeople(String id, String password, String name, String email, String address) { String sql = "mistake"; if (id != "" && password != "" && name != "" && email != "" && address != "") { sql = "insert into people (id, password, name, email, address)" + "values('" + id + "','" + password + "','" + name + "','" + email + "','" + address + "');"; } System.out.println("insertPeople()的sql語句:" + sql); int result = 0; connection = JdbcUtil.getCon(); try { preparedStatement = connection.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } try { result = preparedStatement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } JdbcUtil.closeAll(connection, preparedStatement, resultSet); return result; } @Override public int deletePeople(String id) { // TODO Auto-generated method stub return 0; } @Override public int updatePeople(String id, String password, String name, String email, String address) { // TODO Auto-generated method stub return 0; } @Override public People checkPeople(String id, String password) { String sql = null; if (id != null && password != null) { sql = "select * from people where id = '" + id + "' and password = '" + password + "'"; } System.out.println("checkPeople()的sql語句:" + sql); People people = null; connection = JdbcUtil.getCon(); try { preparedStatement = connection.prepareStatement(sql); resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { people = new People(); people.setId(resultSet.getString(1)); people.setPassword(resultSet.getString(2)); people.setName(resultSet.getString(3)); people.setEmail(resultSet.getString(4)); people.setAddress(resultSet.getString(5)); } } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtil.closeAll(connection, preparedStatement, resultSet); } return people; } @Override public List<People> findAllPeople() { // TODO Auto-generated method stub return null; } }
InterfacPeopleService.java
在業(yè)務(wù)邏輯層中將表現(xiàn)層與數(shù)據(jù)訪問層進(jìn)行連接,由于項(xiàng)目本身并不復(fù)雜,所以只是簡單實(shí)現(xiàn)了方法傳遞
package service; import java.util.List; import entity.People; public interface InterfacePeopleService { public abstract int insertPeople(String id, String password, String name, String email, String address); public abstract int deletePeople(String id); public abstract int updatePeople(String id, String password, String name, String email, String address); public abstract People checkPeople(String id, String password); public abstract List<People> findAllPeople(); }
PeopleService.java
對(duì)上述接口的實(shí)現(xiàn)
package service; import java.util.List; import dao.InterfacePeopleDao; import dao.PeopleDao; import entity.People; public class PeopleService implements InterfacePeopleService { private InterfacePeopleDao peopleDao; public PeopleService() { peopleDao = new PeopleDao(); } @Override public int insertPeople(String id, String password, String name, String email, String address) { return peopleDao.insertPeople(id, password, name, email, address); } @Override public int deletePeople(String id) { // TODO Auto-generated method stub return 0; } @Override public int updatePeople(String id, String password, String name, String email, String address) { // TODO Auto-generated method stub return 0; } @Override public People checkPeople(String id, String password) { return peopleDao.checkPeople(id, password); } @Override public List<People> findAllPeople() { // TODO Auto-generated method stub return null; } }
CheckCode.java
在內(nèi)存中生成驗(yàn)證碼圖片并輸出到客戶端
package servlet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @WebServlet("/CheckCode") public class CheckCode extends HttpServlet { private static final long serialVersionUID = 1L; private static int width=70; private static int height=25; public CheckCode() { super(); // TODO Auto-generated constructor stub } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * request是客戶端瀏覽器發(fā)出的請(qǐng)求被封裝形成的一個(gè)HttpServletRequest公共接口類對(duì)象 * session對(duì)象存儲(chǔ)特定用戶會(huì)話所需的屬性及配置信息, 這樣當(dāng)用戶在應(yīng)用程序的Web頁之間跳轉(zhuǎn)時(shí), 存儲(chǔ)在session對(duì)象中的變量將不會(huì)丟失, 而是在整個(gè)用戶會(huì)話中一直存在下去 * getSession()與getSession(true)一樣, 獲取request對(duì)象關(guān)聯(lián)的session對(duì)象, 如果沒有session, 則返回一個(gè)新的session */ HttpSession session=request.getSession(); response.setContentType("image/jpeg");// 設(shè)置生成的文檔類型為jpg ServletOutputStream servletOutputStream = response.getOutputStream(); /*設(shè)置瀏覽器不要緩存此圖片*/ response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); /** * 創(chuàng)建內(nèi)存圖片并獲得其圖形上下文 * Image是一個(gè)抽象類, BufferedImage是其實(shí)現(xiàn)類, 是一個(gè)帶緩沖區(qū)圖像類, 主要作用是將一幅圖片加載到內(nèi)存中 * BufferedImage生成的圖片在內(nèi)存里有一個(gè)圖像緩沖區(qū), 利用這個(gè)緩沖區(qū)我們可以很方便地操作這個(gè)圖片 */ BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics graphics=image.getGraphics(); char[] rands=generCode();// 產(chǎn)生隨機(jī)的驗(yàn)證碼 drawRands(graphics, rands);// 產(chǎn)生圖像 graphics.dispose();// 結(jié)束圖像的繪制過程,完成圖像 /*將圖像輸出到客戶端*/ ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream(); ImageIO.write(image, "jpeg", byteArrayOutputStream); byte[] buf=byteArrayOutputStream.toByteArray(); response.setContentLength(buf.length); servletOutputStream.write(buf); byteArrayOutputStream.close(); servletOutputStream.close(); session.setAttribute("checkcode", new String(rands));// 將當(dāng)前的驗(yàn)證碼寫入到session中 } private char[] generCode() { //定義驗(yàn)證碼的字符表 String chars="0123456789"; char[] rands=new char[5]; for(int i=0;i<5;i++) { int rand=(int)(Math.random()*10); rands[i]=chars.charAt(rand); } return rands; } private void drawRands(Graphics g,char[] rands) { g.setColor(Color.WHITE); g.setFont(new Font(null, Font.ITALIC|Font.BOLD, 18)); /*在不同高度上輸出驗(yàn)證碼的每個(gè)字符*/ g.drawString("" + rands[0], 0, 18); g.drawString("" + rands[1], 14, 18); g.drawString("" + rands[2], 28, 18); g.drawString("" + rands[3], 42, 18); g.drawString("" + rands[4], 56, 18); System.out.print("當(dāng)前驗(yàn)證碼:"); System.out.println(rands); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
到此這篇關(guān)于Java實(shí)戰(zhàn)之利用JavaWeb開發(fā)購物系統(tǒng)(超詳細(xì))的文章就介紹到這了,更多相關(guān)JavaWeb購物系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 工程的創(chuàng)建和運(yùn)行(圖文)
這篇文章主要介紹了Spring Boot 工程的創(chuàng)建和運(yùn)行(圖文),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02Java并發(fā)編程中的生產(chǎn)者與消費(fèi)者模型簡述
這篇文章主要介紹了Java并發(fā)編程中的生產(chǎn)者與消費(fèi)者模型簡述,多線程并發(fā)是Java編程中最終要的部分之一,需要的朋友可以參考下2015-07-07springcloud?gateway實(shí)現(xiàn)簡易版灰度路由步驟詳解
這篇文章主要為大家介紹了springcloud?gateway實(shí)現(xiàn)簡易版灰度路由步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Java 創(chuàng)建線程的兩個(gè)方法詳解及實(shí)例
這篇文章主要介紹了Java 創(chuàng)建線程的兩個(gè)方法詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03SpringBoot 過濾器、攔截器、監(jiān)聽器對(duì)比及使用場景分析
過濾器是處于客戶端和服務(wù)器資源文件之間的一道過濾網(wǎng),這篇文章主要介紹了SpringBoot 過濾器、攔截器、監(jiān)聽器對(duì)比及使用場景分析,需要的朋友可以參考下2021-05-05