Thứ Hai, 14 tháng 7, 2014

JSP Model 2

Sau khi nhận ra sự bất cập của JSP Model 1 thì Sun Micro System đã cung cấp Model 2.
Model này gần giống với mô hình MVC.

Ở mô hình này thì các Servlet được đóng vai trò như các controller và có nhiệm vụ lấy và xử lý tất cả các thông tin về trình duyệt, trong quá trình xử lý nếu như cần xử dụng thông tin từ Java Bean thì nó sẽ khởi tạo đối tượng của Java Bean và sau đó dữ liệu đã được xử lý sẽ được truyền qua cho trang JSP để hiển thị. Lúc này thì trang JSP chỉ đóng vai trò là hiển thị thông tin mà các Servlet truyền sang qua forward.

Ở trong mô hình này thì phần model sẽ có nhiệm vụ lưu trữ thông tin hoặc chui xuống cơ sở dữ liệu để lấy về dữ liệu phục vụ cho việc xử lý.



Ưu điểm:
- Giúp cho việc tái sử dụng code trở nên dễ dàng hơn.
- Giúp cho dự án có khả năng mở rộng cao hơn
- Một dự án có thể thể được phát triển bởi nhiều đội, nhóm độc lập. Ví dụ như nhóm phát triên giao diện thì không cần quan tâm đến code Java, còn người làm coder thì không cần quan tâm đến việc phát triển giao diện.
- Do cấu trúc có thể tái sử dụng code nên sẽ nhẹ và chạy mượt hơn, tránh được việc chồng chéo, khai báo code nhiều lần.

- Nhược điểm:
- Chỉ phù hợp cho việc phát triển những ứng dụng lớn do cấu trúc phức tạp.

Demo

Đầu tiên các bạn tạo một project mới với tên Module1_MVC . Sau đó chèn thư viện sqljdbc4.jar (thư viện chứa driver kết nối cơ sở dữ liệu) và jstl 1.2.2.jar (là thư viện cho phép dùng foreach trang trang jsp).



Tiếp theo ta tạo 2 trang jsp là index.jsp và ViewAllProduct.jsp với trang index.jsp là trang chứa đường dẫn đến trang ViewAllProduct.jsp.

Bước tiếp theo ta tạo một lớp Java là Product đặt nó trong package awasj.entity. và viết các dòng mã sau vào trang này:


package awasj.entity;

/**
 *
 * @author Nguyen Minh An
 */
public class Product {
    private int pId;
    private String pName;
    private String pType;
    private String pPrice;

    public Product(int pId, String pName, String pType, String pPrice) {
        this.pId = pId;
        this.pName = pName;
        this.pType = pType;
        this.pPrice = pPrice;
    }

    public Product(String pName, String pType, String pPrice) {
        this.pName = pName;
        this.pType = pType;
        this.pPrice = pPrice;
    }

    
    public int getpId() {
        return pId;
    }

    public void setpId(int pId) {
        this.pId = pId;
    }

    public String getpName() {
        return pName;
    }

    public void setpName(String pName) {
        this.pName = pName;
    }

    public String getpType() {
        return pType;
    }

    public void setpType(String pType) {
        this.pType = pType;
    }

    public String getpPrice() {
        return pPrice;
    }

    public void setpPrice(String pPrice) {
        this.pPrice = pPrice;
    }
}

Tiếp đó ta tạo một lớp java tên là DataAccess và đặt nó trong package awasj.DBConnection. Ta viết vào đó như dưới đây:

package DBConnection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Nguyen Minh An
 */
public class DataAccess {

    public static Connection getConnection() throws SQLException {
        String url = "jdbc:sqlserver://localhost:1433;databaseName=ORDER_PRODUCT";
        String username = "LUCKY";
        String password = "123456";

        try {
            Connection conn = null;
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            conn = DriverManager.getConnection(url, username, password);
            return conn;
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;

    }
}

Ta cần phải tạo một lớp chứa nghiệp vụ Bussiness, ta tạo một lớp với tên là ProductManagement và code như dưới đây:


public class ProductManagement {
    public static List<Product> getAllProduct() {
        List<Product> list = new ArrayList<>();
        try {
            Connection conn = DataAccess.getConnection();
            PreparedStatement ps = conn.prepareCall("select * from PRODUCT");
            ResultSet res = ps.executeQuery();
            while (res.next()) {
                int pId = res.getInt("pId");
                String pName = res.getString("pName");
                String pType = res.getString("pType");
                String pPrice = res.getString("pPrice");
                Product p = new Product(pId, pName, pType, pPrice);
                list.add(p);
            }
            return list;
        } catch (Exception ex) {
            Logger.getLogger(ProductManagement.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }


Và cuối cùng ta tạo một servlet với tên là ViewAllProduct (chính là tên servlet trong thẻ a nằm trong trang index.jsp). ở trang này ta sẽ lấy lên danh sách các sản phẩm và đưa chúng vào request sau đó gửi sang trang ViewAllProduct.jsp qua RequestDisparcher.

        List<Product> listpr = ProductManagement.getAllProduct();
        request.setAttribute("listproduct", listpr);

        RequestDispatcher rd = request.getRequestDispatcher("ViewAllProduct.jsp");
        rd.forward(request, response);



Và cuối cùng ở trang ViewAllProduct.jsp ta code như sau vào phần body của trang.

<h1>All Product</h1>

        <table>
            <tr>
                <td>pId</td>
                <td>Tên sản phẩm</td>
                <td>hãng sản phẩm</td>
                <td>Giá sản phẩm</td>
            </tr>
            <c:forEach items="${listproduct}" var="p">
                <tr>
                    <td><c:out value="${p.pId}" /></td>
                    <td><c:out value="${p.pName}"/></td>
                    <td><c:out value="${p.pType}"/></td>
                    <td><c:out value="${p.pPrice}"/></td>
                    <td><a href="AddOrder">Add Product</a></td>
                </tr>
            </c:forEach>
        </table>


Các bạn có thể download demo tại đây



Không có nhận xét nào:

Đăng nhận xét