Java web MVC – Tạo trang tìm kiếm

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 doGetdoPost có vai trò xử lý 2 phương thức GETPOST 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"%>