模型聽眾鉤

背景

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 開發環境。它們非常相似,一套方向應該足夠兩種環境。

在開發環境中執行以下步驟。

  1. 在左上角,單擊“ 檔案”
  2. 將滑鼠懸停在 New 上
  3. 單擊 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>

說明

  1. 第一行是可選的序言,它指定文件版本和(在某些情況下)字符集。
  2. 第 2 行是正式的 DocType 定義 (DTD),它明確定義了哪些元素和屬性是有效的
  3. 第 3 行和第 5 行由父 Hook 元素 (此 DTD 支援的有效元素之一)組成
  4. 第 4 行覆蓋並擴充套件 $ {liferay.home}中portal.properties 檔案 ****

要檢視此 XML 檔案中可以使用的其他元素,你可以在 DocType 定義中引用 URL。這是帶有 DTD 的所有 XMLSGML 檔案的標準。帶有 DTDLiferay XML 檔案的另一個例子是 service.xml (Liferay 的基於 HibernateORM 實現 )。 **** **** **** **** **** **** ****

構建和部署

構建和部署鉤子是一個簡單的過程。Liferay 外掛開發支援構建和依賴自動化

  • 螞蟻
  • 常春藤
  • Maven 的
  • 搖籃

在我們的示例中,我們使用 Ant 進行構建自動化該的 build.xml 檔案包含構建命令(被稱為目標螞蟻 )。要構建鉤子,只需執行以下命令即可。

  1. 找到你的 build.xml 檔案
  2. 在 IDE 中,將 build.xml 檔案拖到 Ant 透檢視中
  3. 展開檔案並執行所有目標

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 透檢視。

  1. 右鍵單擊你的伺服器,然後單擊新增或刪除
  2. Available 選項下找到 User-Listener-Hook ****
  3. 高亮顯示後點選新增按鈕,然後單擊 OK
  4. 單擊 Server 透檢視中的 Play 按鈕 ****

StackOverflow 文件

如果你有任何問題,意見,疑慮等,請告知我們。非常感謝所有建設性的反饋!