1. 程式人生 > >Liferay6.2:使用Hook執行自定義Action

Liferay6.2:使用Hook執行自定義Action

Liferay Hooks是定製Liferay核心功能的最佳plugin型別。請在需要覆蓋Liferay的核心功能時儘可能的使用Hook。儘管相同的任務Ext plugin也可以完成,但是Hook是支援熱部署的並且更向前相容,因此我們建議優先使用Hook。

在本教程的這一部分中,您將學習如何建立Hook,並且您將探索它們最常見的用途。

Performing a Custom Action Using a Hook - 使用Hook執行自定義Action

利用Hook能觸發常見portal event的自定義action,比如使用者登入或系統啟動。 每個event的action都在portal.properties中定義,因此建立一個自定義action需要擴充套件此檔案。使用Hook實現這項任務非常簡單。 接下來學習探索如何使用Hook執行自定義Action。

在本教程中,你將建立一個自定義Hook,為使用者登入執行自定義Action。 與此相似,你也可以為portal.properties中定義的其他portal event建立自定義Action。 接下來是具體步驟:

  1. 確定要觸發自定義action的event。 檢視portal.properties文件以查詢匹配的event屬性。 提示:event屬性的名稱中必定包含.event。portal.properties文件的以下部分中有session,startup,shutdown和portal event 屬性:

    • Session
    • Startup Events
    • Shutdown Events
    • Portal Events
      請注意與action相關的event的屬性名稱。
  2. 在Hook專案中,建立一個擴充套件com.liferay.portal.kernel.events.Action類的Java類。 重寫Action.run(HttpServletRequest,HttpServletResponse)方法。
    例如,建立一個名為LoginAction的類擴充套件Action並覆蓋其run方法:
    package com.liferay.sample.hook;

    import com.liferay.portal.kernel.events.Action;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class LoginAction extends Action {
        public void run(HttpServletRequest req, HttpServletResponse res) {
            System.out.println("## My custom login action");
        }
    }
    

    重要提示:如果你的action訪要問HttpServletRequest物件,請擴充套件com.liferay.portal.kernel.events.Action; 否則擴充套件com.liferay.portal.struts.SimpleAction。

  3. 在hook專案的docroot/WEB-INF/src資料夾中建立屬性檔案portal.properties。 然後新增portal event屬性的名稱,該屬性名稱與要執行action的event相對應。 將action類的完全限定名稱指定為屬性的值。
    例如,要在入口網站登入使用者之前執行一個action,你可以將action類作為login.events.pre屬性的值來指定。 就是這樣:
    login.events.pre=com.liferay.sample.hook.LoginAction
    要點:由於login.events.pre等portal屬性可以接受多值,因此必須將值附加到現有值上。 你可以通過其他hook重複修改屬性。
    對於接受單值的portal屬性,只能通過一個hook plugin來修改接受單值的portal屬性。 如果通過多個plugin修改屬性值,Liferay會不知道要使用哪個值。

  4. 編輯docroot/WEB-INF/liferay-hook.xml檔案,並將hook的portal屬性檔名成新增為…</ portal-properties>元素的值。該元素在hook的…元素中。
    例如,如果hook的屬性檔名是portal.properties,則指定此元素:
    portal.properties

  5. 部署hook

  6. 觸發action並驗證action是否執行。


警告:由於已知bug(LPS-52754),重寫具有重疊路徑的Struts action時可能會出現問題。 當一個路徑是另一個路徑的子串時,Struts action路徑會重疊。在以下示例中,Liferay的struts-config.xml檔案顯示了三個Struts action路徑。 請注意,第一個Struts action路徑是後兩個的子字串。

<action path="/document_library/edit_file_entry" ...
</action>

<action path="/document_library/edit_file_entry_discussion" ...
</action>

<action path="/document_library/edit_file_entry_type" ...
</action>

假設你建立一個hook plugin來覆蓋/document_library/edit_file_entry路徑。 由於上面提到的bug,hook的新自定義action不僅在呼叫預期路徑時觸發,而且在呼叫其中一個較大的包含路徑(例如document_library/edit_file_entry_discussion)時也會觸發!

要解決此問題,請遵循以下步驟:

  1. 查詢所有包含路徑的Struts action,這些路徑包含你要覆蓋的Struts action的路徑。
  2. 如果找到任何違規路徑,請在liferay-hook.xml中為它們建立。
  3. 在為每個Struts action建立的類中,僅覆蓋processAction,render和serveResource方法。
  4. 在每個重寫的方法中,只需呼叫原始的Struts action的方法(例如,originalStrutsPortletAction.processAction)。

至此,你已經建立了一個hook,可以在公共portal event上觸發自定義action。現在已經瞭解了使用Liferay Portal中的hook執行自定義action所需的基本步驟。