Web bán hàng bằng Spring MVC – Hiển thị danh mục sản phẩm

Tiếp tục loạt bài hướng dẫn xây dựng Web bán hàng bằng Spring MVC thì Team Việt Dev sẽ trình bày phần hiển thị danh mục sản phẩm từ cơ sở dữ liệu lên website.

Phần trước chúng ta đã hoàn thành phần thiết kế giao diện trang bán hàng, bây giờ tiếp tục là phần hiển thị danh mục sản phẩm từ cơ sở dữ liệu lên giao diện web.

Yêu cầu:

Bước 1: Đầu tiên chúng ta sẽ thiết kế các lớp và bảng cơ sở dữ liệu cần thiết. Lớp danh mục (category) chứa các thông tin về loại danh mục và lớp sản phẩm (product) chứa thông tin về sản phẩm như giá bán, giảm giá…

Lớp danh mục:

package com.teamvietdev.model;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;

/**
 *
 * @author TVD
 */
@Entity(name = "category")
public class Category implements Serializable {

    @Id
    @GeneratedValue
    private long categoryId;
    private String categoryName;
    private String categoryUrl;
    private boolean categoryStatus;
    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "categoryId")
    private List<Product> listProduct;

    // get & set
}

Lớp sản phẩm:

package com.teamvietdev.model;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

/**
 *
 * @author TVD
 */
@Entity(name = "product")
public class Product implements Serializable {

    @Id
    @GeneratedValue
    private long productId;
    @ManyToOne
    @JoinColumn(name = "categoryId")
    private Category category;
    private String productName;
    private String productImage;
    private double productPrice;
    private String productUrl;
    private int productSale;
    private int productView;
    private String productDescription;
    private boolean productStatus;

    // get & set

}

Bước 2: Sử dụng Hibernate trong kết nối CSDL.

Tập tin hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/db_vnshop?createDatabaseIfNotExist=true</property>
        <property name="hibernate.connection.useUnicode">true</property>
        <property name="hibernate.connection.characterEncoding">UTF-8</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="hibernate.show_sql">false</property>
        <property name="hibernate.enable_lazy_load_no_trans">true</property>
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.max_size">20</property>
        <property name="hibernate.c3p0.timeout">300</property>
        <property name="hibernate.c3p0.max_statements">50</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>
    
        <mapping class="com.teamvietdev.model.Product"/>
        <mapping class="com.teamvietdev.model.Category"/>
        
    </session-factory>
</hibernate-configuration>

Tập tin HibernateUtil.java

package com.teamvietdev.util;

import org.hibernate.HibernateException;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 *
 * @author OSSTECH
 */
public class HibernateUtil {

    private static SessionFactory sessionFactory = null;
    private static Configuration cfg= null;

    static {
        try {
            cfg = new Configuration();
            cfg.configure("/com/teamvietdev/util/hibernate.cfg.xml");
            sessionFactory = cfg.buildSessionFactory();
        } catch (HibernateException ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    
}

Viết các phương thức CRUD của danh mục và sản phẩm.

Lớp CategoryDAO.java:

package com.teamvietdev.dao;

import com.teamvietdev.model.Category;
import java.util.List;

/**
 *
 * @author TVD
 */
public interface CategoryDAO {

    // create
    public boolean create(Category object);

    // update
    public boolean update(Category object);

    // delete
    public boolean delete(Category object);

    // find by id
    public Category findById(int categoryId);

    // load list category
    public List<Category> getAll();

}

Lớp CategoryDAOImpl.java:

package com.teamvietdev.dao;

import com.teamvietdev.model.Category;
import com.teamvietdev.util.HibernateUtil;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.stereotype.Repository;

/**
 *
 * @author TVD
 */
@Repository
public class CategoryDAOImpl implements CategoryDAO {

    @Override
    public boolean create(Category object) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.save(object);
            transaction.commit();
            return true;
        } catch (Exception ex) {
            if (transaction != null) {
                transaction.rollback();
            }
            ex.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
        return false;
    }

    @Override
    public boolean update(Category object) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.update(object);
            transaction.commit();
            return true;
        } catch (Exception ex) {
            if (transaction != null) {
                transaction.rollback();
            }
            ex.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
        return false;
    }

    @Override
    public boolean delete(Category object) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            session.delete(object);
            transaction.commit();
            return true;
        } catch (Exception ex) {
            if (transaction != null) {
                transaction.rollback();
            }
            ex.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
        return false;
    }

    @Override
    public Category findById(int categoryId) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            Query query = session.createQuery("FROM category WHERE category_id = :categoryId");
            query.setInteger("categoryId", categoryId);
            Category obj = (Category) query.uniqueResult();
            transaction.commit();
            return obj;
        } catch (Exception ex) {
            if (transaction != null) {
                transaction.rollback();
            }
            ex.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
        return null;
    }

    @Override
    public List<Category> getAll() {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            Query query = session.createQuery("FROM category");
            List<Category> list = query.list();
            transaction.commit();
            return list;
        } catch (Exception ex) {
            if (transaction != null) {
                transaction.rollback();
            }
            ex.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
        return null;
    }
    
}

Lớp CategoryService.java:

package com.teamvietdev.service;

import com.teamvietdev.model.Category;
import java.util.List;

/**
 *
 * @author TVD
 */
public interface CategoryService {

    // create
    public boolean create(Category object);

    // update
    public boolean update(Category object);

    // delete
    public boolean delete(Category object);

    // find by id
    public Category findById(int categoryId);

    // load list category
    public List<Category> getAll();

}

Lớp CategoryServiceImpl.java:

package com.teamvietdev.service;

import com.teamvietdev.dao.CategoryDAO;
import com.teamvietdev.model.Category;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 *
 * @author TVD
 */
@Service
public class CategoryServiceImpl implements CategoryService {

    @Autowired
    private CategoryDAO categoryDAO;

    @Override
    public boolean create(Category object) {
        return categoryDAO.create(object);
    }

    @Override
    public boolean update(Category object) {
        return categoryDAO.update(object);
    }

    @Override
    public boolean delete(Category object) {
        return categoryDAO.delete(object);
    }

    @Override
    public Category findById(int categoryId) {
        return categoryDAO.findById(categoryId);
    }

    @Override
    public List<Category> getAll() {
        return categoryDAO.getAll();
    }

}

Vào tập tin dispatcher-servlet.xml và thêm đoạn mã sau:

<bean id="categoryDAO" class="com.teamvietdev.dao.CategoryDAOImpl" />
<bean id="categoryService" class="com.teamvietdev.service.CategoryServiceImpl" />

Cấu trúc thư mục bố trí như sau:

Web bán hàng bằng Spring MVC - Hiển thị danh mục sản phẩm

Bước 3: Bây giờ chúng ta sẽ hiển thị danh mục sản phẩm, bạn mở lớp ControllerPages.java

package com.teamvietdev.controller;

import com.teamvietdev.service.CategoryService;
import com.teamvietdev.service.ProductService;
import java.text.Normalizer;
import java.util.regex.Pattern;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 *
 * @author TVD
 */
@Controller
@RequestMapping(value = "")
public class ControllerPages {

    @Autowired
    private CategoryService categoryService;
    @Autowired
    private ProductService productService;

    @RequestMapping(value = "home.html", method = RequestMethod.GET)
    public String viewHome(ModelMap mm) {
        mm.put("listCategory", categoryService.getAll());
        return "pages/index";
    }

}

Hiển thị danh mục sản phẩm, mở tập tin header.jsp và sửa mã thành:

<li><a href="${pageContext.request.contextPath}/shop.html">Shop</a>
     <ul class="drop">
          <c:forEach var="item" items="${listCategory}">
                <li><a href="${pageContext.request.contextPath}/category/${item.categoryUrl}/${item.categoryId}.html">${item.categoryName}</a></li>
          </c:forEach>
     </ul>
</li>

Kết quả sau khi thực hiện:

Web bán hàng bằng Spring MVC - Hiển thị danh mục sản phẩm

Tải mã nguồn tại đây: https://mshares.co/file/udFsdQC

Lời kết: Trong thời gian tới Team Việt Dev sẽ tiếp tục chia sẻ thêm nhiều bài viết trong loạt bài hướng dẫn xây dựng web bán hàng bằng Spring MVC… miễn phí đến bạn đọc, các bạn nhớ theo dõi kênh để có được những chia sẻ mới nhất.

(Tác giả: Team Việt Dev)

3 Comments

  1. hùng 16/03/2022 Reply
  2. hùng 16/03/2022 Reply

Bình luận