Như đã nói ở bài trước, nếu trong một portlet có nhiều thao tác xử lý dữ liệu thì ta sẽ tạo ra các action tương ứng để giải quyết công việc một cách độc lập. Việc này sẽ giúp chúng ta tách biệt các công việc khác nhau đồng thời sẽ dễ hiểu cho người khác đọc code của chúng ta và dễ dàng để bảo trì.
Như đã hứa ở bài trước, bài này chúng ta sẽ bàn đến vấn đề trả lại nhiều view khác nhau. Công việc này chắc chắn là thường xuyên gặp. Chẳng hạn bạn đang ở giao diện view, bạn có thể chuyển sang giao diện edit. Edit xong bạn có thể chuyển sang giao diện xem chi tiết chẳng hạn. Nói tóm lại, bài này sẽ giúp bạn chuyển sang các view đúng với kịch bản của bạn sau khi thực hiện các action.
Bài toán: chúng ta sẽ lấy lại đúng bài toán của bài trước. Ở post trước, sau khi thực hiện thao tác nhập địa chỉ email, subject và content. Bạn ghi xuống controller và controller sẽ ghi ra console sau đó trở lại màn hình view.jsp. Bây giờ, thay vì trở lại màn hình view, mình muốn trả lại một màn hình khác thì sẽ làm thế nào. Giả sử, mình muốn trả lại màn hình view_email.jsp thì sẽ làm như sau:
- Bạn tạo một project tên nà Multi Render nhé. Trong này sẽ tạo một portlet tên là multirender và tạo ra các file giống với project Multi Action (ở bài trước).
- Tạo màn hình trả về view_email.jsp có nội dung như sau:
<%@taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<portlet:defineObjects />
Email was sent succsessfully. - Chúng ta sẽ có một chút chỉnh sửa trong file MVCPortlet nhé. Ta sẽ viết lại nội dung của phương thức sendEmail như sau:
Bạn có thấy, phương thức sendEmail trong bài này có khác gì so với bài trước không? Bạn để ý thật kỹ thì sẽ thấy dòng lệnh cuối cùng: actionResponse.setRenderParameter("mvcPath", "/html/multirender/view_email.jsp"), đây chính là dòng lệnh để cho biết sau khi thực hiện action này thì view nào sẽ được hiển thị lên. - Giờ hãy deploy portlet và kéo nó vào trang của bạn. Click vào link Enter Email link nhé. Nhập nội dung và nhấn vào nút Save. Kết quả của bạn sẽ như sau:
Email view |
Rõ ràng, màn hình trả về khác với màn hình mặc đinh.
Trong phần còn lại của bài này, mình sẽ hướng dẫn các bạn một mẹo nhỏ để làm gọn jsp code của mình. Từ đầu đền giờ, ta mới viết các project có nhiều là bốn file jsp. Tuy nhiên, tất cả các file này có phần đầu khá giống nhau. Một câu hỏi rất tự nhiên là làm thế nào để chỉ phải viết chúng một lần thôi, để mỗi khi tạo file jsp mới thì không cần thêm chúng vào nữa.
Nếu bạn để ý trong code của Liferay thì chúng ta sẽ thấy mỗi thưc mục thường có hai file mặc định là init.jsp và init-ext.jsp. Hai file này để làm gì? File init.jsp sẽ được dùng để chứa các thư viện mặc định và init-ext.jsp sẽ chứa các thư viện cho lập trình viên tự thêm vào. Trong bài của ta, ta chính là lập trình viên, vì vậy chỉ cần file init.jsp là đủ.
Trong mỗi thư mục, bạn tạo ra một file init.jsp chứa tất cả các thư viện của các file jsp khác trong thư mục. Ví vụ một file jsp như sau:
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>
<%@page import="com.liferay.portal.kernel.util.ParamUtil"%>
<portlet:defineObjects />
Còn các file khác trong cùng thư mục thì ta chỉ cần thêm vào một dòng đơn giản như sau:
<%@include file="/html/multirender/init.jsp"%>
Dòng này thực hiện việc copy nội dung của file init.jsp vào các file tương ứng. Lưu ý, các biến trong init.jsp cũng chính là các biến trong file gọi đến nói. Vì vậy, hãy lưu ý khi đặt tên biến và phạn vi biến để tránh trùng lặp nhé.
Ta cũng sử udngj được thẻ include để kế thừa các file init.jsp khác nhau. Các file init.jsp trong thư mục con có thể include các file init.jsp của thư mục cha. Rõ ràng việc này làm giảm thời gian viết code đáng kể. Từ các post sau chúng ta sẽ làm theo cách này nhé.
Không có nhận xét nào:
Đăng nhận xét