Servlet mapping specifies which servlet should be invoked when the client requests a particular URL. In Magnolia, servlet mappings are typically configured in /server/filters/servlets
. This is a static way. While creating a component (Java class or Freemarker script), the path to a servlet is hard-coded. When the mapping changes, the hard-coded string literal must be changed too and the software must be re-deployed. To work around this limitation, use dynamic servlet mapping. Magnolia 5.3+
Dynamic mapping with SelfMappingServlet
The
String getSelfMappingPath();
Implement the interface in your own servlet. Instead of returning a hard-coded literal, return something originating in a configuration. Any other Java class such as a model class used in a Freemarker script can then read the value.
Example: DamDownloadServlet
Other components in the system may need to know about servlet mappings. This is the case when generating links for the DAM servlet. DamDownloadServlet
implements the SelfMappingServlet
interface:
public class DamDownloadServlet extends HttpServlet implements SelfMappingServlet { // ... more code here (this is just a snippet) @Inject public DamDownloadServlet(final DamCoreConfiguration configuration, final AssetProviderRegistry assetProviderRegistry) { this.configuration = configuration; this.assetProviderRegistry = assetProviderRegistry; } @Override public String getSelfMappingPath() { return configuration.getDownloadPath() + "/*"; } }
The getSelfMappingPath()
method returns a value which comes from the DamCoreConfiguration
- which could be injected into any other class, too. DamCoreConfiguration#getDownloadPath()
is also used in JcrAssetProvider
to construct paths for links:
// ... more code here (this is just a snippet) public String getLink(final Asset asset) { final String contextPath = MgnlContext.getContextPath(); return contextPath + configuration.getDownloadPath() + asset.getItemKey().asString() + "/" + asset.getFileName(); }
If for whatever reason the mapped path to the DamDownloadServlet
must be changed, there is only one place where the path is adapted: /modules/dam/config/downloadPath
in module configuration. The code of DamDownloadServlet
and JcrAssetProvider
remain the same. This means you don't need to re-deploy the application. You only need to change configuration on the running system.
You won't find anything at /modules/dam/config/downloadPath
because DamCoreConfiguration#getDownloadPath()
has a default value.