Interceptors trong Struts 2
Interceptor là một đối tượng mà được triệu hồi tại thời điểm preprocess và postprocess của một request. Trong Struts 2, Interceptor được sử dụng để thực hiện các hoạt động như validation, exception handling, hiển thị kết quả trung gian, …
Lợi thế của Interceptor
Pluggable: nếu bạn cần xóa bất cứ trình logic nào như validation, exception handling, … từ ứng dụng, bạn không cần tái triển khai ứng dụng. Chúng ta chỉ cần xóa entry từ struts.xml file.
Các Interceptor mặc định trong Struts 2
Struts 2 Framework cung cấp rất nhiều Interceptor. Bạn cũng có tùy chọn để tạo Interceptor riêng cho mình. Dưới đây là các Interceptor mặc định trong Struts 2:
1, alias: Nó chuyển đổi các tham số tương tự mà có các tên khác nhau giữa các request.
2, chain: Nếu nó được sử dụng với result type là chain, nó làm cho các thuộc tính của action trước đó là có sẵn cho action hiện tại.
3, checkbox: Nó được sử dụng để xử lý các checkbox trong form. Bằng cái này, bạn có thể kiểm tra các unchecked checkbox.
4, cookie: Nó thêm một cookie tới action hiện tại.
5, conversionError: Nó thêm các lỗi chuyển đổi (conversion error) tới trường error của action.
6, createSession: Tạo bất cứ đối tượng HttpSession nếu chưa tồn tại.
7) clearSession: Nó xóa liên kết với đối tượng HttpSession.
8) debugging: Cung cấp sự hỗ trợ debug tới lập trình viên
9) execAndWait: Gửi một page trung gian trong khi action thực thi trong background.
10) exception: Ánh xạ exception mà được ném từ một action tới một result.
11) fileUpload: Cung cấp sự hỗ trợ tới file upload trong struts 2.
12) i18n: Cung cấp hỗ trợ tới việc theo dõi locale đã chon trong suốt một phiên của người dùng.
13) jsonValidation: Cung cấp hỗ trợ tới trình validation không đồng bộ.
14) logger: Cho kết quả là action name của action đang được thực thi.
15) store: lưu trữ và thu nhận các action message, action error hoặc các trường lỗi cho action mà triển khai ValidationAware Interface.
16) modelDriven: Làm đối tượng Model khác thành đối tượng mặc định của valuestack.
17) scopedModelDriven: Tương tự như ModelDriven nhưng làm việc cho action mà triển khai ScopedModelDriven.
18) params: Thiết lập các tham số request trên action.
19) prepare: Thực hiện công việc tiền xử lý, như thiết lập các kết nối tới Database, cho action triển khai Preparable interface.
20) profiling: Hỗ trợ profiling để được log cho action.
21) roles: Hỗ trợ role-based action.
22) scope: Lưu trữ và thu nhận trạng thái của action trong phạm vi session hoặc phạm vi ứng dụng.
23) servletConfig: Cung cấp sự truy cập tới các ánh xạ mà biểu diễn HttpServletRequest và HttpServletResponse.
24) staticParams: Ánh xạ thuộc tính static tới các thuộc tính của action.
25) timer: Thời gian cần thiết để thực thi một action.
26) token: Ngăn cản sự đệ trình bản sao của request.
27) tokenSession: Ngăn cản sự đệ trình bản sao của request.
28) validation: Cung cấp sự hỗ trợ trình validate cho input.
29) workflow: Gọi phương thức validate của action nếu lớp action triển khai Validateable interface.
Để có danh sách đầy để các Interceptor đã xây dựng sẵn, bạn có thể tham khảo Struts 2 Documentation. Phần tiếp theo sẽ trình bày cho bạn cách sử dụng một Interceptor trong ứng dụng Struts nói chung.
Cách sử dụng Interceptor trong Struts 2
Trong ví dụ này, chúng ta tìm hiểu cách sử dụng của một Interceptor đã có là timer trong ví dụ Hello World. Mục đích sử dụng timer là để tính toán thời gian cần thiết để thực thi action. Mình cũng sử dụng params Interceptor để gửi các tham số của request tới action. Bạn cũng có thể thử ví dụ này mà không sử dụng params và bạn sẽ thấy rằng thuộc tính name không được thiết lập bởi vì tham số là không thể tiếp cận tới action.
Chúng ta sẽ giữ HelloWorldAction.java, web.xml, HelloWorld.jsp và index.jsp như đã tạo trong chương Ví dụ. File cần sửa đổi là struts.xml để thêm một Interceptor, như sau:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <package name="helloworld" extends="struts-default"> <action name="hello" class="com.vietjack.struts2.HelloWorldAction" method="execute"> <interceptor-ref name="params"/> <interceptor-ref name="timer" /> <result name="success">/HelloWorld.jsp</result> </action> </package> </struts>
Bạn thử chạy ứng dụng và kiểm tra kết quả.