Thứ Năm, 31 tháng 7, 2014

Validation using Handler Errors

I. Nội dung chính.

- Handling Errors.
- Validator

II. Handling Errors.

a. Trường hợp parsers không có validator.

- Khi xảy ra lỗi thì parser sẽ xét xem lỗi đó có cần thiết để parser phải ngừng việc quét dữ liệu không?
+ Nếu như có thì parser sẽ ném ra một ngoại lệ.
+ Còn nếu như không cần thiết phải dừng việc phân tích lại thì Default Error Handler sẽ sinh ra một ngoại lệ.

Các bước xử lý sẽ như hình dưới:


b. Trường hợp sử dụng validator cho parser

- Các bước xử lý:

Đầu tiên một SAXParser sẽ được tạo ra à  tiếp theo đó sẽ được cài đặt chế độ validation vào parser đó à Tiếp đó là cài đặt một file XML Schema để làm nhiệm vụ validation à Tạo ra và đăng kí một ErrorHandler cùng với đối tượng của interface SAXParser à Tiến hành phân tích tài liệu XML để validate cái XML schema cùng với nó à Và cuối cùng các lỗi sẽ được tạo ra bởi parser được đăng kí cùng ErrorHandler và nhận được thông tin về lỗi từ đó.


Demo:

Đầu tiên ta tạo một project với tên là Demo_Validation_Handler. Tiếp đó ta tạo một class với tên là ValidationHandler cho nó extend DefaultHandler sau đó override 3 method là : fatalError, error, warning như dưới đây:

package demo_validation_handler;

import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * @author Nguyen Minh An
 */
public class ValidationHandler extends DefaultHandler {

    @Override
    public void fatalError(SAXParseException saxpe) throws SAXException {
        System.out.println("Fatal Error at: " + saxpe.getLineNumber() + saxpe.getMessage());
    }

    @Override
    public void error(SAXParseException saxpe) throws SAXException {
        System.out.println("Error at: " + saxpe.getLineNumber() + saxpe.getMessage());
    }

    @Override
    public void warning(SAXParseException saxpe) throws SAXException {
        System.out.println("Warning at: " + saxpe.getLineNumber() + saxpe.getMessage());
    }

}

Tiếp đó ta tạo file xml với tên tomcat-users.xml và tạo ra nội dung như dưới đây:

<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users>
    <role rolename="tomcat"/>
    <role rolename="role1"/>
    <user username="tomcat" password="tomcat" roles="tomcat"/>
    <user username="both" password="tomcat" roles="tomcat,role1"/>
    <user username="role1" password="tomcat" roles="role1"/>
   
    <user password="admin" role="manager-script,admin" username="admin">
</tomcat-users>


Như ta đã thấy thì thẻ <user> cuối cùng bị thiếu dấu "/" cho nên thẻ này không hợp lệ. Tiếp đó ta viết vào phương thức chứa hàm main như dưới:


   public static void main(String[] args) {
        SAXParserFactory fac = SAXParserFactory.newInstance();
        try {
            SAXParser parser = fac.newSAXParser();

            parser.parse("D:\\NetBean\\Demo_Validation_Handler\\src\\tomcat-users.xml", new ValidationHandler());
        } catch (IOException ex) {
            Logger.getLogger(Demo_Validation_Handler.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParserConfigurationException | SAXException ex) {
            ex.getMessage();
        }

    }

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

Apply Filter Demo

Tạo một ứng dụng với tên Demo_Filter, sau đó ta tạo ra một file xml với tên Employee.xml như dưới:

<?xml version="1.0" encoding="UTF-8"?>
<personal>
    <employee emid="332" depid="24" shift="night" status="contact">
        Jenny Berman
    </employee>
    <employee emid="994" depid="24" shift="day" status="donotcontact">
        Andrew Fule
    </employee>
    <employee emid="948" depid="3" shift="night" status="contact">
        Anna Bangle
    </employee>
    <employee emid="1032" depid="3" shift="day" status="contact">
        David Baines
    </employee>
</personal>

Sau đó ta tạo một lớp Java với tên JavaFilter và cho nó extends XMLFilterImpl sau đó viết vào đoạn code như bên dưới:



package filter_demo;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * @author Nguyen Minh An
 */
public class DataParser extends DefaultHandler {

    private boolean valueIsProcessed;

    @Override
    public void startElement(String string, String string1, String string2, Attributes atrbts) throws SAXException {
        if (string1.equals("employee")) {
            if (atrbts.getValue("status").equals("contact") && atrbts.getValue("depid").equals("24")) {
                valueIsProcessed = true;
            }
        }
        super.startElement(string, string1, string2, atrbts);
    }

    @Override
    public void characters(char[] chars, int i, int i1) throws SAXException {
        if (valueIsProcessed == true) {
            System.out.println("Name:" + new String(chars, i, i1));
            valueIsProcessed = false;
        }
    }

}

Và cuối cùng ở hàm main ta khai báo như sau:

public static void main(String[] args) {
        try {
            XMLReader reader = XMLReaderFactory.createXMLReader();
            DataFilter df = new DataFilter();
            df.setParent(reader);
            df.setContentHandler(new DataParser());

            df.parse("D:\\NetBean\\Filter_Demo\\src\\Employee.xml");
        } catch (IOException | SAXException ex) {
            Logger.getLogger(Filter_Demo.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

Vậy là chúng ta đã tạo xong demo. Các bạn có thể download source code tại đây


Nhận xét:
- Sử dụng filter khá dễ dàng.
- Khi sử dụng filter sẽ giúp cho các parser được xử lý nhanh hơn do đã được filter xử lý trước.
- Ta có thể chỉnh sửa nguồn dữ liệu của file xml mà không làm thay đổi file gốc.

Thứ Ba, 29 tháng 7, 2014

Advanced Of Topic

I. Các phần chính

- Xử lý các lỗi.
- Sử dụng Interface DTDHandler.
- Lexical Events and Entity Resolver Interface.
- SAX Filters.

II. Chi tiết.

1. Xử lý các lỗi.

Khi mà parser làm việc không được cấu hình để validate dữ liệu thì trong quá trình quét file xml nếu bị chặn lại bởi một lỗi thì ứng dụng sẽ ngay lập tức ném ra một ngoại lệ. Nếu như ứng dụng không ném ra ngoại lệ thì Default Error - Event  Handler sẽ ném ra một ngoại lệ. 

2.  DTDHandler (Trình xử lý DTD)

Dùng để nhận về các thông tin về các notation hay các thực thể mà parser không quét được trong một ứng dụng dựa trên SAX.


3. Lexical Events

- Interface Lexical Events dùng để nhận về các comment, CDATA section, DTD, và các thành phần đã được quét. 

- Các method của Lexical Event

4. Entity Resolver Interface.

- Là một interface cơ bản dùng để giải quyết các thực thể (entity). Phương thức resolveEntity cho phép ứng dụng giải quyết các external entity (các entity mà có tham chiếu đến file bên ngoài).

5. Filter (Bộ lọc)

Có nhiệm vụ đọc qua trước file xml trước khi nó đến với parser, file xml sau khi đi qua filter sẽ có thể bị thay đổi về nội dung mà không làm ảnh hưởng đến tài nguyên ở nguồn cung cấp.





Nhận xét.

- Đối với HandlingErrors là một thứ khá hay được tích hợp, vì không phải parser nào cũng được config để validate dữ liệu, và HandlingErrors sẽ là người ném ra ngoại lệ khi gặp lỗi.

-  DTD Handler dùng để xử lý các DTD một cách nhanh chóng, và dễ dàng qua việc override các phương thức như notationDecl() và unparsedEntityDecl()

-Filter sẽ giúp cho parser xử lý nhanh hơn và tránh được các lỗi không mong muốn vì đã được filter lọc khi nguồn dữ liệu được parser quét.


Thứ Hai, 28 tháng 7, 2014

Working with SAX

Practise1 - Module 2.

Đề bài: Create a program to accept the tomcat-users.xml file as a command line parameter and count the number of users defined in this configuration file. At the end of processing, it requires to print the number of users on the console.


Đầu tiên ta tạo một ứng dụng console java bình thường. Tiếp đó ta tạo file xml với tên tomcat-user.xml như dưới đây.


<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users>
    <role rolename="tomcat"/>
    <role rolename="role1"/>
    <user username="tomcat" password="tomcat" roles="tomcat"/>
    <user username="both" password="tomcat" roles="tomcat,role1"/>
    <user username="role1" password="tomcat" roles="role1"/>
    
    <user password="admin" role="manager-script,admin" username="admin"/>

</tomcat-users>


Tiếp đó ta sẽ tạo một lớp java để làm nhiệm vụ xử lý các nhiệm vụ như việc đọc thông tin từ file xml, lớp này sẽ đón vai trò là một handler.

package pm.handler;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * @author Nguyen Minh An
 */
public class CountNumberOfTagHandler extends DefaultHandler{
    private int demSoTags; // Biến toàn cục dùng để lưu lại thông tin số tag có trong file xml

    @Override
    public void startDocument() throws SAXException {
        demSoTags = 0; //Khi bắt đầu đọc tài liệu ta sẽ khởi tạo giá trị của biến demSoTags = 0;
    }

    @Override
    public void startElement(String string, String string1, String string2, Attributes atrbts) throws SAXException {
        demSoTags++; // Với mỗi lần parser bắt đầu đọc một element thì ta sẽ tăng thêm một giá trị cho biến demSoTags
    }

    @Override
    public void endDocument() throws SAXException {
        //Khi kết thúc việc đọc tài liệu này ta không làm gì cả nên method này ta sẽ để trống.
    }

    public int getDemSoTags() {
        return demSoTags; // Phương thức này sẽ lấy về giá trị của biến demSoTags
    }


}

Trong phương thức main của ứng dụng ta sẽ viết các đoạn mã sau:

package practice1_module2;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import pm.handler.CountNumberOfTagHandler;

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

    public static void main(String[] args) {
        try {
/** Tạo ra một đối tượng của lớp SAXParserFactory */
            SAXParserFactory spf = SAXParserFactory.newInstance();

/**Tạo ra một đối tượng SAXParser*/
            SAXParser sp = spf.newSAXParser();

/**Tạo ra đối tượng của lớp CountNumberOfTaghandler*/
 CountNumberOfTagHandler countNumberOfTagHandler = new CountNumberOfTagHandler();

/**Tiến hành quét file xml bằng đối tượng của lớp handler*/
 sp.parse("D:\\NetBean\\Practice1_Module2\\src\\tomcat-users.xml", countNumberOfTagHandler);

/**In ra màn hình kết quả đếm được*/
            System.out.println(countNumberOfTagHandler.getDemSoTags());
        } catch (Exception ex) {
            Logger.getLogger(Practice1_Module2.class.getName()).log(Level.SEVERE, null, ex);
        }

    }


}

Practice 2 - Module 2.

Đề bài:

Create the student.xml file that stores a list of registered students. Write a program for printing the name and ID of all registered students provided in student.xml. Make necessary arrangements to accept a command line parameter from the user to specify the name of the XML document that holds the list of registered students.

Đầu tiên ta tạo một project java với tên Practice2_Module2. Tiếp đó tạo ra một file xml như sau:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <student id="1" name="Nguyen Minh An" />    
    <student id="2" name="Nguyễn Tuấn Anh"/>
    <student id="3" name="Nguyễn Việt Hoàng" />
    <student id="4" name="Nguyễn Hoài Linh" />
    <student id="5" name="Nguyễn Thu Hằng" />

</root>

Tiếp đó là một lớp java với tên ReadIdAndNameOfStudent.java và viết vào đoạn code dưới:

package pm2.handler;

import java.util.LinkedList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import pm2.entity.Student;

/**
 *
 * @author Nguyen Minh An
 */
public class ReadIdAndNameOfStudent extends DefaultHandler {

    private int count;
    private List<Student> listStudent = new LinkedList<>();;
    

    @Override
    public void startDocument() throws SAXException {
        count = 0;
    }

    public int getCount() {
        return count;
    }
    
    
    @Override
    public void startElement(String string, String string1, String string2, Attributes atrbts) throws SAXException {
        String name = atrbts.getValue("name");
        String id = atrbts.getValue("id");
        Student s = new Student(id, name);
        listStudent.add(s);
        count++;
    }
   
    
    
    public List<Student> getListStudent() {
        return listStudent;
    }

}

Ở lớp chứa hàm main ta viết code như sau:



package practice2_module2;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import pm2.entity.Student;
import pm2.handler.ReadIdAndNameOfStudent;

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

    public static void main(String[] args) {
        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            ReadIdAndNameOfStudent readIdAndNameOfStudent = new ReadIdAndNameOfStudent();
            sp.parse("D:\\NetBean\\Practice2_Module2\\src\\Student.xml",readIdAndNameOfStudent );
            System.out.println(readIdAndNameOfStudent.getCount());
            for (Student s : readIdAndNameOfStudent.getListStudent()) {
                System.out.println("Id:" + s.getId());
                System.out.println("Name:" +s.getName());
            }
            
        } catch (Exception ex) {
            Logger.getLogger(Practice2_Module2.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
}

Practice3 - Module2

Đề bài:
Write a program which demonstrates the use of SAX parser for a simple search in XML document. The program searches a specified user in the tomcatusers.xml  file  and  prints  an  the  role of the given user on search completion. This program should include two command-line parameters. The first parameter specifies the tomcat-users.xml  file  and  the  second parameter specifies the user name to search in the configuration file.

Đầu tiên tạo lớp để xử lý với tên SearchingHandler như dưới:


package pm.handler;

import java.util.LinkedList;
import java.util.List;
import javax.xml.stream.events.StartDocument;
import javax.xml.stream.events.StartElement;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * @author Nguyen Minh An
 */
public class SearchingHandler extends DefaultHandler {

    private final List<String> listUsername = new LinkedList<>();

    @Override
    public void startDocument() throws SAXException {

    }

    @Override
    public void startElement(String string, String string1, String string2, Attributes atrbts) throws SAXException {
        String username = atrbts.getValue("username");
        if (username != null) {
            listUsername.add(username);
        }

    }

    public String SearchUsername(String username) {
        List<String> list = new LinkedList<>();
        for (String s : listUsername) {
            if (s.contains(username)) {
                return s;
            }
        }
        return "";
    }


}

Tạo một file xml với tên tomcat-users.xml:

<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users>
    <role rolename="tomcat"/>
    <role rolename="role1"/>
    <user username="tomcat" password="tomcat" roles="tomcat"/>
    <user username="both" password="tomcat" roles="tomcat,role1"/>
    <user username="role1" password="tomcat" roles="role1"/>
    
    <user password="admin" role="manager-script,admin" username="admin"/>

</tomcat-users>


Lớp có hàm main:


package practice3_module2;

import java.io.IOException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import pm.handler.SearchingHandler;

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

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();

            Scanner scan = new Scanner(System.in);
            System.out.println("Nhap vao ten file:");
            String filename = scan.nextLine();

            SearchingHandler sh = new SearchingHandler();
            sp.parse("D:\\NetBean\\Practice3_Module2\\src\\db\\" + filename, sh);
            
            System.out.println("Nhap vao username");
            String username = scan.nextLine();

//            for (String string : sh.SearchUsername(username)) {
//                System.out.println(string);
//            }
            System.out.println(sh.SearchUsername(username));

        } catch (ParserConfigurationException | SAXException | IOException ex) {
            Logger.getLogger(Practice3_Module2.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


}

Source Code



Giới thiệu tổng quan về JAXP

I. Các thư viện có trong JAXP.

1. Parsing XML
- Parsing XML là việc quét, xử lý và điều khiên file XML. Để có thể làm được những điều này ta cần sử dụng đến Parsers.

- XML parsers là một chương trình mà có thể xử lý, quét các dữ liệu có trong file XML. Với chương trình này chúng ta có thể: Đọc, xoá, sửa

2. Các ưu điểm của XML.
- Nó là một ngôn ngữ độc lập, không phụ thuộc vào các ngôn ngữ, nó là một cái chuẩn để các ngôn ngữ có thể hiểu và giao tiếp được với nhau.
- Nó không phụ thuộc vào mã nguồn.
- Chính vì sự không phụ thuộc vào ngôn ngữ và mã nguồn vì thế XML vô cùng linh hoạt và phù hợp cho các dự án khác nhau từ web app cho đến desktop app.

II. Các phương pháp dùng để đọc file XML

Có nhiều trường phái để quét file XML nhưng thường có thể được chia làm 2 loại:
* Event-Based Parsers (eg. SAX)
- Trường phái này Parser sẽ quét trên sự kiện xảy ra. Khi parser gặp một tài liệu thì nó sẽ phải xử lý như thế nào, khi gặp một thuộc tính thì nó sẽ phải xử lý như thế nào.
* Object-Based Parsers (eg. DOM)
- Trong trường phái này thì Parser sẽ tiến hành chuyển đổi file XML đó sang object và xử lý tài liệu đó.

SO SÁNH

- SAX có thể parse những tệp tin XML có kích thước lớn. DOM thì phù hợp trong việc parse những tệp tin có kích thước nhỏ.

- SAX rất hữu dụng trong việc nhận về một tập hợp con của những thông tin nhỏ chứa trong file XML. Còn DOM thì hữ dụng trong việc nhận một tập hợp con của dữ liệu.

- Quá trình parse của SAX nhanh hơn DOM.

III. Việc sử dụng JAXP và thư viện sử dụng

1. Việc sử dụng

- JAXP đóng vai trò chuyển đổi dữ liệu dữ hai hệ thống khác nhau thông qua việc dịch file XML để đảm bảo sự độc lập tuyệt đối giữa 2 hệ thống.
- Ngoài ra để chuyển thông tin trong database ra ngoài ta có thể convert dữ liệu ở trong database sang dạng XML và chuyển nó tới Client.

2. Các Package.



a. Nhóm các lớp và interfaces để biểu diễn trong SAX.

- Các Interfaces chạy bởi Parser:  Parser, AttributeList, Locator.
- Các interfaces chạy bởi ứng dụng: DocumentHandler, ErrorHandler and EntityReslover.
- Các lớp SAX chuẩn: InputSource, SAXException, SAXParseException, HandlerBase.

IV. Thư viện làm nhiệm vụ Transform dữ liệu

1. Các lớp

- OutputKeys.
- Transformer.
- TransformerFactory.

2. Interfaces.

- ErrorListener.
- Result.
- Source
- Templates.
- URI Resolver.

3. XSLT

- XSLT là một ngôn ngữ chuyển đổi các tài liệu XML từ một cấu trúc này sang một cấu trúc khác.

Thứ Bảy, 26 tháng 7, 2014

Tản mạn về kĩ năng kiểm soát cảm xúc (Master Emotion)

Vào một buổi tối mát trời của những ngày đầu xuân giữa tháng hai năm nay, mình được ông anh dẫn đến lớp học tiếng anh của ông ấy để học thử một buổi . Khi bắt đầu vào thì sau khi mở màn bằng các bài chào hỏi nhau bằng tiếng anh và nhắc lại một chút về bài cũ thì anh giảng viên ở đó có đề cập đến một khái niệm đó là "Master Emotion". Vậy mình đã nghe được những gì ?

Nói một cách dễ hiểu thì Kiểm soát cảm xúc là việc bạn khống chế những luồng suy nghĩ của chính bản thân mình để nhằm duy trì một trạng thái tâm lý ổn định, điều này rất có lợi cho việc bạn tiếp thu hay làm một cái gì đó vì tâm trí bạn không bị ảnh hưởng bởi những điều không mong muốn. Vậy l



Thứ Hai, 21 tháng 7, 2014

View Product Detail

Đầu tiên ta tạo một project với tên View Product Detail và sử dụng JavaServer Faces framework.

Đầu tiên ta tạo một lớp để kết nối đến cơ sở dữ liệu với tên là DataAccess và đặt nó trong package vpd.connection

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package vpd.db;

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=VIEW_PRODUCT_DETAIL";
        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;
    }
}

Tiếp đó là lớp để sử lý nghiệp vụ với tên là ProductManagement.java:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package vpd.bussiness;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import vpd.db.DataAccess;
import vpd.entity.Product;

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

    public 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 id = res.getInt("id");
                String name = res.getString("name");
                String price = res.getString("price");

                Product p = new Product(id, name, price);
                list.add(p);
            }
            return list;
        } catch (SQLException ex) {
            Logger.getLogger(ProductManagement.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public List<Product> getProductDetailByName(String name) {
        List<Product> list = new ArrayList<>();
        try {
            Connection conn = DataAccess.getConnection();
            PreparedStatement ps = conn.prepareCall("SELECT * FROM PRODUCT WHERE name like '" + name + "'");
            ResultSet res = ps.executeQuery();
            while (res.next()) {
                int id = res.getInt("id");
                String names = res.getString("name");
                String price = res.getString("price");

                Product p = new Product(id, names, price);
                list.add(p);
            }
            return list;
        } catch (SQLException ex) {
            Logger.getLogger(ProductManagement.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

}

Và một lớp để Product để đóng tạo ra đối tượng Product.

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package vpd.entity;

/**
 *
 * @author Nguyen Minh An
 */
public class Product {
    private int id;
    private String name;
    private String price;

    public Product(int id, String name, String price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }
    
}

Tiếp đó ta tạo một lớp JSF Managed Bean như dưới:


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package vpd.managed.bean;

import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import vpd.bussiness.ProductManagement;
import vpd.entity.Product;

/**
 *
 * @author Nguyen Minh An
 */
@ManagedBean
@RequestScoped
public class GetAllProduct {

    private int id;
    private String name;
    private String price;

    private List<Product> allProduct = new ProductManagement().getAllProduct();

    public GetAllProduct() {
    }

    public List<Product> getAllProduct() {
        return allProduct;
    }

    public List<Product> getProductDetailByName() {
        allProduct = new ProductManagement().getProductDetailByName(name);
        return allProduct;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    
    
}

Tiếp tới ta tạo 2 trang jsf với tên lần lượt là: index.xhtml và result.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:outputText value="Danh sách sản phẩm:"/>
        <h:dataTable value="#{getAllProduct.allProduct}" var="l">
            <h:column>
                <f:facet name="header">
                    <h:outputText value=""/>
                </f:facet>
                <h:link outcome="result.xhtml" value="#{l.name}" includeViewParams="true">
                    <f:param name="name" value="#{l.name}"/>
                </h:link>
            </h:column>
        </h:dataTable>
    </h:body>
</html>

Trang result.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
    <f:metadata>
        <f:viewParam name="name" value="#{getAllProduct.name}"/>
    </f:metadata>
    <h:head>

        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:outputText value="#{getAllProduct.name}"/>
        <h:dataTable value="#{getAllProduct.productDetailByName}" var="product" style="border: 1px solid blue">
            <h:column>
                Id: <h:outputText value="#{product.id}" style="border: 1px solid blue"/><br></br>
                Name: <h:outputText value="#{product.name}" style="border: 1px solid blue"/><br></br>
                Price: <h:outputText value="#{product.price}" style="border: 1px solid blue"/><br></br>
            </h:column>
        </h:dataTable>
    </h:body>
</html>