blob: f684ec8178e3e84e22064a84c25091c5dcad2066 [file] [log] [blame]
<!doctype html>
<!-- Generated by FreeMarker/Docgen from DocBook -->
<html lang="en" class="page-type-section">
<head prefix="og: http://ogp.me/ns#">
<meta charset="utf-8">
<title>Basics - Apache FreeMarker Manual</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="format-detection" content="telephone=no">
<meta property="og:site_name" content="Apache FreeMarker Manual">
<meta property="og:title" content="Basics">
<meta property="og:locale" content="en_US">
<meta property="og:url" content="https://freemarker.apache.org/docs/pgui_datamodel_basics.html">
<link rel="canonical" href="https://freemarker.apache.org/docs/pgui_datamodel_basics.html">
<link rel="icon" href="favicon.png" type="image/png">
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto:500,700,400,300|Droid+Sans+Mono">
<link rel="stylesheet" type="text/css" href="docgen-resources/docgen.min.css?1707770044859">
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/cookie-bar/cookiebar-latest.min.js"></script>
</head>
<body itemscope itemtype="https://schema.org/Code">
<meta itemprop="url" content="https://freemarker.apache.org/docs/">
<meta itemprop="name" content="Apache FreeMarker Manual">
<!--[if lte IE 9]>
<div class="oldBrowserWarning" style="display: block">
Unsupported web browser - Use a modern browser to view this website!
</div>
<![endif]--> <div class="oldBrowserWarning">
Unsupported web browser - Use a modern browser to view this website!
</div>
<div class="header-top-bg"><div class="site-width header-top"><div id="hamburger-menu" role="button"></div> <div class="logo">
<a href="https://freemarker.apache.org" role="banner"><img itemprop="image" src="logo.png" alt="FreeMarker"></a> </div>
<ul class="tabs"><li><a href="https://freemarker.apache.org/">Home</a></li><li class="current"><a href="index.html">Manual</a></li><li><a class="external" href="api/index.html">Java API</a></li></ul><ul class="secondary-tabs"><li><a class="tab icon-heart" href="https://freemarker.apache.org/contribute.html" title="Contribute"><span>Contribute</span></a></li><li><a class="tab icon-bug" href="https://issues.apache.org/jira/projects/FREEMARKER" title="Report a Bug"><span>Report a Bug</span></a></li><li><a class="tab icon-download" href="https://freemarker.apache.org/freemarkerdownload.html" title="Download"><span>Download</span></a></li></ul></div></div><div class="header-bottom-bg"><div class="site-width search-row"><a href="index.html" class="navigation-header">Manual</a><div class="navigation-header"></div><form method="get" class="search-form" action="search-results.html"><fieldset><legend class="sr-only">Search form</legend><label for="search-field" class="sr-only">Search query</label><input id="search-field" name="q" type="search" class="search-input" placeholder="Search" spellcheck="false" autocorrect="off" autocomplete="off"><button type="submit" class="search-btn"><span class="sr-only">Search</span></button></fieldset></form></div><div class="site-width breadcrumb-row"> <div class="breadcrumbs">
<ul class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList"><li class="step-0" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="index.html"><span itemprop="name">Apache FreeMarker Manual</span></a></li><li class="step-1" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="pgui.html"><span itemprop="name">Programmer&#39;s Guide</span></a></li><li class="step-2" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="pgui_datamodel.html"><span itemprop="name">The Data Model</span></a></li><li class="step-3" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="pgui_datamodel_basics.html"><span itemprop="name">Basics</span></a></li></ul> </div>
<div class="bookmarks" title="Bookmarks"><span class="sr-only">Bookmarks:</span><ul><li><a href="alphaidx.html">Alpha. index</a></li><li><a href="gloss.html">Glossary</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions</a></li><li><a href="ref_builtins_alphaidx.html">?builtins</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_specvar.html">.spec_vars</a></li><li><a href="app_faq.html">FAQ</a></li></ul></div></div></div> <div class="main-content site-width">
<div class="content-wrapper">
<div id="table-of-contents-wrapper" class="col-left">
<script>var breadcrumb = ["Apache FreeMarker Manual","Programmer\'s Guide","The Data Model","Basics"];</script>
<script src="toc.js?1707770044859"></script>
<script src="docgen-resources/main.min.js?1707770044859"></script>
</div>
<div class="col-right"><div class="page-content"><div class="page-title"><div class="pagers top"><a class="paging-arrow previous" href="pgui_datamodel.html"><span>Previous</span></a><a class="paging-arrow next" href="pgui_datamodel_scalar.html"><span>Next</span></a></div><div class="title-wrapper">
<h1 class="content-header header-section1" id="pgui_datamodel_basics" itemprop="headline">Basics</h1>
</div></div><p>You have seen how to build a data-model in the <a href="pgui_quickstart.html">Getting Started</a> using the standard
Java classes (<code class="inline-code">Map</code>, <code class="inline-code">String</code>,
etc.). Internally, the variables available in the template are Java
objects that implement the
<code class="inline-code">freemarker.template.TemplateModel</code> interface. But
you could use standard Java collections as variables in your
data-model, because these were replaced with the appropriate
<code class="inline-code">TemplateModel</code> instances behind the scenes. This
facility is called <strong>object wrapping</strong>.
The object wrapping facility can convert <em>any</em> kind
of object transparently to the instances of classes that implement
<code class="inline-code">TemplateModel</code> interface. This makes it possible,
for example, to access <code class="inline-code">java.sql.ResultSet</code> as
sequence variable in templates, or to access
<code class="inline-code">javax.servlet.ServletRequest</code> objects as a hash
variable that contains the request attributes, or even to traverse XML
documents as FTL variables (<a href="xgui.html">see here</a>). To
wrap (convert) these objects, however, you need to plug the proper
<code class="inline-code">ObjectWrapper</code> implementation (possibly your custom
implementation); this will be discussed <a href="pgui_datamodel_objectWrapper.html">later</a>. The point for now
is that any object that you want to access from the templates, sooner
or later must be converted to an object that implements
<code class="inline-code">TemplateModel</code> interface. So first you should
familiarize yourself with writing of <code class="inline-code">TemplateModel</code>
implementations.</p><p>There is roughly one
<code class="inline-code">freemarker.template.TemplateModel</code> descendant
interface corresponding to each basic type of variable
(<code class="inline-code">TemplateHashModel</code> for hashes,
<code class="inline-code">TemplateSequenceModel</code> sequences,
<code class="inline-code">TemplateNumberModel</code> for numbers, etc.). For
example, if you want to expose a <code class="inline-code">java.sql.ResultSet</code>
as a sequence for the templates, then you have to write a
<code class="inline-code">TemplateSequenceModel</code> implementation that can read
<code class="inline-code">java.sql.ResultSet</code>-s. We used to say on this, that
you <em>wrap</em> the
<code class="inline-code">java.sql.ResultSet</code> with your
<code class="inline-code">TemplateModel</code> implementation, as basically you just
encapsulate the <code class="inline-code">java.sql.ResultSet</code> to provide
access to it with the common <code class="inline-code">TemplateSequenceModel</code>
interface. Note that a class can implement multiple
<code class="inline-code">TemplateModel</code> interfaces; this is why FTL variables
can have multiple types (see: <a href="dgui_datamodel_basics.html">Template Author&#39;s Guide/Values, Types/Basics</a>)</p><p>Note that a trivial implementation of these interfaces is
provided with the <code class="inline-code">freemarker.template</code> package. For
example, to convert a <code class="inline-code">String</code> to FTL string
variable, you can use <code class="inline-code">SimpleScalar</code>, to convert a
<code class="inline-code">java.util.Map</code> to FTL hash variable, you can use
<code class="inline-code">SimpleHash</code>, etc.</p><p>An easy way to try your own <code class="inline-code">TemplateModel</code>
implementation, is to create an instance of that, and drop it directly
into the data-model (as <code class="inline-code">put</code> it into the root hash).
The object wrapper will expose it untouched for the template, as it
already implements <code class="inline-code">TemplateModel</code>, so no conversion
(wrapping) needed. (This trick is also useful in cases when you do not
want the object wrapper to try to wrap (convert) a certain
object.)</p><div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="pgui_datamodel.html"><span>Previous</span></a><a class="paging-arrow next" href="pgui_datamodel_scalar.html"><span>Next</span></a></div></div></div></div> </div>
</div>
<div class="site-footer"><div class="site-width"><div class="footer-top"><div class="col-left sitemap"><div class="column"><h3 class="column-header">Overview</h3><ul><li><a href="https://freemarker.apache.org/">What is FreeMarker?</a></li><li><a href="https://freemarker.apache.org/freemarkerdownload.html">Download</a></li><li><a href="app_versions.html">Version history</a></li><li><a href="app_faq.html">FAQ</a></li><li><a itemprop="license" href="app_license.html">License</a></li><li><a href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy policy</a></li></ul></div><div class="column"><h3 class="column-header">Often used / Reference</h3><ul><li><a href="https://try.freemarker.apache.org/">Try template online</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions cheatsheet</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_builtins_alphaidx.html">?built_ins</a></li><li><a href="ref_specvar.html">.special_vars</a></li><li><a href="api/freemarker/core/Configurable.html#setSetting-java.lang.String-java.lang.String-">Configuration settings</a></li></ul></div><div class="column"><h3 class="column-header">Community</h3><ul><li><a href="https://github.com/apache/freemarker">Github project page</a></li><li><a href="https://issues.apache.org/jira/projects/FREEMARKER">Report a bug</a></li><li><a href="https://freemarker.apache.org/report-security-vulnerabilities.html">Report security vulnerability</a></li><li><a href="https://stackoverflow.com/questions/ask?tags=freemarker">Get help on StackOverflow</a></li><li><a href="https://twitter.com/freemarker">Announcements on Twitter</a></li><li><a href="https://freemarker.apache.org/mailing-lists.html">Discuss on mailing lists</a></li></ul></div></div><div class="col-right"><ul class="social-icons"><li><a class="github" href="https://github.com/apache/freemarker">Github</a></li><li><a class="twitter" href="https://twitter.com/freemarker">Twitter</a></li><li><a class="stack-overflow" href="https://stackoverflow.com/questions/ask?tags=freemarker">Stack Overflow</a></li></ul><a class="xxe" href="http://www.xmlmind.com/xmleditor/" rel="nofollow" title="Edited with XMLMind XML Editor"><span>Edited with XMLMind XML Editor</span></a></div></div><div class="footer-bottom"> <p class="last-generated">
Last generated:
<time itemprop="dateModified" datetime="2024-02-12T20:34:04Z" title="Monday, February 12, 2024 at 8:34:04 PM Greenwich Mean Time">2024-02-12 20:34:04 GMT</time>, for Freemarker 2.3.32 </p>
<p class="copyright">
© <span itemprop="copyrightYear">1999</span>–2024
<a itemtype="http://schema.org/Organization" itemprop="copyrightHolder" href="https://apache.org/">The Apache Software Foundation</a>. Apache FreeMarker, FreeMarker, Apache Incubator, Apache, the Apache FreeMarker logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners. </p>
</div></div></div></body>
</html>