The
liferay-util:dynamic-include
tag
is placeholder into which you can inject content. Every JSP’s dynamic include
tag is an extension point for inserting content (e.g., JavaScript code, HTML,
and more). To do this, create a module that has content you want to insert,
register that content with the dynamic include tag, and deploy your module.
Blogs entries contain a good example of how dynamic includes work. For reference, you can download the example module.
Follow these steps:
-
Find the
liferay-util:dynamic-include
tag where you want to insert content and note the tag’s key.The Blogs app’s
view_entry.jsp
has a dynamic include tag at the top and another at the very bottom.<%@ include file="/blogs/init.jsp" %> <liferay-util:dynamic-include key="com.liferay.blogs.web#/blogs/view_entry.jsp#pre" /> ... JSP content is here <liferay-util:dynamic-include key="com.liferay.blogs.web#/blogs/view_entry.jsp#post" />
Here are the Blogs view entry dynamic include keys:
key="com.liferay.blogs.web#/blogs/view_entry.jsp#pre"
key="com.liferay.blogs.web#/blogs/view_entry.jsp#post"
-
Create a module (e.g.,
blade create my-dynamic-include
). The module will hold your dynamic include implementation. -
Specify compile-only dependencies, like these Gradle dependencies, in your module build file:
dependencies { compileOnly group: "javax.portlet", name: "portlet-api", version: "2.0" compileOnly group: "javax.servlet", name: "javax.servlet-api", version: "3.0.1" compileOnly group: "com.liferay", name: "com.liferay.petra.string", version: "1.0.0" compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "2.0.0" compileOnly group: "org.osgi", name: "osgi.cmpn", version: "6.0.0" }
-
Create an OSGi component class that implements the
DynamicInclude
interface.Here’s an example dynamic include implementation for Blogs:
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.osgi.service.component.annotations.Component; import com.liferay.portal.kernel.servlet.taglib.DynamicInclude; @Component( immediate = true, service = DynamicInclude.class ) public class BlogsDynamicInclude implements DynamicInclude { @Override public void include( HttpServletRequest request, HttpServletResponse response, String key) throws IOException { PrintWriter printWriter = response.getWriter(); printWriter.println( "<h2>Added by Blogs Dynamic Include!</h2><br />"); } @Override public void register(DynamicIncludeRegistry dynamicIncludeRegistry) { dynamicIncludeRegistry.register( "com.liferay.blogs.web#/blogs/view_entry.jsp#pre"); } }
Giving the class an
@Component
annotation that has the service attributeservice = DynamicInclude.class
makes the class aDynamicInclude
service component.@Component( immediate = true, service = DynamicInclude.class )
In the
include
method, add your content. The exampleinclude
method writes a heading.@Override public void include( HttpServletRequest request, HttpServletResponse response, String key) throws IOException { PrintWriter printWriter = response.getWriter(); printWriter.println( "<h2>Added by Blogs Dynamic Include!</h2><br />"); }
In the
register
method, specify the dynamic include tag to use. The example register method targets the dynamic include at the top of the Blogsview_entry.jsp
.@Override public void register(DynamicIncludeRegistry dynamicIncludeRegistry) { dynamicIncludeRegistry.register( "com.liferay.blogs.web#/blogs/view_entry.jsp#pre"); }
Once you’ve deployed your module, the JSP dynamically includes your content. Congratulations on injecting dynamic content into a JSP!