Java Web之網上購物系統(註冊、登錄、瀏覽商品、添加購物車)

来源:http://www.cnblogs.com/kangyaping/archive/2016/12/10/6158270.html
-Advertisement-
Play Games

眼看就要期末了,我的專業課也迎來了第二次的期末作業 《網上購物系統》。雖然老師的意圖是在鍛煉我們後臺的能力,但是想著還是不利用網上的模板,準備自己寫,以來別人寫的靜態頁看不懂,再著可以鍛煉自己做網頁的能力。所以趁有點小進展就想分享自己的作業進展狀態。下麵是我頁面運行的截圖。 可能粘貼的圖片沒有任何的 ...


眼看就要期末了,我的專業課也迎來了第二次的期末作業---------《網上購物系統》。雖然老師的意圖是在鍛煉我們後臺的能力,但是想著還是不利用網上的模板,準備自己寫,以來別人寫的靜態頁看不懂,再著可以鍛煉自己做網頁的能力。所以趁有點小進展就想分享自己的作業進展狀態。下麵是我頁面運行的截圖。

可能粘貼的圖片沒有任何的效果可言,下麵.jsp字體可以運行你想要的頁面效果。

index.jsp

register.jsp

login.jsp

product.jsp

後臺代碼:

 

User.java

 

 

package cn.edu.aynu.rjxy.bean;
/**
 * 商城用戶屬性
 * @author Administrator
 *
 */
public class User {
    private String id;
    private String username;
    private String password;
    private String name;
    private String telephone;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    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 getTelephone() {
        return telephone;
    }
    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }
    
}

 

Product.java
package cn.edu.aynu.rjxy.bean;
/**
 * 商品屬性
 * @author Administrator
 *
 */
public class Product {
    private String id;
    private String name;
    private Double price;
    private String category;
    private int pnum;
    private String imgurl;
    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 Double getPrice() {
        return price;
    }
    public void setPrice(Double price) {
        this.price = price;
    }
    public String getCategory() {
        return category;
    }
    public void setCategory(String category) {
        this.category = category;
    }
    public int getPnum() {
        return pnum;
    }
    public void setPnum(int pnum) {
        this.pnum = pnum;
    }
    public String getImgurl() {
        return imgurl;
    }
    public void setImgurl(String imgurl) {
        this.imgurl = imgurl;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    
}
UserDao.java
package cn.edu.aynu.rjxy.dao;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import cn.edu.aynu.rjxy.bean.User;
import cn.edu.aynu.rjxy.utils.JDBCUtils;

/**
 * 對User表的操作
 * @author Administrator
 *
 */
public class UserDao {
    QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
    /**
     * 添加用戶到user表
     * @throws SQLException 
     */
    public void add(User user) throws SQLException{
        String sql = "insert into user(id,username,password) values(?,?,?)";
        qr.update(sql, user.getId(),user.getUsername(),user.getPassword());
    }
    /**
     * 通過用戶名查找用戶
     * @throws SQLException 
     */
    public User findByUsername(String username) throws SQLException{
        String sql = "select * from user where username = ?";
        User user = qr.query(sql, new BeanHandler<User>(User.class),username);
        return user;
    }
}
ProductDao.java
package cn.edu.aynu.rjxy.dao;

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 cn.edu.aynu.rjxy.bean.Product;
import cn.edu.aynu.rjxy.utils.JDBCUtils;

/**
 * 對product表進行增刪改查
 * @author Administrator
 *
 */
public class ProductDao {
    QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
    //查詢所有商品
    public List<Product> findAll() throws SQLException{
        String sql = "select * from product";
        List<Product> list = qr.query(sql, new BeanListHandler<Product>(Product.class));
        return list;
    }
    //根據id查找商品
    public Product findProductById(String id) throws SQLException{
        String sql = "select * from product where id=?";
        return qr.query(sql, new BeanHandler<Product>(Product.class),id);
    }
}
UserException
package cn.edu.aynu.rjxy.exception;

public class UserException extends Exception {

    public UserException() {
        super();
    }

    public UserException(String message, Throwable cause) {
        super(message, cause);
    }

    public UserException(String message) {
        super(message);
    }

    public UserException(Throwable cause) {
        super(cause);
    }

}
UserService 
package cn.edu.aynu.rjxy.service;

import java.sql.SQLException;

import cn.edu.aynu.rjxy.bean.User;
import cn.edu.aynu.rjxy.dao.UserDao;
import cn.edu.aynu.rjxy.exception.UserException;

/**
 * 調用dao層的方法
 * @author Administrator
 *
 */
public class UserService {
    private UserDao userDao = new UserDao();
    /**
     * 用戶註冊
     * 1、檢測輸入的用戶名是否存在,如果存在拋出異常“用戶已存在”
     * 2、把輸入的用戶添加到資料庫中的user表
     * @throws UserException 
     */
    public void register(User user) throws UserException{
        try {
            //檢測用戶是否存在
            User u = userDao.findByUsername(user.getUsername());
            //如果存在拋出異常否則添加用戶到user表
            if (u != null) {
                throw new UserException("用戶已經存在");
            }else{
                userDao.add(user);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 用戶登錄
     * @throws UserException 
     */
    public User login(User user) throws UserException{
        try {
            //根據用戶名查詢user表得到user對象u
            User u = userDao.findByUsername(user.getUsername());
            /**
             * 如果u為null,說明用戶不存在,拋出異常,顯示用戶不存在
             * 否則說明用戶存在,檢測u對象中的密碼和用戶輸入的面貌是否一致
             * 如果一致,返回查詢到的u否則拋出異常,顯示密碼錯誤
             */
                if(u == null){
                    throw new UserException("用戶名不存在");
                }
                //查詢到的用戶密碼和用戶名輸入的密碼不一致
                if(!u.getPassword().equals(user.getPassword())){
                    throw new UserException("密碼錯誤");
                }
                return u;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        
    }
}
ProductService 
package cn.edu.aynu.rjxy.service;

import java.sql.SQLException;
import java.util.List;

import cn.edu.aynu.rjxy.bean.Product;
import cn.edu.aynu.rjxy.dao.ProductDao;

/**
 * 調用ProductDao的方法
 * @author Administrator
 *
 */
public class ProductService {
    private ProductDao pDao = new ProductDao();
    //查詢所有商品
    public List<Product> findAll(){
        try {
            return pDao.findAll();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    //查看某一商品
    public Product findById(String id){
        try {
            return pDao.findProductById(id);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
UserServlet 
package cn.edu.aynu.rjxy.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.edu.aynu.rjxy.bean.User;
import cn.edu.aynu.rjxy.exception.UserException;
import cn.edu.aynu.rjxy.service.UserService;
import cn.edu.aynu.rjxy.utils.CommonsUtils;
/**
 * 調用UserService裡面的方法
 * @author Administrator
 *
 */
public class UserServlet extends HttpServlet {

    private UserService userService = new UserService();
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
        
    }

    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //處理中文亂碼
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //獲取隱藏欄位method的值,並把它轉換為int型
        int method = Integer.parseInt(request.getParameter("method"));
        
        switch (method) {
        case 1:    this.register(request, response);
                break;
        case 2:    this.login(request, response);
                break;
        
        }
    }
    public void register(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        /**
         * 1、將註冊表單中的用戶信息封裝到user對象中
         * 2、將獲取的UUID值作為user對象的id
         * 3、註冊,如果發生異常,就到register.jsp頁面上顯示:用戶已存在
         *           如果成功,顯示註冊成功,3秒後就跳轉到index.jsp頁面。    
         */
        User user = CommonsUtils.toBean(request.getParameterMap(), User.class);
        user.setId(CommonsUtils.uuid());
        try {
            userService.register(user);
            request.setAttribute("msg", "註冊成功");
            request.getRequestDispatcher("/jsp/index.jsp").forward(request, response);
        } catch (UserException e) {
            request.setAttribute("msg", e.getMessage());
            //將用戶在註冊表單中輸入的信息保存在request域中,請求轉發的register.jsp,目的回顯
            request.setAttribute("user", user);
            request.getRequestDispatcher("/jsp/register.jsp").forward(request, response);
        }
    }
    
    
    
    public void login(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        /**
         * 1、將用戶登錄表單中的信息封裝成User對象
         * 2、登錄,如果發生異常,就轉發到login.jsp頁面,顯示:異常信息
         *          如果成功,就將查詢到的user對象u,存放到session域中
         *          然後轉發到shopping.jsp頁面,顯示:歡迎用戶登錄
         */
        User user = CommonsUtils.toBean(request.getParameterMap(), User.class);
        System.out.println(user+"-------->");
         try {
            User u = userService.login(user);
            System.out.println(u+">>>>");
            //將u存放到session域中
            request.getSession().setAttribute("user", u);
            request.getRequestDispatcher("/jsp/index.jsp").forward(request, response);
        } catch (UserException e) {
            request.setAttribute("msg", e.getMessage());
            request.setAttribute("user", user); //回顯
            request.getRequestDispatcher("/jsp/login.jsp").forward(request, response);
        }
    }
}
ProductServlet 
package cn.edu.aynu.rjxy.servlet;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import cn.edu.aynu.rjxy.bean.Product;
import cn.edu.aynu.rjxy.service.ProductService;
/**
 * 調用ProductService的方法
 * @author Administrator
 *
 */
public class ProductServlet extends HttpServlet {
    private ProductService ps = new ProductService();
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }

    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //處理中文亂碼
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //獲取隱藏欄位method的值,並把它轉換為int型
        int method = Integer.parseInt(request.getParameter("method"));
        
        switch (method) {
        case 1:    this.findAll(request, response);
                break;
        case 2:    this.addCart(request, response);
                break;
      
        
        }
        
    }
    //處理查詢所有商品的請求
    public void findAll(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        List<Product> list = ps.findAll();
        request.setAttribute("listProduct", list);
        //通過請求轉發將商品信息顯示在product.jsp頁面上
        request.getRequestDispatcher("/jsp/product.jsp").forward(request, response);
}
    //處理添加購物車的請求
    public void addCart(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        //獲取商品的id
        String id = request.getParameter("id");
        //得到商品
        Product p = ps.findById(id);
        //購物車是保存在session中
        HttpSession session = request.getSession();
        //從session中拿到購物車
        Map<Product,Integer> cart = (Map<Product, Integer>) session.getAttribute("cart");
        //如果cart不存在,就創建購物車
        if (cart == null) {
            cart = new HashMap<Product,Integer>();
        }
        /**
         * 遍歷Map中的所有key也就是商品對象,如果發現有的商品的id和
         * 即將加入購物車的id相同,就在原來的數量上+1
         */
        Iterator<Product> it = cart.keySet().iterator();
        boolean f = true;
        while (it.hasNext()) {
            Product pp = (Product)it.next();
            if (pp.getId().equals(p.getId())) {
                cart.put(pp, cart.get(pp)+1);
                f = false;
            }
        }
        //如果沒有發現購物車原來相同的商品,就直接加入
        if (f) {
            cart.put(p, 1);
        }
        //將cart放入session
        session.setAttribute("cart", cart);
        //重定向
        response.sendRedirect("jsp/cart.jsp");

}
   
}
CommonsUtils
package cn.edu.aynu.rjxy.utils;

import java.util.Map;
import java.util.UUID;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;

/**
 * 提供UUID,實現表單數據封裝到bean中
 * @author Administrator
 *
 */
public class CommonsUtils {
    /**
     * 返回一個UUID
     * @return
     */
    public static String uuid(){
        return UUID.randomUUID().toString().replace("-", "").toUpperCase();
        
    }
    
    /**
     * 把表單數據封裝到bean中
     */
    public static <T> T toBean(Map data, Class<T> clazz){
        try{
            T bean = clazz.newInstance();
            BeanUtils.populate(bean, data);
            return bean;
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    
    
}

JDBCUtils

package cn.edu.aynu.rjxy.utils;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * 創建資料庫連接池
 * @author Administrator
 *
 */
public class JDBCUtils {
    //讀取的是C3P0-config預設配置創建資料庫連接池對象
    private static DataSource ds = new ComboPooledDataSource();
    //獲取資料庫連接池對象
    public static DataSource getDataSource(){
        return ds;
    }
    //從池中獲取連接
    public static Connection getConnection() throws SQLException{
        return ds.getConnection();
    }    
}

c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!-- 預設配置,當使用ComboPooledDataSource無參構造器時,使用的就是這個配置 -->
    <default-config>
        <!-- 基本配置 -->
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <!-- 每次增量,當需要創建Connection對象時,一次創建幾個 -->
        <property name="acquireIncrement">3</property>
        <!-- 當創建池對象後,池中應該有幾個Connection對象 -->
        <property name="initialPoolSize">10</property>
        <!-- 池中最少Connection個數,如果少於這個值,就會創建Connection -->
        <property name="minPoolSize">2</property>
        <!-- 池中最大連接個數 -->
        <property name="maxPoolSize">10</property>
    </default-config>
</c3p0-config>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 網路方面用的比較多的庫是libevent和boost.asio,兩者都是跨平臺的。其中libevent是基於Reactor實現的,而boost.asio是基於Proactor實現的。Reactor和Proactor模式的主要區別就是真正的操作(如讀/寫)是由誰來完成的,Reactor中需要應用程式自 ...
  • 合理運用向上造型 ,能夠減少代碼量,優化代碼.總結如下: 1,向上造型 類型提升,自動類型轉換 基本類型自動類型轉換 byte → short → int → long → float → double ↑ char 引用類型自動類型轉換(向上造型) 小類型 → 自動轉換 → 大類型 //父類引用調 ...
  • 相關知識自行搜索,直接上乾貨。。。 使用的資源: nginx主伺服器一臺,nginx備伺服器一臺,使用keepalived進行宕機切換。 tomcat伺服器兩台,由nginx進行反向代理和負載均衡,此處可搭建伺服器集群。 redis伺服器一臺,用於session的分離共用。 nginx主伺服器:19 ...
  • HTTP API介面安全設計 API介面調用方式 HTTP + 請求簽名機制 HTTP + 參數簽名機制 HTTPS + 訪問令牌機制 有沒有更好的方案? OAuth授權機制 OAuth2.0服務的幾種授權流程 ... ...
  • 這個小案例主要是對transform的應用。 時鐘的3個表針分別是3個png圖片,通過setInterval來讓圖片轉動。時,分,秒的轉動角度分別是30,6,6度。 首先,通過new Date函數獲取當前時間,通過date.getSeconds(),date.getMinutes(),date.ge ...
  • js的this是什麼?關於這個東西,博客園裡面有太多的解釋了,不過,本人看了一下,感覺對this解釋的有點複雜了,因此,本人在此給this一個簡單易於理解的定義。 this其實是js的一個對象,至於是什麼對象呢?很簡單,this這個對象就是:誰調用它它就指向誰。 關於這一點,其實,博客園的文章已經說 ...
  • 想給訂閱號做一個網頁,如果進入後發現沒關註微信公眾號就提示關註。但是微信對訂閱號做了限制,無論是否認證都是不能網頁授權獲取用戶信息的,這就給網頁內直接判斷用戶是否關註該訂閱號造成了困難。 解決這個問題通過另一個網站授權或認證的服務號間接完成以下以認證的服務號為例說明下如何在網頁中判斷訂閱號是否被關註 ...
  • 一、獲取內聯樣式 在這種情況下,獲取和設置樣式只靠style屬性就可以,因為element.style屬性返回的是類似數組的一組樣式屬性及對應值,因此訪問具體樣式的時候可以採取兩種方式即“ele.style.屬性名稱”和“ele.style['屬性名稱']”。但是,要註意的是,針對css樣式里bac ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...