1. Phân tích chức năng
Trang tìm kiếm là trang hiển thị thông tin các sản phẩm được tìm kiếm gần đúng theo tên
2. Thực thi
B1: Tạo servlet SearchServlet kế thừa lớp BaseServlet đóng vai trò controller cho trang tìm kiếm sản phẩm
HomeServlet có 2 phương thức doGet và doPost có vai trò xử lý 2 phương thức GET và POST của http
Với phương thức doGet sẽ sử dụng hàm getRequestDispatch nhúng giao diện ở thư mục view với mục đích hiển thị nội dung.
Để đổ dữ liệu từ database chúng ta cần lấy dữ liệu từ model ở mục controller này
package binh.dev; import java.io.IOException; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.List; import binh.dev.data.dao.DatabaseDao; import binh.dev.data.dao.ProductDao; import binh.dev.data.model.Product; /** * * @author binhdev */ public class SearchServlet extends BaseServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { super.doGet(request, response); String key = request.getParameter("key"); int categoryId = Integer.parseInt(request.getParameter("categoryId")); // int categoryId = Integer.parseInt(request.getParameter("categoryId")); ProductDao productDao = DatabaseDao.getInstance().getProductDao(); // Tránh trường hợp rỗng-- báo lỗi List<Product> productList = new ArrayList<Product>(); if (categoryId == 0) { productList = productDao.findByName(key); } else { productList = productDao.findByCategoryOfName(categoryId, key); } request.setAttribute("productList", productList); request.getRequestDispatcher("category.jsp").include(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
B2: Tạo tập tin search.jsp để đổ dữ liệu ra giao diện ở mục view/search.jsp
Sử dụng thư viện JSTL để ứng dụng Template Engine
<%@include file="./inc/header.jsp"%> <div id=app__container""> <div class="top-arrival container"> <!-- top new arrivals --> <div class="row"> <h1 class="heading-title">Product List</h1> </div> <!-- heading product --> <div class="heading-bar"> <span class="heading-desc"> Browse the collection of our best selling and top interesting products. </span> <ul class="heading-list"> <li class="heading-item"> <span class="heading-text heading-text-color"> New arrivals</span> </li> <li class="heading-item"> <span class="heading-text"> Featured </span> </li> </ul> </div> <!-- top new product --> <div class="row"> <c:forEach items="${productList}" var="product"> <div class="col-md-3 col-sm-6 col-sx-12"> <div class="product-item"> <div class="product-image-wrap"> <a href="ProductDetailServlet?productId=${product.id}" class="product-image-wrap-link"> <img src="${product.thumbnail}" alt="" class="product-image"> </a> <ul class="product-icon"> <li> <a href="ProductDetailServlet?productId=${product.id}"><i class="fa-regular fa-eye"></i></a></li> <li> <a href="CartServlet"><i class="fa-solid fa-cart-shopping"></i></a></li> <li> <a href=""><i class="fa-solid fa-arrows-rotate"></i></a></li> <li> <a href=""><i class="fa-regular fa-heart"></i></a></li> </ul> </div> <form class="product-footer" action="CartServlet" method="post"> <input type="hidden" name="action" value="create"/> <input type="hidden" name="quantity" value="1" min="1" /> <input type="hidden" name="productId" value="${product.id}"/> <input type="hidden" name="productPrice" value="${product.price}"/> <span class="product-short-desc">${product.description}</span> <h1 class="product-title">${product.name}</h1> <div class="product-price"> <span class="product-price-1"> <fmt:setLocale value = "en_US"/> <fmt:formatNumber type="currency" value = "${product.price}" /> </span> </div> <button type="submit" class="_btn _btn-product">Add to cart</button> </form> </div> </div> </c:forEach> </div> </div> </div> <%@include file="./inc/footer.jsp"%>