blob: b2d483c7b4924ab58ff1867ae379f51ebab4bf88 [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>The data-model at a glance - 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="The data-model at a glance">
<meta property="og:locale" content="en_US">
<meta property="og:url" content="https://freemarker.apache.org/docs/dgui_quickstart_datamodel.html">
<link rel="canonical" href="https://freemarker.apache.org/docs/dgui_quickstart_datamodel.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="dgui.html"><span itemprop="name">Template Author&#39;s Guide</span></a></li><li class="step-2" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="dgui_quickstart.html"><span itemprop="name">Getting Started</span></a></li><li class="step-3" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="dgui_quickstart_datamodel.html"><span itemprop="name">The data-model at a glance</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","Template Author\'s Guide","Getting Started","The data-model at a glance"];</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="dgui_quickstart_basics.html"><span>Previous</span></a><a class="paging-arrow next" href="dgui_quickstart_template.html"><span>Next</span></a></div><div class="title-wrapper">
<h1 class="content-header header-section1" id="dgui_quickstart_datamodel" itemprop="headline">The data-model at a glance</h1>
</div></div><p>As you have seen, the data-model is basically a tree. This tree
can be arbitrarily complicated and deep, for example:</p>
<div class="code-block role-data-model">
<div class="code-block-label">Data Model</div><pre class="code-block-body"><a name="example.qStart.dataModelWithHashes"></a>(root)
|
+- animals
| |
| +- mouse
| | |
| | +- size = &quot;small&quot;
| | |
| | +- price = 50
| |
| +- elephant
| | |
| | +- size = &quot;large&quot;
| | |
| | +- price = 5000
| |
| +- python
| |
| +- size = &quot;medium&quot;
| |
| +- price = 4999
|
+- message = &quot;It is a test&quot;
|
+- misc
|
+- foo = &quot;Something&quot;</pre> </div>
<p>The variables that act like directories (the root,
<code class="inline-code">animals</code>, <code class="inline-code">mouse</code>,
<code class="inline-code">elephant</code>, <code class="inline-code">python</code>,
<code class="inline-code">misc</code>) are called <strong>hashes</strong>. Hashes store other variables (the so
called <a name="topic.dataModel.subVar"></a><em>sub
variables</em>) by a lookup name (e.g., "animals",
"mouse" or "price").</p><p>The variables that store a single value
(<code class="inline-code">size</code>, <code class="inline-code">price</code>,
<code class="inline-code">message</code> and <code class="inline-code">foo</code>) are called
<strong>scalars</strong>.</p><p><a name="topic.qStart.accessVariables"></a>When you want to
use a subvariable in a template, you specify its path from the root,
and separate the steps with dots. To access the
<code class="inline-code">price</code> of a <code class="inline-code">mouse</code>, you start from
the root and go into <code class="inline-code">animals</code>, and then go into
<code class="inline-code">mouse</code> then go into <code class="inline-code">price</code>. So you
write <code class="inline-code">animals.mouse.price</code>.</p><p>Another important kind of variables are <strong>sequences</strong>. They store subvariables like hashes,
but here subvariables doesn&#39;t have a name, they are just items in a
list. For example, in this data-model, <code class="inline-code">animals</code> and
<code class="inline-code">misc.fruits</code> are sequences:</p>
<div class="code-block role-data-model">
<div class="code-block-label">Data Model</div><pre class="code-block-body"><a name="example.qStart.dataModelWithSequences"></a>(root)
|
+- animals
| |
| +- (1st)
| | |
| | +- name = &quot;mouse&quot;
| | |
| | +- size = &quot;small&quot;
| | |
| | +- price = 50
| |
| +- (2nd)
| | |
| | +- name = &quot;elephant&quot;
| | |
| | +- size = &quot;large&quot;
| | |
| | +- price = 5000
| |
| +- (3rd)
| |
| +- name = &quot;python&quot;
| |
| +- size = &quot;medium&quot;
| |
| +- price = 4999
|
+- misc
|
+- fruits
|
+- (1st) = &quot;orange&quot;
|
+- (2nd) = &quot;banana&quot;</pre> </div>
<p>To access a subvariable of a sequence you use a numerical index
in square brackets. Indexes start from 0 (it&#39;s a programmer tradition
to start with 0), thus the index of the 1st item is 0, the index of
the 2nd item is 1, and so on. So to get the name of the first animal
you write <code class="inline-code">animals[0].name</code>. To get the second item
in <code class="inline-code">misc.fruits</code> (the string
<code class="inline-code">&quot;banana&quot;</code>) you write
<code class="inline-code">misc.fruits[1]</code>. (In practice, you usually just walk
through sequences in order, not caring about the index, but that will
be <a href="dgui_quickstart_template.html#topic.tutorial.list">shown later</a>.)</p><p>Scalars can be further divided into these categories:</p><ul>
<li>
<p>String: Text, that is, an arbitrary sequence of characters
such as &#39;&#39;m&#39;&#39;, &#39;&#39;o&#39;&#39;, &#39;&#39;u&#39;&#39;, &#39;&#39;s&#39;&#39;, &#39;&#39;e&#39;&#39; above. For example the
<code class="inline-code">name</code>-s and <code class="inline-code">size</code>-s are
strings above.</p>
</li>
<li>
<p>Number: It&#39;s a numerical value, like the
<code class="inline-code">price</code>-s above. The string
<code class="inline-code">&quot;50&quot;</code> and the number <code class="inline-code">50</code> are
two totally different things in FreeMarker. The former is just a
sequence of two characters (which happens to be readable as a
number for humans), while the latter is a numerical value that you
can use in arithmetical calculations.</p>
</li>
<li>
<p>Date-like: Either a date-time (stores a date with time of
the day), or a date (no time of day), or a time (time of day, no
date).</p>
</li>
<li>
<p>Boolean: A true/false (yes/no, on/off, etc.) thing. Like
animals could have a <code class="inline-code">protected</code> subvariable,
which store if the animal is protected or not.</p>
</li>
</ul><p>Summary:</p><ul>
<li>
<p>The data-model can be visualized as a tree.</p>
</li>
<li>
<p>Scalars store a single value. The value can be a string or a
number or a date-time/date/time or a boolean.</p>
</li>
<li>
<p>Hashes are containers that store other variables and
associate them with a unique lookup name.</p>
</li>
<li>
<p>Sequences are containers that store other variables in an
ordered sequence. The stored variables can be retrieved via their
numerical index, starting from 0.</p>
</li>
</ul> <div class="callout note">
<strong class="callout-label">Note:</strong>
<p>There are other, more advanced value types that we don&#39;t cover
here, such as methods and directives.</p>
</div>
<div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="dgui_quickstart_basics.html"><span>Previous</span></a><a class="paging-arrow next" href="dgui_quickstart_template.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>