How to use "includes" in OpenCms

Constructing a page by combining different elements is an often used approach for web site building. There are many options to achieve this with OpenCms, which are explained below:

Preferred ways of including

Directive based inclusion with <%@ include file="..." %>

In case you just want to statically include a file at compile time, you can use the standard directive <%@ include file="..." %>.

To include a file from within the VFS, you have to add the path to the included file in a special makro, to use the benifits of the content relationship engine. For example if you want to include the file "/system/modules/mymodule/elements/myjsp.jsp" you have to use it within a mako like this: <%@ include file="%(link.strong:/system/modules/mymodule/elements/myjsp.jsp)" %>

Keep in mind that OpenCms will automatically translate the given file name to /WEB-INF/jsp/{on/offline}/{original-filename}, so all inclusions happen from the "real" FS, not from the VFS. That translation will happen while the JSP is written from the VFS to the "real" FS. OpenCms will insure that all files referenced by <%@ include file= "..." %> directives will also be written to the "real" FS.
Please note: The XML - translation form of this directive <jsp:directive.include file="..." /> is currently NOT supported!

Use the <cms:include page="..." /> tag

This tag is part of the OpenCms standard taglib. It is the best method of including elements in an OpenCms based application during runtime. Usage of <cms:include> also enables the FlexCache to separately cache the included sub - element, which can result in much faster page delivery times. For a complete description of all the tags options, please see the OpenCms taglib documentation available from Alkacon as a separate module.

Use the include() method of the class CmsJspActionElement

This executes the same code as using the <cms:include> tag, but it can be used directly inside a JSP scriptlet. You just have to create an instance of the JavaBean org.opencms.jsp.CmsJspActionElement and use the provided methods. This option also supports the FlexCache and all the other options that the tag version supports. Again, for a complete description please see the OpenCms scriptlet documentation available from Alkacon as a separate module.

Options not recommended

JSP inclusion with <jsp:include page="..." />

The short version: Tests have shown that this will not work reliable in all servlet containers or container versions even when used as pointed out below, so we do not recommend using this option. Use the OpenCms <cms:include> tag instead.

The long version: Using <jsp:include page="..." /> in OpenCms managed JSP is a tricky issue. The point is the OpenCms servlet which always comes first and then dispatches to the JSP. This additional servlet "confuses" the container, so using something like <jsp:include page..." /> will sometimes give an undefined result. To overcome some of this issues, a new directive <%@ cms file="..." %> has been introduced. This directive is replaced with the filename on the "real" FS when OpenCms parses and dumps the file initially from the VFS to the "real" FS. So you could actually use <jsp:include page="<%@ cms file="/index.jsp"%>" flush="false" /> to achieve the wanted results. The FlexCache is bypassed when using this approach. You must set flush="false" because in the current implementation OpenCms is not able to handle flush="true".

In case you find this mind-boggling, just use <cms:include page="..." /> instead.

The tag <c:import /> from the JSTL for local files

The JSTL adds a new way of doing inclusions with the <c:import /> tag. There is a whole set of examples available in the com.alkacon.documentation.examples_jstl module. It turns out that using <c:import /> works fine when used with external URLs. However, importing local / relative URLs is subject to the same issues as using <jsp:include page="..." />, so you have to use <%@ cms file="..." %> around filenames here as well.

Again, the recommended way of doing file inclusions in OpenCms is using the <cms:include page="..." /> tag!