<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 如何在 Liferay DXP 中替代現成的(OOTB)模塊 > [https://javatutorial.net/override-out-of-the-box-ootb-modules-in-liferay-dxp](https://javatutorial.net/override-out-of-the-box-ootb-modules-in-liferay-dxp) 該博客涵蓋有關在 Liferay DXP 中創建**片段**以及如何執行所需的覆蓋的詳細信息。 ![](https://img.kancloud.cn/c6/0e/c60e61a4dd3a413548fcb10a65199b82_700x401.jpg) Liferay DXP 是最受歡迎的開放源代碼之一,具有許多現成的(OOTB)模塊,有時根據我們的特定要求,我們需要覆蓋它們。 通常,使用 OSGi 片段是執行此類覆蓋的方法。 ## 該博客包括 什么是片段? 如何在 Liferay 7 中創建片段 片段在 Liferay 7 DXP 中的用途是: * 覆蓋 Liferay OOTB 模塊的 JSP * 覆蓋語言屬性 * 用 Servlet 過濾器覆蓋 HTTP 請求 * 覆蓋 Liferay Struts 動作 * 替代 Liferay 模態監聽器 ## 什么是片段? 片段是 OSGi 模塊的一種,類似于 mvcportlet,服務,激活器,面板應用程序等。可以說片段是主機模塊的擴展。 對于 Liferay 7 之前的所有版本,都使用 Hook 覆蓋 Liferay Portlet。 但是對于 Liferay 7,我們必須使用片段作為 Hook。 請注意,片段是擴展的主機模塊,并且在部署時,片段模塊定義將合并在主機模塊中(僅當片段模塊不與主機模塊產生任何沖突時)。 如果發生任何類型的沖突,則直到其解決之前,片段都不會包含在主機模塊中。 片段沒有加載自己的類或捆綁程序激活器。 片段 jar 有自己的 OSGi 清單文件,該文件包含有關 OSGi 的信息。 請在下面找到`MANIFEST.MF`的重要信息: ``` Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Liferay Fragment Bundle-SymbolicName: azilen.login.fragment.module Bundle-Version: 1.0.0 Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Fragment-Host: com.liferay.login.web;bundle-version=1.0.5 Import-Package: org.apache.commons.logging;version=”1.0.4″ Export-Package: com.azilen.training;version=”1.0.0″ ``` 請在下面找到其關鍵屬性的詳細信息。 `Fragment-Host`:主機模塊的捆綁符號名稱 `Bundle-Version`:捆綁軟件的初始版本 `Bundle-Version`:人類可讀的片段模塊名稱 `Bundle-SymbolicName`:唯一標識 OSGi 容器中的片段。 `Import-Package`:片段中使用的外部軟件包 `Export-Package`:對其他模塊可見的片段包 **Liferay 7 使用片段來執行諸如以下操作**: 1. 覆蓋 Liferay OOTB 模塊的 JSP 2. 覆蓋語言屬性 3. 用 Servlet 過濾器覆蓋 HTTP 請求 4. 覆蓋 Liferay Struts 動作 5. 替代 Liferay 模態監聽器 6. 覆蓋 Liferay 動作命令 ## 如何在 Liferay 7 中創建片段 要將 Liferay 片段創建為模塊,請使用以下命令 ```java blade create -t fragment [-h hostBundleName] [-H hostBundleVersion] projectName ``` 請注意,我們必須使用`-t`參數將刀片模塊的類型指定為片段。 而`-h`參數將需要主機捆綁包符號名稱和`-H`參數將需要將被覆蓋的主機模塊版本。 最后一個`projectName`是人類友好的片段模塊名稱。 ## 如何覆蓋 Liferay OOTB 模塊的 JSP 讓我們來看一個用例:我想覆蓋 Liferay 登錄模塊,并且要根據自己的需求自定義外觀。 因此,要創建的`blade`命令如下: ```java blade create -t fragment -h com.liferay.login.web -H 1.0.5 login-fragment-module ``` 現在它將創建一個片段的骨架結構,您可以在`bnd.bnd`文件中看到主機模塊(登錄模塊)的符號名稱和版本。 可能會有一個查詢,說明如何查找主機模塊的符號名稱和版本。 為了獲得這些詳細信息,我們必須使用編寫的命令連接 gogo shell ```java telnet localhost 11311 ``` 然后運行`lb`命令,它將列出服務器中部署的所有模塊。 您可以找到帶有其狀態和版本的主機模塊。 ```java 219|Active | 10 | Liferay Login Web (1.0.5) ``` 現在我們的片段結構已經準備就緒,我們都可以重寫主機模塊 jsp。 由于我們需要覆蓋`login.jsp`,因此請從 `Liferay-src/modules/apps/foundation/login/loginweb/src/main/resources/METAINF/resources/login.jsp` 并將其粘貼到`login-fragmentmodule/src/main/resources/META-INF/resources/`中。 現在根據需要修改`login.jsp`并部署`login-fragment-module`,成功部署后,您應該在 OOTB 登錄模塊中進行更改 ## 如何覆蓋 Liferay DXP 的語言屬性 Liferay 支持多種語言。 因此,我們具有 OOTB 模塊的語言屬性。 假設我們要更改某些標簽,錯誤消息,成功消息等的屬性值。我們可以靈活地覆蓋這些屬性值,并且可以根據我們的要求進行更改。 讓我們來看一個用例:我們要更改登錄 Portlet 身份驗證失敗消息。 該消息的屬性是:`authentication-failed`。 我們想用我們的自定義消息覆蓋這些屬性。 ```java blade create -t mvcportlet -p com.azilen.fragment.language -c CustomLanguageComponent languagefragment-module ``` 請注意,此處創建的是`-t mvcportlet`而不是`-t fragment`,因為此處將使用 Resource bundle 類覆蓋語言屬性。 ```java CustomLanguageComponent.Java @Component( property = { "language.id=en_US" }, service = ResourceBundle.class ) public class CustomLanguageComponent extends ResourceBundle { ResourceBundle bundle = ResourceBundle.getBundle("content.Language",UTF8Control.INSTANCE); @Override protected Object handleGetObject(String key) { System.out.println("getting key"+key); return bundle.getObject(key); } @Override public Enumeration<String> getKeys() { return bundle.getKeys(); } } ``` 可以看出,我們正在創建擴展了`ResourceBundle`的自定義類`CustomLanguageComponent`,并在`@Component`注解中指定了屬性`{"language.id=en_US"}`。 我們指出要覆蓋`Language_en.properties`文件。 現在,在`/language-fragmentmodule/src/main/resources/content`下創建`Language_en.properties`,并使用我們的自定義消息添加身份驗證失敗的屬性。 ```java authentication-failed=Authentication failed. Please try again (customized). ``` 現在部署`language-fragment-module`,并且在登錄模塊中登錄過程失敗時,您將獲得自定義消息。 ## 如何使用 Servlet 過濾器覆蓋 有時,我們需要攔截 http 請求,并需要在該請求上編寫邏輯。 因此,我們可以使用`BaseFilter`實現它。 在這里,我們將攔截每個請求,僅在`processFilter`方法中打印日志。 ```java blade create -t mvcportlet -p com.azilen.custom.filter -c CustomFilterPortlet custom filterfragment-module CustomFilterPortlet.java @Component( immediate = true, property = { "dispatcher=REQUEST", "dispatcher=FORWARD", "servlet-context-name=", "servlet-filter-name=Custom Filter", "url-pattern=/*" }, service = Filter.class ) public class CustomFilterPortlet extends BaseFilter { private static final Log _log = LogFactoryUtil.getLog(CustomFilterPortlet.class); @Override protected void processFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws Exception { log.info(“Intercept request successfully !!!”); filterChain.doFilter(request, response); } } ``` 在這里,`CustomFilterPortlet`擴展了`BaseFilter`并覆蓋了`processFilter`方法,我們可以在其中編寫邏輯,并且必須在`@Component`屬性中將 url 模式指定為`url-pattern=/*`。 ## 如何覆蓋 Liferay Struts 動作 在 Liferay 6.2 和其他早期版本中,所有 Liferay 操作都由`struts-config.xml`中定義的 struts 操作處理。 另一方面,在 Liferay 7 DXP 中,大多數操作都在`ActionCommand`中進行了轉換。Liferay 7 仍然具有`struts-config.xml`中定義的一些支持動作。 如果要覆蓋該特定操作,則可以使用`StrutsAction.class`覆蓋它。 請注意,`StrutsAction.class`只能覆蓋`struts-config.xml`文件中定義的 struts 動作。 在這里,我們將覆蓋“條款和條件”操作,該操作在用戶首次登錄且必須接受條款和條件時執行。 ```java blade create -t mvcportlet -p com.azilen.custom.struts.action -c CustomTermsOfUseActionPortlet struts-action-fragment CustomTermsOfUseActionPortlet.Java @Component( immediate=true, property={ "path=/portal/update_terms_of_use" }, service = StrutsAction.class ) public class CustomTermsOfUseActionPortlet extends BaseStrutsAction { private static final Log _log = LogFactoryUtil.getLog(CustomTermsOfUseActionPortlet.class); @Override public String execute(StrutsAction originalStrutsAction, HttpServletRequest request, HttpServletResponse response)throws Exception { log.info("Calling Custom Termsof Use Action"); //you logic goes here return originalStrutsAction.execute(request, response); } } ``` 在這里,`CustomTermsOfUseActionPortlet`擴展了`BaseStrutsAction`并覆蓋了`executes`方法,我們可以在其中編寫自定義邏輯。 我們需要在`@Component`的屬性`"path=/portal/update_terms_of_use"`中指定要覆蓋的 struts 操作路徑。 ## 如何覆蓋 Liferay 模態監聽器 有時,我們可能需要覆蓋 Liferay 的 OOTB 實體,例如`User`,`Group`,`DLFileEntry `等,以執行`onAfterUpdate`或`onBeforeUpdate`之類的操作。 我們可以使用`BaseModelListener<T>`類覆蓋這些方法。 在這里,我們將覆蓋 Liferay `User`的`onAfterUpdate`方法,該方法將在更新任何用戶時執行。 ```java blade create -t mvcportlet -p com.azilen.modal.listener.portlet –c CustomUserModalListerPortlet custom-model-listener-module @Component( immediate = true, service = ModelListener.class ) public class CustomUserModalListerPortlet extends BaseModelListener<User> { @Override public void onAfterUpdate(User model) throws ModelListenerException { _log.info("user is updateing... !!!!"); super.onAfterUpdate(model); } private static final Log _log = LogFactoryUtil.getLog(CustomUserModalListerPortlet.class); } ``` 在這里`CustomUserModalListerPortlet`擴展了`BaseModelListener&lt;User&gt;`并覆蓋了`onAfterUpdate`方法,在這里我們可以編寫自定義邏輯。 我們需要在`@Component`中將服務屬性值定義為`ModelListener.class`。 自定義 Liferay DXP 開放源代碼以開發高度可擴展的現代應用程序具有極大的可能性。 程序員發現 Lifera 7 非常有趣,因為它使編碼成為基于創意和邏輯思考的過程。 結果, [Liferay DXP 開發](http://www.azilen.com/technology/enterprise-web/liferay/)在開發人員和行業中都越來越受歡迎。 **作者簡介**: Sandip Patel 是一名技術愛好者,并且是擁有 7 年以上經驗的 Liferay & MongoDB 認證專家。 他正在與 [Azilen Technologies](http://www.azilen.com/) 合作,并且喜歡隨時了解最新的 Liferay 技術和創新。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看