Hướng dẫn viết portlet feedback đơn giản trên Liferay sử dụng Liferay IDE, sử dụng các công nghệ JSF (JavaServer Faces): là một framework dùng để phát triển các ứng dụng web bằng Java. Liferay hỗ trợ phát triển portlet bằng JSF. Hibernate: là một ORM (Object Relational Mapping) framework của Java, dùng để hỗ trợ việc truy xuất database.
Trang 1HƯỚNG DẪN TẠO PORTLET ĐƠN GIẢN TRÊN
LIFERAY
I Mục tiêu
Hướng dẫn viết portlet feedback đơn giản trên Liferay sử dụng Liferay IDE
II Công nghệ sử dụng
JSF (JavaServer Faces): là một framework dùng để phát triển các ứng dụng web
bằng Java Liferay hỗ trợ phát triển portlet bằng JSF
Hibernate: là một ORM (Object Relational Mapping) framework của Java, dùng để
hỗ trợ việc truy xuất database
Trang 2MỤC LỤC
HƯỚNG DẪN TẠO PORTLET ĐƠN GIẢN TRÊN LIFERAY 1
I Mục tiêu 1
II Công nghệ sử dụng 1
MỤC LỤC 2
PHẦN 1: CHUẨN BỊ MÔI TRƯỜNG 4
I Chuẩn bị 4
II Cấu hình Liferay Portal 5
III Cấu hình Liferay IDE 6
1 Cấu hình JRE 6
2 Cài đặt Liferay Plugin SDK 7
3 Cài đặt Liferay Server 9
PHẦN 2: TẠO FEEDBACK PORTLET 13
I Mục tiêu 13
II Tạo database 13
III Tạo mới Liferay Portlet Project 16
IV Thêm thư viện hibernate vào project 18
V Tạo Java Object cho bảng feedback 19
VI Tạo tập tin cấu hình cho Hibernate 21
VII Tạo lớp hỗ trợ cho Hibernate 22
VIII Tạo lớp DataProvider 23
IX Tạo portlet thêm mới feedback 24
1 Tạo Managed Bean 24
2 Tạo giao diện 25
Trang 31 Tạo Managed Bean 32
2 Tạo giao diện 33
3 Khai báo thông tin portlet 35
4 Deploy portlet 36
XI Cấu trúc project sau khi hoàn thành 38
Trang 4PHẦN 1: CHUẨN BỊ MÔI TRƯỜNG
I Chuẩn bị
Phần cứng: tối thiểu 1GB Ram
Liferay portal 6.0 Community Edition Bundled with Tomcat (tham khảo tài liệu Huong dan cai dat Liferay 6.0 voi Postgres 8)
Liferay IDE 1.3.1 (là phiên bản eclipse 3.7 đã được cài đặt sẵn Liferay IDE) (địa chỉ tải về http://sourceforge.net/projects/lportal/files/Liferay%20IDE/1.3.1/)
Liferay plugin SDK 6.1.0 b3 (SDK 6.1.0 trở lên mới hỗ trợ JSF 2 portlet) địa chỉ tải
về http://sourceforge.net/projects/lportal/files/Liferay%20Portal/6.1.0%20B3/)
Trang 5 Thư viện JSF 2 (đã được kèm theo trong gói Liferay plugin SDK)
Thư viện Hibernate 3.6 (địa chỉ tải về:
http://sourceforge.net/projects/hibernate/files/hibernate3/3.6.10.Final/)
II Cấu hình Liferay Portal
Ta sẽ chuyển Liferay portal sang chế độ Developer Chế độ Developer sẽ tối ưu Liferay cho việc phát triển portlet với những hỗ trợ sau:
Tắt cache để bất cứ thay đổi nào cũng được cập nhật nhanh nhất có thể mà không cần khởi động lại Liferay
Hiển thị nhiểu thông tin hơn khi có lỗi xảy ra
Trang 6Để bật chế độ Developer trong Liferay 6, vào thư mục
C:\liferay-portal-6.0.6\tomcat-6.0.29\bin , mở tập tin setenv.bat Tìm đến dòng sets JAVA_OPTS thêm tùy chọn
Trang 7Trong hộp thoại hiện ra, thêm đường dẫn đến jre của Liferay là
C:\liferay-portal-6.0.6\tomcat-6.0.29\jre1.6.0_20\win\bin vào mục Variable value (lưu ý dấu ‘;’)
Để kiểm tra, vào Start - Run, gõ cmd để vào Command Prompt Trong cửa sổ Command
Prompt, gõ java –version Hệ thống sẽ hiển thị phiên bản java nếu thiết đặt đúng
2 Cài đặt Liferay Plugin SDK
Giải nén gói Liferay IDE vào ổ thư mục thích hợp, ví dụ C:\.
Giải nén gói Liferay plugin SDK vào thư mục C:\eclipse\plugins của Liferay IDE
Trang 8Vào thư mục C:\eclipse, chạy tập tin eclipse.exe để khởi động Liferay IDE.
Chọn menu Windows - Preferences
Trong hộp thoại Preferences, chọn Liferay - Installed SDKs, nhấn nút Add để thêm Liferay
plugin SDK
Chọn đến thư mục của Liferay plugin SDK
Trang 93 Cài đặt Liferay Server
Trong hộp thoại Preferences của Liferay IDE, chọn Server - Runtime Environments, nhấn
nút Add để thêm Server
Tìm đến mục Liferay, Inc chọn Liferay v6.0 CE (Tomcat 6).
Check vào tùy chọn Create a new local server để Liferay IDE tự động tạo một instance
Server dựa trên Runtime Server này Nhấn Next
Trang 10Tìm đến thư mục tomcat của Liferay portal đã cài trước đó Nhấn Finish
Trang 11Lúc này, trên giao diện chính của Liferay IDE sẽ xuất hiện instance server vừa tạo.
Để kiểm tra server vừa tạo, click chuột phải lên server chọn Start để khởi động Liferay portal
từ Liferay IDE
Nếu server khởi động thành công (server chuyển trạng thái sang Started), click chuột phải lên
Server chọn Open Liferay Portal
Trang chủ của Liferay sẽ hiển thị trong cửa sổ của Liferay IDE
Trang 13PHẦN 2: TẠO FEEDBACK PORTLET
I Mục tiêu
Phần này sẽ hướng dẫn tạo 2 portlet:
Thêm feedback: cho phép người dùng thêm mới một feedback
Quản lý feedback: cho phép người dùng xem danh sách các feedback và thông tin chi tiết của một feedback
II Tạo database
Vào pgAdmin III, chọn LIFERAY_TEST - Schemas - public, click chuột phải lên Tables chọn New Table
Trong hộp thoại New table, chọn thẻ Properties, đặt tên cho table là feedback
Trang 14Chọn thẻ Columns, nhấn nút Add để tiến hành thêm các cột như thông tin trong bảng dưới
đây:
chính
Not
2 fb_tieude character varying(200) x Tiêu đề
3 fb_nguoigoi_ten character varying(200) x Tên người gởi
4 fb_nguoigoi_email character varying(200) x Email người gởi
Chọn thẻ Constraints, chọn Primary nhấn nút Add để thêm khóa chính
Trang 15Trong hộp thoại New Primary Key, trong thẻ Properties nhập tên cho primary key vào mục
Name
Chọn thẻ Columns, chọn cột fb_id nhấn nút Add để thêm fb_id vào làm khóa chính Nhấn
OK
Trang 16Sau khi tạo xong khóa chính, nhấn OK trên hộp thoại New table để tạo bảng feedback
III Tạo mới Liferay Portlet Project
Vào menu File - New - Liferay Project
Trong hộp thoại New Liferay Project, đặt tên cho Project là feedback, chọn SDK và Liferay
runtime (vừa cấu hình ở trên) Chọn kiểu Plugin là Portlet Nhấn Next
Trang 17Chọn JSF 2 làm framework phát triển portlet Nhấn Finish
Nếu Liferay IDE hiển thị thông báo đề nghị sử dụng Liferay perspective Chọn Yes
Project vừa tạo sẽ xuất hiện trong phần Package Explorer
Trang 18IV Thêm thư viện hibernate vào project
Giải nén gói Hibernate, tìm và chép 8 tập tin sau vào thư mục lib của feedback portlet
Trang 19V Tạo Java Object cho bảng feedback
Thêm package feedback vào project
Để sử dụng hibernate, ta vào docroot/WEB-INF/src/feedback, tạo class Feedback
(Feedback.java) để mapping với table feedback Hibernate sẽ tương tác với table feedback
thông qua class Feedback này
@Table (name = "feedback")
public class Feedback implements java.io.Serializable {
@Column (name="fb_id", unique=true, nullable=false)
private int fbId;
@Column (name="fb_tieude", nullable=false)
private String fbTieude;
@Column (name="fb_nguoigoi_ten", nullable=false)
private String fbNguoigoiTen;
@Column (name="fb_nguoigoi_email", nullable=false)
private String fbNguoigoiEmail;
@Column (name="fb_noidung", nullable=false)
Trang 20public Feedback() {
}
public Feedback(int fbId, String fbTieude, String fbNguoigoiTen,
String fbNguoigoiEmail, String fbNoidung) { this.fbId = fbId;
Trang 21 @Table: khai báo thông tin của table tương ứng trong database
o Name: tên bảng (feedback)
@Id: cho biết thuộc tính đó tương ứng với cột là khóa chính trong table (fb_id)
@SequenceGenerator: khai báo bộ sinh mã tự động (hibernate sẽ sinh mã tự động thông qua bộ sinh mã tự động của PostgreSQL)
o Name: tên bộ sinh mã tự động, ở đây ta đặt trùng với tên sequence tương ứng trong PostgreSQL
o sequenceName: tên sequence tương ứng trong PostgreSQL (feedback_fb_id_seq)
Để xem tên sequence do PostgreSQL tạo ra cho cột fb_id, trong pgAdmin III chọn
bảng feedback rồi chọn thẻ Dependents
o allocationSize: giá trị tăng của mã mới so với mã cũ (mặc định là 50)
@GeneratedValue: khai báo bộ sinh mã tự động của hibernate sẽ được sử dụng đẻ sinh giá trị cho thuộc tính
o strategy: chiến thuật sinh mã, phụ thuộc vào database sử dụng, với PostgreSQL sẽ
là SEQUENCE
o generator: tên bộ sinh mã của Hibernate, chính là Name của @SequenceGenerator
VI Tạo tập tin cấu hình cho Hibernate
Trong thư mục docroot/WEB-INF/src, tạo ra tập tin hibernate.cfg.xml để chứa các tham số
cấu hình cho hibernate với nội dung sau:
<? xml version ="1.0" encoding ="UTF-8" ?>
<! DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate
Trang 22ST </ property >
< property name ="hibernate.connection.username" > postgres </ property >
< property name ="hibernate.connection.password" > 1234567 </ property >
connection.url=url đến database, có dạng: jdbc:postgresql://[ip_database _server]:
[port_của_postgresql]/[tên_database] (nếu database nằm ở máy cục bộ thì
ip_database _server có thể là 127.0.0.1 hoặc localhost)
o [ip_database_server]: nếu là database nằm ở máy cục bộ thì
ip_database_server có thể là 127.0.0.1 hoặc localhost
o [port_của_postgresql]: port mặc định của PostgreSQL là 5432
o [tên_database]: tên database, trong tài liệu này là LIFERAY_TEST
connection.username=tên tài khoản đăng nhập vào PostgreSQL
connection.password=mật khẩu đăng nhập vào PostgreSQL
mapping class=đường dẫn đầy đủ đến class mapping với table trong database (ở đây
là class Feedback nằm trong feedback package)
VII Tạo lớp hỗ trợ cho Hibernate
Trong thư mục docroot/WEB-INF/src/feedback, tạo class HibernateUtil (HibernateUtil.java)
để hỗ trợ việc tạo session kết nối đến database cũng như thực hiện các câu truy vấn thông quahibernate
Trang 23// Open a new Session, if this thread has none yet
if (s == null || s.isOpen() == false) {
// private static final SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
VIII Tạo lớp DataProvider
Trong thư mục docroot/WEB-INF/src/feedback, tạo class FeedbackDataProvider
(FeedbackDataProvider.java) để thực thi các truy vấn đến PostgreSQL
public void addFeedback(Feedback fb) {
Session session = HibernateUtil.currentSession();
public List<Feedback> getAllFeedback() {
List<Feedback> listFeedback = new ArrayList<Feedback>();
Session session = HibernateUtil.currentSession();
session.beginTransaction();
Trang 24public Feedback getFeedbackById(int id) {
Session session = HibernateUtil.currentSession();
save: thêm mới đối tượng (phương thức addFeedback(Feedback fb))
update: cập nhật đối tượng
get: lấy đối tượng theo khóa chính (phương thức getFeedbackByid(int id))
Ngoài ra, Session cũng hỗ trợ các câu truy vấn SQL thông qua đối tượng Query, trong đó các table, column trong database được thao tác thông qua lớp mapping tương ứng (lớp
Feedback)
IX Tạo portlet thêm mới feedback
1 Tạo Managed Bean
Trong thư mục docroot/WEB-INF/src/feedback, tạo class FeedbackThemBean
(FeedbackThemBean.java) để tạo Managed Bean Managed Bean là những lớp dùng để lưu trữ dữ liệu và có thể được truy cập từ JSF page (các trang html)
package feedback;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
Trang 25private FeedbackDataProvider objFeedbackDataProvider;
private Feedback objFeedback;
private String thongTin;
public Feedback getObjFeedback() {
objFeedback = new Feedback();
thongTin = "Gởi ý kiến";
objFeedback = new Feedback();
thongTin = "Ý kiến của bạn đã được gởi đi";
}
}
Để khai báo một class là Managed Bean ta dùng chú giải @ManagedBean trước khai báo class Tiếp theo là chú giải cho biết phạm vi tồn tại của Managed Bean Portlet thêm feedbackchỉ gồm một trang html nên ta sử dụng @ViewScoped - phạm vi chỉ trong 1 trang
2 Tạo giao diện
Trong thư mục docroot/xhtml, tạo tập tin Feedback_Them.xhtml để tạo khai báo form thêm
Trang 26required ="true" requiredMessage =" Vui lòng nhập họ
tên người gửi"
validatorMessage =" Vui lòng nhập họ tên người gửi"
Trang 27validatorMessage =" Email không hợp lệ"
< td style =" text-align : left" class ="cssTdChuY" > Chú ý: ( < span
style =" color : red" * </ span > ) là bắt buộc nhập </ td >
<h:outputText value="#{FeedbackThemBean.thongTin}"></h:outputText>: hi n th giá ể ị
tr bi n thongTin c a Managed Bean FeedbackThemBean v i component ị ế ủ ớ
<h:outputText/>
Trang 28JSF 2 cung cấp các thẻ (component) hỗ trợ cho việc hiển thị dữ liệu Để sử dụng các thẻ của JSF 2, ta khai báo 2 namespace sau vào đầu tập tin html.
xmlns:f ="http://java.sun.com/jsf/core"
xmlns:h ="http://java.sun.com/jsf/html"
Mỗi component sẽ có các thuộc tính tương ứng với nó
Ở form thêm feedback, ta sử dụng các thẻ <h:inputText/> để người dùng nhập liệu, và gắn với biến tương ứng trong FeedbackThemBean
< h:inputText id ="txtTieuDe" maxlength ="200"
value ="#{FeedbackThemBean.objFeedback.fbTieude}"
required ="true" requiredMessage =" Vui lòng nhập tiêu đề góp ý"
validatorMessage =" Vui lòng nhập tiêu đề góp ý"
<f:validateRegex /> với pattern là regex bắt khoảng trắng để kiểm tra dữ liệu nhập, thông báolỗi tương ứng được định nghĩa trong thuộc tính validatorMessage của thẻ <h:inputText/>
Để hiển thị các Message này, ta cần định nghĩa thẻ <h:message /> cho thẻ <h:inputText/> đó với thuộc tính for là id của thẻ cần hiển thị các Message:
< h:message for =" txtTieuDe" />
Để submit dữ liệu, ta dùng thẻ <h:commandButton/>
< h:commandButton id ="btnGui" value ="Gửi" title ="Gửi"
actionListener ="#{FeedbackThemBean.actionThemFeedback}" >
</ h:commandButton >
Để gọi hàm xử lý tương ứng trong Managed Bean khi submit dữ liệu, ta gọi nó thông qua thuộc tính actionListener của <h:commandButton />
3 Khai báo thông tin portlet
Trong một portlet project, ta có thể khai báo nhiều portlet Với mỗi portlet, ta cần khai báo thông tin về nó trong 3 tập tin:
liferay-display.xml
Trang 29Vào thư mục docroot/WEB-INF, mở tập tin liferay-display.xml ta thêm nội dung sau trong
thẻ <display>:
< category name ="vidu" >
< portlet id ="Feedback_Them" />
</ category >
Với khai báo trên, ta đã khai báo thêm một category tên là vidu Liferay sử dụng các category
để phân loại, sắp xếp các portlet để dễ quản lý Trong category vidu, ta khai báo một portlet
có id là Feedback_Them
Vào thư mục docroot/WEB-INF, mở tập tin portlet.xml ta thêm nội dung sau vào trong thẻ
<portlet-app>:
< portlet-name > Feedback_Them </ portlet-name >
< display-name > Feedback_Them </ display-name >
< portlet-class > org.portletfaces.bridge.GenericFacesPortlet </ class >
portlet-< init-param >
< name > javax.portlet.faces.defaultViewId.view </ name >
< value > /xhtml/Feedback_Them.xhtml </ value >
< title > Thêm mới feedback </ title >
< short-title > Thêm mới feedback </ short-title >
< keywords > Feedback </ keywords >
Trang 30o <value>: khai báo tập tin xhtml đầu tiên của portlet (ở đây là tập tin
Feedback_Them.xhtml nằm trong thư mục xhtml)
Thẻ <portlet-info>:
o <title>: khai báo tiêu đề portlet
o <short-title>: khai báo tiêu đề ngắn cho portlet (Liferay sẽ dùng để hiển thị trong phần quản lý portlet)
Vào thư mục docroot/WEB-INF, mở tập tin liferay-portlet.xml ta thêm nội dung sau vào
trong thẻ <liferay-portlet-app>:
< portlet >
< portlet-name > Feedback_Them </ portlet-name >
< icon > /icon.png </ icon >
< instanceable > false </ instanceable >
< ajaxable > false </ ajaxable >
< header-portlet-css > /css/main.css </ header-portlet-css >
< css-class-wrapper > feedback-portlet </ css-class-wrapper >
</ portlet >
Trong đó:
Thẻ <portlet-name>: khai báo tên portlet, tên này phải trùng với id khai báo trong tập tin liferay-display.xml
/// Khai báo thêm trong file hibernate.cfg.xml
< mapping class ="com.cusc.cms.dept.nhansu.NhanSu" />
Và file model-orm.xml
< entity class ="com.cusc.cms.dept.nhansu.NhanSu" access ="FIELD">
< table name ="tbl_NhanSu" schema =""></ table >
< attributes >
< id name ="Id">
< column name ="Id" />
< generated-value strategy ="IDENTITY" />
</ id >
</ attributes >
</ entity >
Thêm servlet vô file web.xml
<! Servlet của bộ môn >
< servlet >
< servlet-name > NhanSu_DanhSach Servlet </ servlet-name >
< class > com.liferay.portal.kernel.servlet.PortletServlet </ servlet-class >
servlet-< init-param >
< param-name > portlet-class </ param-name >