<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>How to link my page created programatically to its own module</title>
  <link rel="self" href="https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=111399208" />
  <subtitle>How to link my page created programatically to its own module</subtitle>
  <id>https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=111399208</id>
  <updated>2026-04-04T04:18:51Z</updated>
  <dc:date>2026-04-04T04:18:51Z</dc:date>
  <entry>
    <title>RE: How to link my page created programatically to its own module</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=111491423" />
    <author>
      <name>João Machado</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=111491423</id>
    <updated>2018-11-08T14:00:14Z</updated>
    <published>2018-11-08T14:00:14Z</published>
    <summary type="html">&lt;p&gt;Thank you, David.&lt;/p&gt;
&lt;p&gt;But i needed to create the layout for the newly created page also, so
  i can add pages with portlets without using the portal interface.&lt;/p&gt;
&lt;p&gt;For that purpose i needed to have the ThemeDisplay available, how
  would i use this to be able to access it when loading the pre event?&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;I tried to use com.liferay.portal.instance.lifecycle, but on runtime
  i get an exception.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;2018-11-08 11:44:24.433 ERROR [Framework Event Dispatcher: Equinox
  Container: 50154a96-4be3-0018-13d4-a86dbed45c57][com_startup:97]
  FrameworkEvent ERROR &lt;br /&gt; org.osgi.framework.BundleException: Could
  not resolve module: com.startup [1051]_  Unresolved requirement:
  Import-Package: com.liferay.portal.instance.lifecycle;
  version=&amp;quot;[2.0.0,3.0.0)&amp;quot;_ [Sanitized]&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;On compilation, the jar is there as you can see, and it is both
  present on bnd.bnd and build.gradle.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</summary>
    <dc:creator>João Machado</dc:creator>
    <dc:date>2018-11-08T14:00:14Z</dc:date>
  </entry>
  <entry>
    <title>RE: How to link my page created programatically to its own module</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=111483652" />
    <author>
      <name>Dave Truong</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=111483652</id>
    <updated>2018-11-08T04:53:35Z</updated>
    <published>2018-11-08T04:53:35Z</published>
    <summary type="html">Here is a sample project that adds a portlet to a page: https://github.com/david-truong/joao</summary>
    <dc:creator>Dave Truong</dc:creator>
    <dc:date>2018-11-08T04:53:35Z</dc:date>
  </entry>
  <entry>
    <title>RE: How to link my page created programatically to its own module</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=111479438" />
    <author>
      <name>João Machado</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=111479438</id>
    <updated>2018-11-07T14:25:14Z</updated>
    <published>2018-11-07T14:25:14Z</published>
    <summary type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;Hello to all,&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;could anyone assist me in this topic, please?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I am trying to use portal startup events to deploy my pages. (following:&amp;nbsp;https://github.com/jmrmm-eurohelp/startupLiferay)&lt;/p&gt;
&lt;p&gt;How can i achieve this? Per documentation as follows:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;
  &lt;a href="https://dev.liferay.com/en/develop/reference/-/knowledge_base/7-1/liferay-startup-phases#portal-context-initialization-phase" id="portal-context-initialization-phase"&gt;Portal Context
    Initialization Phase&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Portal Context Initialization phase runs first with these tasks:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Set up low level utilities such as logging and those in&amp;nbsp;&lt;a href="https://docs.liferay.com/ce/portal/7.1-latest/javadocs/portal-kernel/com/liferay/portal/kernel/util/PortalUtil.html"&gt;&lt;code&gt;PortalUtil&lt;/code&gt;&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="https://docs.liferay.com/ce/portal/7.1-latest/javadocs/portal-impl/com/liferay/portal/util/InitUtil.html"&gt;&lt;code&gt;InitUtil&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;OSGi framework is initialized.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Spring Phase 1: INFRASTRUCTURE beans specified by the Spring
      context files listed in Portal property&amp;nbsp;&lt;a href="https://docs.liferay.com/ce/portal/7.1-latest/propertiesdoc/portal.properties.html#Spring"&gt;&lt;code&gt;spring.infrastructure.configs&lt;/code&gt;&lt;/a&gt;&amp;nbsp;are loaded.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;INFRASTRUCTURE beans are published as&amp;nbsp;&lt;a href="https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-1/osgi-services-and-dependency-injection-with-declarative-services"&gt;OSGi services&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;OSGi framework starts.&lt;/p&gt;
    &lt;ol&gt;
      &lt;li&gt;Static bundles are installed and started.&lt;/li&gt;
      &lt;li&gt;Dynamic bundles are started.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;OSGi framework starts the runtime.&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Spring Phase 2: MAIN&lt;/p&gt;
    &lt;ol&gt;
      &lt;li&gt;Load Spring beans specified by the Spring context files listed
        in Portal property&amp;nbsp;&lt;a href="https://docs.liferay.com/ce/portal/7.1-latest/propertiesdoc/portal.properties.html#Spring"&gt;&lt;code&gt;spring.configs&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;A&amp;nbsp;&lt;a href="https://dev.liferay.com/en/develop/reference/-/knowledge_base/7-1/liferay-startup-phases#moduleservicelifecycle-events"&gt;&lt;code&gt;ModuleServiceLifecycle&lt;/code&gt;&amp;nbsp;event
        service&lt;/a&gt;&amp;nbsp;with a service
          property&amp;nbsp;&lt;code&gt;module.service.lifecycle&lt;/code&gt;&amp;nbsp;value&amp;nbsp;&lt;code&gt;spring.initialized&lt;/code&gt;&amp;nbsp;(i.e.,&amp;nbsp;&lt;a href="https://docs.liferay.com/ce/portal/7.1-latest/javadocs/portal-kernel/constant-values.html#com.liferay.portal.kernel.module.framework.ModuleServiceLifecycle.SPRING_INITIALIZED"&gt;&lt;code&gt;SPRING_INITIALIZED&lt;/code&gt;&lt;/a&gt;) registers.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;MAIN Spring beans are published as&amp;nbsp;&lt;a href="https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-1/osgi-services-and-dependency-injection-with-declarative-services"&gt;OSGi services&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/body&gt;&lt;/html&gt;</summary>
    <dc:creator>João Machado</dc:creator>
    <dc:date>2018-11-07T14:25:14Z</dc:date>
  </entry>
  <entry>
    <title>RE: How to link my page created programatically to its own module</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=111431287" />
    <author>
      <name>João Machado</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=111431287</id>
    <updated>2018-11-02T10:16:48Z</updated>
    <published>2018-11-02T10:16:48Z</published>
    <summary type="html">&lt;blockquote&gt;Minhchau Dang&lt;blockquote&gt;Liferay has a utility method, &lt;a href="https://github.com/liferay/liferay-portal/blob/7.1.0-ga1/portal-kernel/src/com/liferay/portal/kernel/util/DefaultLayoutPrototypesUtil.java#L114-L129"&gt;DefaultLayoutPrototypesUtil.addPortletId&lt;/a&gt;, that it uses when it creates page templates. I don&amp;#39;t see any code that looks specific to page templates (so in theory, it can be used for any page), so you should be able to use it in your own custom code in order to add portlets to pages.&lt;br /&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;Thank you, Minhchau,&lt;br /&gt;&lt;br /&gt;how would i use this method in my created page? As where in the code that generates the page? The portlet is already in the module that calls the programatically generated page. Its unclear to me.&lt;br /&gt;&lt;br /&gt;ThemeDisplay themeDisplay =(ThemeDisplay)request.getAttribute(WebKeys.THEME_DISPLAY);&lt;br /&gt;String layoutPrototypeId = DefaultLayoutPrototypesUtil.addPortletId(themeDisplay.getLayout(), themeDisplay.getPortletDisplay().getId(), themeDisplay.getPortletDisplay().getColumnId());&lt;br /&gt;System.out.println(layoutPrototypeId);&lt;br /&gt;&lt;br /&gt;This generates a java.lang.NullPointerException&lt;br /&gt;&lt;br /&gt;And when i try with a hard coded layoutprototypeID i get this stacktrace...&lt;br /&gt;&lt;br /&gt;2018-11-05 10:16:57.801 ERROR [http-nio-8081-exec-1][VirtualHostFilter:375] java.lang.IllegalArgumentException: Path [web/guest/home] does not start with a &amp;#34;/&amp;#34; character&lt;br /&gt;java.lang.IllegalArgumentException: Path [web/guest/home] does not start with a &amp;#34;/&amp;#34; character&lt;br /&gt;    at org.apache.catalina.core.ApplicationContext.getRequestDispatcher(ApplicationContext.java:404)&lt;br /&gt;    at org.apache.catalina.core.ApplicationContextFacade.getRequestDispatcher(ApplicationContextFacade.java:222)&lt;br /&gt;    at com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.processFilter(VirtualHostFilter.java:370)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)&lt;br /&gt;    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)&lt;br /&gt;    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)&lt;br /&gt;    at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)&lt;br /&gt;    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389)&lt;br /&gt;    at com.liferay.portal.servlet.filters.urlrewrite.UrlRewriteFilter.processFilter(UrlRewriteFilter.java:65)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:168)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:168)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)&lt;br /&gt;    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:100)&lt;br /&gt;    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)&lt;br /&gt;    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)&lt;br /&gt;    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)&lt;br /&gt;    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)&lt;br /&gt;    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)&lt;br /&gt;    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)&lt;br /&gt;    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)&lt;br /&gt;    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)&lt;br /&gt;    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)&lt;br /&gt;    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)&lt;br /&gt;    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)&lt;br /&gt;    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)&lt;br /&gt;    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)&lt;br /&gt;    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)&lt;br /&gt;    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)&lt;br /&gt;    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)&lt;br /&gt;    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)&lt;br /&gt;    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)&lt;br /&gt;    at java.lang.Thread.run(Thread.java:748)&lt;br /&gt;&lt;br /&gt;I have made available my snippet of code here, please share your insights.&lt;br /&gt;https://github.com/jmrmm-eurohelp/liferay&lt;br /&gt;&lt;br /&gt;Would this be an option also?&lt;br /&gt;https://community.liferay.com/forums/-/message_boards/message/106173&lt;br /&gt;&lt;br /&gt;Kind regards.</summary>
    <dc:creator>João Machado</dc:creator>
    <dc:date>2018-11-02T10:16:48Z</dc:date>
  </entry>
  <entry>
    <title>RE: How to link my page created programatically to its own module</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=111411655" />
    <author>
      <name>Minhchau Dang</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=111411655</id>
    <updated>2018-10-31T23:13:05Z</updated>
    <published>2018-10-31T23:13:05Z</published>
    <summary type="html">&lt;blockquote&gt;João Machado&lt;br /&gt;&lt;br /&gt;I have this difficulty, i dont understand how to associate my content of the module (a simple Hello from &amp;#34;xpto&amp;#34;) to the newly created page where i have the code.&lt;/blockquote&gt;&lt;br /&gt;Liferay has a utility method, &lt;a href="https://github.com/liferay/liferay-portal/blob/7.1.0-ga1/portal-kernel/src/com/liferay/portal/kernel/util/DefaultLayoutPrototypesUtil.java#L114-L129"&gt;DefaultLayoutPrototypesUtil.addPortletId&lt;/a&gt;, that it uses when it creates page templates. I don&amp;#39;t see any code that looks specific to page templates (so in theory, it can be used for any page), so you should be able to use it in your own custom code in order to add portlets to pages.</summary>
    <dc:creator>Minhchau Dang</dc:creator>
    <dc:date>2018-10-31T23:13:05Z</dc:date>
  </entry>
  <entry>
    <title>How to link my page created programatically to its own module</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=111399207" />
    <author>
      <name>João Machado</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=111399207</id>
    <updated>2018-10-31T12:28:43Z</updated>
    <published>2018-10-31T12:28:43Z</published>
    <summary type="html">Hello, everyone, i am using Liferay 7.1 and trying to implement a page creation programatically, and i managed that already. I have this difficulty, i dont understand how to associate my content of the module (a simple Hello from &amp;#34;xpto&amp;#34;) to the newly created page where i have the code. When i access the page via friendly URL, the page is blank. Please help me. Kind regards.&lt;br /&gt;&lt;br /&gt;I really need your help, friends, please advise.</summary>
    <dc:creator>João Machado</dc:creator>
    <dc:date>2018-10-31T12:28:43Z</dc:date>
  </entry>
</feed>
