Thứ Tư, 10 tháng 8, 2016

Sử dụng filter trong J2EE application (Phần 2)

Sử dụng filter trong J2EE application (Phần 2)

Tác giả: Tăng Hải Ngọc Sơn – HunterBMT

Mục đích: Bài viết này là giúp các bạn nắm được cách sử dụng 1 thành phần khá hay trong J2EE mà có lẽ , bình thường chúng ta sẽ không dùng đến, đấy là filter. Phần tiếp theo.

Sử dụng filter trong J2EE application (Phần 2)

Tác giả: Tăng Hải Ngọc Sơn – HunterBMT

Mục đích: Bài viết này là giúp các bạn nắm được cách sử dụng 1 thành phần khá hay trong J2EE mà có lẽ , bình thường chúng ta sẽ không dùng đến, đấy là filter.

Yêu cầu :

·         Nắm rõ khái niệm về Filter cũng như mô hình MVC trong J2EE

·         Nắm rõ cách thức hoạt động của 1 web application .

·         Cài sẵn SQL 2005 có thể kết nối qua JDBC

·         Các tool sử dụng :

+  Netbean 6.9.1

+  Java JDK 1.6.22

Ở loạt bài trước , chúng ta đã cùng nhau tìm hiểu về cách dùng filter để nén một trang jsp như thế nào , ở bài viết này , chúng ta sẽ cùng nhau tìm hiểu cách dùng filter để tạo caches tại phía server

1. Caches là gì ?

    Nếu các bạn đã từng đọc qua cấu hình chi tiết của bất kỳ cpu nào, chắc các bạn sẽ thấy thông số về bộ nhớ đệm hay còn ghi là caches . Đây là một trong những thông số khá quan trọng, ảnh hưởng tới tốc độ xử lý của CPU . Nói một cách dễ hiểu, thì caches là nơi lưu trữ tạm những thông tin thường được truy xuất , để giúp tối ưu hóa việc xử lý dữ liệu .

   Ví dụ : Bạn cần tìm số điện thoại của anh A . Để tìm số điện thoại ấy, bạn cần mở danh bạ, dò theo tên để tìm được . Nếu bạn viết sẵn số điện thoại ấy lên một tờ giấy và dán ngay trên bàn, thì việc tìm số điện thoại của anh A sẽ nhanh hơn rất nhiều đúng ko nào .

   Vậy tại sao chúng ta phải cần caches trong web applications ? Chúng ta đã qua thời kỳ web tĩnh với những trang HTML nhàm chán, ít thay đổi. Web của chúng ta bây giờ thông tin được cập nhật rất thường xuyên, tương tự như ví dụ trên, nếu anh A mỗi ngày thay số đt một lần, thì bao nhiêu giấy mới đủ đây .

    Bài viết này hướng tới mục đích để thể hiện ý tưởng việc xây dựng ứng dụng web hiệu quả, server hay container hoạt động hiệu quả.

   Việc chúng ta sử dụng caches trong web applications nhằm hướng tới những mục đích sau :

     + Tiết kiệm thời gian cũng như giảm tải cho servlet với những request tới các trang ít thay đổi (nội quy , Q&A , lưu ý .v.v.v )

     + Tiết kiệm tài nguyên cho server.Chẳng hạn trường hợp user bấm F5 nhiều lần để kiểm tra có nội dung mới hay không, nếu không có caches , chúng ta sẽ phải tạo ra một trang HTML như cũ .

     + Tăng tốc độ xử lý đa nhiệm của web applications ( vì caches là dùng chung , nên việc nhiều request đều yêu cầu một trang web sẽ được tối ưu thông qua caches )

 Theo kinh nghiệm , sử dụng caches có thể tăng tốc độ trả response lên khoảng 80%

Caches có quá nhiều cái lợi , nhưng có cũng có cái hại , đó là chiếm dung lượng ổ cứng của server , vì bản chất ở đây chúng ta sẽ tạo 1 bản copy của trang muốn caching ( các bạn sẽ thấy rõ hơn khi chúng ta bắt tay vào implement )

2. Implement filter  

Chúng ta sẽ bắt tay vào implement filter . Các bạn mở project mà chúng ta đã tạo để sử dụng luôn cho tiện, đồng thời combo nén + caches là rất mạnh trong việc tối ưu tốc độ trả response.

Đầu tiên chúng ta sẽ implement filter CacheFilter . Tương tự như bài trước, chúng ta sẽ hiện thực lớp Filter

Vì code đã có comment , nên chúng ta sẽ chỉ lướt qua vài điểm chính . Đầu tiên, khi request tới, filter của chúng ta sẽ kiểm tra xem, url được request có caches hay không (thông qua giá trị biến khởi tạo tại xml ) nếu không , request chúng ta sẽ được xử lý như bình thường . Nếu có , chúng ta sẽ xử lý theo cách dùng caches

Khu vực được mình khoan đỏ là đoạn code dùng để xử lý nếu web application của chúng ta có sử dụng i18n (cách thức xây dựng ứng hỗ trợ đa ngôn ngữ cho ứng dụng distributed – các bạn có thể google để tìm hiểu thêm)

Nếu web app của bạn không sử dụng i18n ,chúng ta hoàn toàn có thể bỏ qua đoạn code trong khung đỏ.

Tiếp đến, chúng ta sẽ lấy caches để so sách . Nếu caches rỗng , caches cũ hơn hiện tại, caches bị time out , chúng ta sẽ tiến hành tạo caches mới.

Tiếp theo, để hoàn thành filter , chúng ta cũng sẽ implement hai class CacheResponseStream và CacheResponseWrapper tương tự như đối với filter .

Đầu tiên là CacheResponeseStream

Tiếp theo là CacheResponseWrapper

Như vậy là chúng ta đã hoàn thành xong filter caches . Trước khi chúng ta mapping để sử dụng , chúng ta hãy cùng xem lại cơ chế hoạt động của nó . Đơn giản :

B1 : Kiểm tra url người dùng yêu cầu có thuộc danh sách không caches hay không

Nếu thuộc danh sách này , chúng ta thực hiện bước tiếp, nếu không, chúng ta truyền request ,response như bình thường

B2: Kiểm tra caches nằm tại ổ cứng có thay đổi gì không , hoặc có time out chưa .

B3: Nếu có thay đổi, thực hiện request như bình thường, đồng thời lưu response lại thay thế caches cũ . Nếu không , trả response về cho user là caches hiện tại.

 

Bây giờ chúng ta sẽ mapping filter này vào để sử dụng .

Các bạn chỉnh sửa file web.xml như sau

Chúng ta có 2 giá trị khởi tạo . Một là những url nào chúng ta ko caches ( thường là những trang jsp thay đổi thường xuyên ) 2 là thời gian time out của cache ( tính theo phút )

Và chúng ta mapping filter này sử dụng với mọi trang jsp .

 

Như vậy là chúng ta đã hoàn thành filter thứ 2 , CacheFilter , lại thêm một công cụ để tăng tốc độ trả response cho người dùng, nhằm phục vụ user tốt hơn . Mọi thắc mắc về bài viết, về code hay cách sử dụng, các bạn có thể comment bên dưới, hoặc email về địa chỉ hunterbmt@gmail.com. Rất mong các bạn sẽ ủng hộ bài viết tiếp theo của loạt bài , “Dùng filter để sửa lỗi lazy loading trong Hibernate “.

               

 

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

Đăng nhận xét