Phần này trình bày một số mẹo sẽ giúp bạn viết các phương thức triển khai phức tạp hơn của thư viện:
- Sử dụng dịch vụ của riêng bạn
- Xác định khả năng
- Tùy chỉnh luồng sự kiện
- Chuyển các tham số đến
DataTableGenerator.generateDataTable
- Triển khai nguồn dữ liệu không phải servlet
Sử dụng dịch vụ của riêng bạn
Những cách triển khai nguồn dữ liệu đơn giản nhất sẽ kế thừa từ lớp DataSourceServlet
của thư viện.
Để kế thừa từ một lớp không phải DataSourceServlet
, hãy triển khai
một nguồn dữ liệu như sau:
- Triển khai giao diện
DataTableGenerator
rồi ghi đègetCapabilities()
vàgenerateDataTable()
. - Gọi
DataSourceHelper.executeDataSourceServletFlow()
từ bên trong mã của servlet để chạy luồng nguồn dữ liệu.Phương thức này sử dụng các tham số sau:- Đối tượng
HttpServletRequest
. - Đối tượng
HttpServletResponse
. - Cách triển khai giao diện
DataTableGenerator
trong bước 1 ở trên. - Giá trị boolean để chỉ định chế độ truy cập bị hạn chế hoặc không bị hạn chế.
- Đối tượng
Ví dụ: nếu bạn muốn kế thừa servlet từ một lớp servlet khác có tên là AuthServlet
cung cấp tính năng xác thực tích hợp, bạn có thể viết lại SimpleServletExample
để kế thừa AuthServlet
thay vì DataSourceServlet
như sau:
- Triển khai giao diện
DataTableGenerator
. - Chuyển
generateDataTable()
từ phương thức triển khaiDataSourceServlet
sang phương thức triển khaiDataTableGenerator
. - Ghi đè
getCapabilities()
trong quá trình triển khaiDataTableGenerator
để trả vềCapabilities.None
. - Gọi
DataSourceHelper.executeDataSourceServletFlow()
từ bên trong mã servlet (doGet()
hoặcdoPost()
) và chuyển quá trình triển khaiDataTableGenerator
. Phương thức này sẽ chạy toàn bộ luồng của nguồn dữ liệu, bao gồm cả việc hiển thị kết quả của nguồn dữ liệu vào phản hồi của servlet.
Bạn có thể dùng kỹ thuật tương tự nếu đang dùng khung servlet mà trong đó bạn thường kế thừa một lớp trừu tượng do khung đó cung cấp.
Ví dụ: nếu đang sử dụng Hilt, bạn có thể muốn kế thừa lớp ActionSupport
.
Xác định khả năng
Nếu kho dữ liệu của bạn chứa một lượng lớn dữ liệu và bạn muốn tăng hiệu quả của nguồn dữ liệu, bạn có thể sử dụng khả năng truy vấn của kho dữ liệu. Ví dụ: Giả sử kho dữ liệu của bạn là một cơ sở dữ liệu và cơ sở dữ liệu có nhiều cột. Nếu hình ảnh trực quan chỉ yêu cầu một vài cột trong số đó, thì việc chạy thao tác SELECT
trong cơ sở dữ liệu sẽ hiệu quả hơn so với việc truy xuất tất cả cột và sử dụng khả năng truy vấn của thư viện để thực hiện SELECT
.
Để triển khai các chức năng của SELECT
, bạn cần viết mã để chạy thao tác SELECT
trong cơ sở dữ liệu và trả về một bảng dữ liệu.
Sử dụng enum Capabilities
để xác định khả năng truy vấn mà mã của bạn cung cấp. Các lựa chọn hiện có là:
NONE
: mặc định, mã của bạn không cung cấp hoạt động truy vấn.SQL
: mã của bạn cung cấp các thao tác truy vấn SQL.SORT_AND_PAGINATION
: mã của bạn cung cấp cả thao tác truy vấn sắp xếp và phân trang.SELECT
: mã của bạn cung cấp một thao tác lựa chọn.ALL
: mã của bạn cung cấp các thao tácSQL
,SORT_AND_PAGINATION
vàSELECT
.
Lưu ý: Trong mọi trường hợp, thư viện sẽ xử lý mọi thao tác truy vấn không do mã của bạn cung cấp.
Để triển khai một tính năng khác NONE
, hãy ghi đè Capabilities.getCapabilities()
và triển khai DataTable.generateDataTable()
để truy vấn kho dữ liệu và trả về một bảng dữ liệu.
Ba ví dụ trong số này minh hoạ cách triển khai các tính năng: AdvancedExampleServlet
, AdvancedExampleServlet2
và SqlDataSourceServlet
.
Tất cả đều nằm trong gói example
. AdvancedExampleServlet2
sẽ được thảo luận trong bài viết Xác định khả năng và luồng sự kiện.
Tùy chỉnh luồng sự kiện
Luồng sự kiện mặc định được xác định trong DataSourceHelper.executeDataSourceServletFlow
.
Sau đây là quy trình mặc định:
- Trích xuất và phân tích cú pháp tham số truy vấn.
- Chỉ đối với chế độ truy cập bị hạn chế, hãy xác minh rằng yêu cầu bắt nguồn từ cùng một miền với servlet.
- Phân tích cú pháp yêu cầu tạo 2 đối tượng truy vấn: truy vấn nguồn dữ liệu và truy vấn hoàn thành. Truyền truy vấn nguồn dữ liệu đến phương thức triển khai
generateDataTable()
của bạn. - Việc triển khai
generateDataTable()
của bạn sẽ tạo ra một bảng dữ liệu. - Chạy truy vấn hoàn thành trên bảng dữ liệu được tạo ở bước 5.
- Kết xuất bảng dữ liệu theo định dạng được chỉ định trong hình ảnh trực quan và đặt phản hồi servlet.
Để chỉ định luồng sự kiện của riêng bạn, hãy gọi các hàm trợ giúp trong datasource.DataSourceHelper
. Hãy xem phần Xác định khả năng và luồng sự kiện để tham khảo ví dụ về cách triển khai.
Chuyển các tham số đến DataTableGenerator.generateDataTable
Bạn có thể sử dụng HttpServletRequest.setAttribute
để truyền dữ liệu không thuộc truy vấn hoặc đối tượng HttpServletRequest
đến DataTableGenerator.generateDataTable
. Mã ví dụ được cung cấp
dưới đây.
Trong mã của servlet, hãy đặt đối tượng bạn muốn truyền vào HttpServletRequest
như sau:
request.setAttribute("my_object_name", myObject); DataSourceHelper.executeDataSourceServletFlow(request, response, dataTableGenerator);
Trong quá trình triển khai giao diện dataTableGenerator
, hãy lấy đối tượng từ HttpServletRequest
như sau:
public DataTable generateDataTable(Query query, HttpServletRequest request){ Object myObject = request.getAttribute("my_object_name"); // Add your code to manipulate myObject here }
Triển khai nguồn dữ liệu không phải servlet
Nếu triển khai thư viện mà không dùng servlet, bạn chỉ có thể sử dụng các lớp và hàm trợ giúp đó không yêu cầu môi trường servlet. Trong đó bao gồm các lớp Query
và DataTable
cũng như một số hàm DataSourceHelper
như parseQuery
, applyQuery
, validateQuery
và splitQuery
.
Bạn có thể dùng các lớp và hàm này để thực hiện những việc sau:
- Phân tích cú pháp một truy vấn trực quan.
- Tách truy vấn thành một truy vấn nguồn dữ liệu và một truy vấn hoàn thành.
- Chạy truy vấn hoàn thành để tạo bảng dữ liệu.
- Đưa bảng dữ liệu về hình ảnh trực quan ở định dạng
HTML
,CSV
hoặcJSON
.