模型聽眾鉤
背景
Model Listener hook 是一種 Liferay 外掛,它監聽模型上的事件並執行響應程式碼。模型偵聽器鉤子類似於自定義 Struts Action 鉤子,因為它們響應門戶中採取的操作。但是,當 Struts 操作響應使用者採取的操作時,模型偵聽器會響應(在之前或之後)涉及 Liferay 模型的事件。
差異
以下是 Struts Actions v。模型監聽器的一些示例,用於比較。
- Struts Action
- 使用者登入
- 帳戶建立
- 擴充套件會話
- 移動資料夾
- 模型聽眾
- 建立資料夾後
- 更新使用者資訊時
- 刪除書籤後
- 在進行角色關聯之前
學習 Liferay 架構的最佳資源是通過他們的原始碼。他們所有的原始檔都位於 GitHub 上,並通過檢視他們的 JavaDocs。你可以在 JavaDocs 上看到所有核心門戶模型以及 GitHub 上的所有 Struts Actions 。
例
在本教程中,我們將開發一個模型監聽器,在首次建立帳戶後向使用者傳送電子郵件。為此,我們將編寫一個名為 UserModelListener 的類,它將擴充套件 Liferay 的 BaseModelListener 。我們將簡要介紹鉤子建立,並將涵蓋對以下配置檔案的必要修改
-
portal.properties
-
Liferay 的 -hook.xml
入門
要開始開發 Model Listener 鉤子,必須首先啟動 Liferay IDE 或 Liferay Developer Studio 應用程式。
Liferay IDE 和 Liferay Developer Studio 都是定製的 Eclipse 開發環境。它們非常相似,一套方向應該足夠兩種環境。
在開發環境中執行以下步驟。
- 在左上角,單擊“ 檔案”
- 將滑鼠懸停在 New 上
- 單擊 Liferay 外掛專案
你將產生這個視窗。
https://i.stack.imgur.com/KvumU.jpg
請輸入如上所示的資訊
- 專案名稱: User-Model-Listener
- 選擇使用預設位置
- 構建型別: Ant
- 外掛型別: 鉤子
確保你的專案位於 Liferays Plugins SDK Hook 目錄中。你需要相應地選擇 SDK 和執行時。
在 Package Explorer 透檢視中,你將看到以下目錄結構。
https://i.stack.imgur.com/vJvaf.jpg
聽眾發展
現在你已經建立了鉤子,你將需要建立自定義 UserModelListener 類。該類將擴充套件 Liferay 的 BaseModelListener 類。
Liferay 的 BaseModelListener 類是一個實現 ModelListener 介面的抽象類。你不希望直接實現 ModelListener 介面,因為它將要求你覆蓋其所有方法。
ModelListener 介面通過 BaseModelListener 抽象類為你提供了以下方法。
- onAfterAddAssociation
- onAfterCreate
- onAfterRemove
- onAfterRemoveAssociation
- onAfterUpdate
- onBeforeAddAssociation
- onBeforeCreate
- onBeforeRemove
- onBeforeRemoveAssociation
- onBeforeUpdate
在以下目錄中建立 UserModelListener 類。要通過 GUI 建立類,只需執行以下命令即可
- 單擊左上角的檔案
- 將滑鼠懸停在 New 上
- 單擊“ 類”
docroot/
WEB-INF/
src/
輸入以下資訊
https://i.stack.imgur.com/FMcSI.jpg
在 UserModelListener 類中,貼上以下程式碼
package com.example.hook;
import com.liferay.mail.service.MailServiceUtil;
import com.liferay.portal.ModelListenerException;
import com.liferay.portal.kernel.mail.MailMessage;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.model.BaseModelListener;
import com.liferay.portal.model.User;
import javax.mail.internet.InternetAddress;
public class UserModelListener extends BaseModelListener<User> {
private User user = null;
@Override
public void onAfterCreate(User user) throws ModelListenerException {
this.user = user;
if(isValidEmail()) {
sendEmail("admin@example.com", user.getEmailAddress(), "Welcome!", "Your account is created!");
}
}
private boolean isValidEmail() {
return Validator.isNotNull(user.getEmailAddress()) && Validator.isAddress(user.getEmailAddress());
}
private void sendEmail(String from, String to, String subject, String body) {
try {
MailServiceUtil.sendEmail(new MailMessage(new InternetAddress(from), new InternetAddress(to), subject, body, false));
} catch (Exception e) {
System.err.print("E-Mail spawned by User Model Listener failed to " + user.getFullName() + " with message " + e.getMessage());
}
}
}
屬性配置
為了配置我們的自定義偵聽器和我們的模型之間的關聯,我們需要進行一些最終調整。首先,在以下目錄中建立一個新的 portal.properties 檔案。
docroot/
WEB-INF/
src/
+ portal.properties
只需要將一行新增到檔案中。
value.object.listener.com.liferay.portal.model.User = com.example.hook.UserModelListener
我們可以通過說,對於任何模型監聽器我們建立關聯屬性值必須採用的形式來概括
value.object.listener.fully.qualified.model.name = fully.qualified.listener.name
換句話說,如果我們編寫了一個 CustomerDLFolderModelListener 類,打包在 com.example.code 中,對於 DLFolder 模型,我們將具有以下屬性
value.object.listener.com.liferay.portal.model.DLFolder = com.example.code.CustomerDLFolderModelListener
最後,找到 liferay-hook.xml 檔案。在“ 源” 檢視中,編寫以下內容。
<?xml version="1.0"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd">
<hook>
<portal-properties>portal.properties</portal-properties>
</hook>
說明
- 第一行是可選的序言,它指定文件版本和(在某些情況下)字符集。
- 第 2 行是正式的 DocType 定義 (DTD),它明確定義了哪些元素和屬性是有效的
- 第 3 行和第 5 行由父 Hook 元素 (此 DTD 支援的有效元素之一)組成
- 第 4 行覆蓋並擴充套件 $ {liferay.home}中的 portal.properties 檔案 ****
要檢視此 XML 檔案中可以使用的其他元素,你可以在 DocType 定義中引用 URL。這是帶有 DTD 的所有 XML 和 SGML 檔案的標準。帶有 DTD 的 Liferay XML 檔案的另一個例子是 service.xml (Liferay 的基於 Hibernate 的 ORM 實現 )。 **** **** **** **** **** **** ****
構建和部署
構建和部署鉤子是一個簡單的過程。Liferay 外掛開發支援構建和依賴自動化
- 螞蟻
- 常春藤
- Maven 的
- 搖籃
在我們的示例中,我們使用 Ant 進行構建自動化該的 build.xml 檔案包含構建命令(被稱為目標的螞蟻 )。要構建鉤子,只需執行以下命令即可。
- 找到你的 build.xml 檔案
- 在 IDE 中,將 build.xml 檔案拖到 Ant 透檢視中
- 展開檔案並執行所有目標
https://i.stack.imgur.com/xzDde.jpg
在控制檯檢視中,你應該看到類似於以下內容的內容
Buildfile: C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\build.xml
all:
clean:
[delete] Deleting directory C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
clean-portal-dependencies:
compile:
merge:
compile-import-shared:
[mkdir] Created dir: C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
[copy] Copying 5 files to C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\lib
compile-java:
[copy] Copied 3 empty directories to 3 empty directories under C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
[javac] Compiling 1 source file to C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
merge:
war:
clean-portal-dependencies:
[zip] Building zip: C:\liferay-plugins-sdk-6.2-ee-sp11\dist\User-Listener-Hook-hook-6.2.10.1.war
deploy:
[copy] Copying 1 file to C:\liferay-portal-6.2-ee-sp11\deploy
BUILD SUCCESSFUL
Total time: 7 seconds
成功構建 Hook 後,現在可以啟動門戶並進行部署。要啟動伺服器並部署 Hook,請找到 Server 透檢視。
- 右鍵單擊你的伺服器,然後單擊新增或刪除
- 在 Available 選項下找到 User-Listener-Hook ****
- 高亮顯示後點選新增按鈕,然後單擊 OK
- 單擊 Server 透檢視中的 Play 按鈕 ****
如果你有任何問題,意見,疑慮等,請告知我們。非常感謝所有建設性的反饋!