| <!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'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 = "small" |
| | | | |
| | | +- price = 50 |
| | | |
| | +- elephant |
| | | | |
| | | +- size = "large" |
| | | | |
| | | +- price = 5000 |
| | | |
| | +- python |
| | | |
| | +- size = "medium" |
| | | |
| | +- price = 4999 |
| | |
| +- message = "It is a test" |
| | |
| +- misc |
| | |
| +- foo = "Something"</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'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 = "mouse" |
| | | | |
| | | +- size = "small" |
| | | | |
| | | +- price = 50 |
| | | |
| | +- (2nd) |
| | | | |
| | | +- name = "elephant" |
| | | | |
| | | +- size = "large" |
| | | | |
| | | +- price = 5000 |
| | | |
| | +- (3rd) |
| | | |
| | +- name = "python" |
| | | |
| | +- size = "medium" |
| | | |
| | +- price = 4999 |
| | |
| +- misc |
| | |
| +- fruits |
| | |
| +- (1st) = "orange" |
| | |
| +- (2nd) = "banana"</pre> </div> |
| <p>To access a subvariable of a sequence you use a numerical index |
| in square brackets. Indexes start from 0 (it'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">"banana"</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 ''m'', ''o'', ''u'', ''s'', ''e'' 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's a numerical value, like the |
| <code class="inline-code">price</code>-s above. The string |
| <code class="inline-code">"50"</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'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> |