Mẹo triển khai

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

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:

  1. Triển khai giao diện DataTableGenerator rồi ghi đè getCapabilities()generateDataTable().
  2. 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ế.

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:

  1. Triển khai giao diện DataTableGenerator.
  2. Chuyển generateDataTable() từ phương thức triển khai DataSourceServlet sang phương thức triển khai DataTableGenerator.
  3. Ghi đè getCapabilities() trong quá trình triển khai DataTableGenerator để trả về Capabilities.None.
  4. Gọi DataSourceHelper.executeDataSourceServletFlow() từ bên trong mã servlet (doGet() hoặc doPost()) và chuyển quá trình triển khai DataTableGenerator. 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ác SQL, SORT_AND_PAGINATIONSELECT.

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, AdvancedExampleServlet2SqlDataSourceServlet. 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:

  1. Trích xuất và phân tích cú pháp tham số truy vấn.
  2. 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.
  3. 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.
  4. Việc triển khai generateDataTable() của bạn sẽ tạo ra một bảng dữ liệu.
  5. Chạy truy vấn hoàn thành trên bảng dữ liệu được tạo ở bước 5.
  6. 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 QueryDataTable cũng như một số hàm DataSourceHelper như parseQuery, applyQuery, validateQuerysplitQuery. 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ặc JSON.