blob: 0cd83fad183cfe3604b07ba19a86fa93a76d0f7d [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/dgui_datamodel_basics.html">
<link rel="canonical" href="https://freemarker.apache.org/docs/dgui_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="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_datamodel.html"><span itemprop="name">Values, Types</span></a></li><li class="step-3" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="dgui_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","Template Author\'s Guide","Values, Types","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="dgui_datamodel.html"><span>Previous</span></a><a class="paging-arrow next" href="dgui_datamodel_types.html"><span>Next</span></a></div><div class="title-wrapper">
<h1 class="content-header header-section1" id="dgui_datamodel_basics" itemprop="headline">Basics</h1>
</div></div><div class="page-menu">
<div class="page-menu-title">Page Contents</div>
<ul><li><a class="page-menu-link" href="#topic.value" data-menu-target="topic.value">What is a value?</a></li><li><a class="page-menu-link" href="#autoid_9" data-menu-target="autoid_9">What is type?</a></li><li><a class="page-menu-link" href="#autoid_10" data-menu-target="autoid_10">The data-model is a hash</a></li></ul> </div> <div class="callout note">
<strong class="callout-label">Note:</strong>
<p>It is assumed that you have already read the <a href="dgui_quickstart.html">Getting Started</a> chapter.</p>
</div>
<p>Understanding the concept of values and types is crucial for the
understanding of data-models. However, the concept of values and types
is not confined to data-models, as you will see.</p>
<h2 class="content-header header-section2" id="topic.value">What is a value?</h2>
<p><span class="marked-for-programmers">Real programmers can safely skip
this section.</span></p>
<p>Examples of <em>values</em> as you know the term
from the everyday math are 16, 0.5, and so on, i.e. numbers. In the
case of computer languages the value term has a wider meaning, as a
value needn&#39;t be a number. For example, take this data-model:</p>
<div class="code-block role-data-model">
<div class="code-block-label">Data Model</div><pre class="code-block-body"><a name="example.stdDataModel"></a>(root)
|
+- user = &quot;Big Joe&quot;
|
+- today = Jul 6, 2007
|
+- todayHoliday = false
|
+- lotteryNumbers
| |
| +- (1st) = 20
| |
| +- (2nd) = 14
| |
| +- (3rd) = 42
| |
| +- (4th) = 8
| |
| +- (5th) = 15
|
+- cargo
|
+- name = &quot;coal&quot;
|
+- weight = 40</pre> </div>
<p>We say that the <em>value</em> of the the
<code class="inline-code">user</code> variable is &quot;Big Joe&quot; (a string), the
<em>value</em> of <code class="inline-code">today</code> is Jul 6,
2007 (a date), the <em>value</em> of
<code class="inline-code">todayHoliday</code> is false (a boolean, ie. a yes/no
thing). The <em>value</em> of
<code class="inline-code">lotteryNumbers</code> is the sequence that contains 20,
14, 42, 8, 15. Surely <code class="inline-code">lotteryNumbers</code> is multiple
values in the sense that it <em>contains</em> multiple
values (for example, the 2nd item in it is a the
<em>value</em> 14), but still,
<code class="inline-code">lotteryNumbers</code> itself is a single value. It&#39;s
like a box that contains many other items; the whole box can be seen
as a single item. Last not least we also have the
<em>value</em> of <code class="inline-code">cargo</code>, which is a
hash (a box-like thing again).So, a value is something that can be
stored in a variable (e.g., in <code class="inline-code">user</code> or
<code class="inline-code">cargo</code> or <code class="inline-code">cargo.name</code>). But a
value need not be stored in a variable to be called a value, for
example we have the value 100 here:</p>
<div class="code-block role-template">
<div class="code-block-label">Template</div><pre class="code-block-body">&lt;#if cargo.weight &lt; <strong>100</strong>&gt;Light cargo&lt;/#if&gt;</pre> </div>
<p>The temporaly result of a calculations are also called values,
like 20 and 120 when this template is executed (it will print
120):</p>
<div class="code-block role-template">
<div class="code-block-label">Template</div><pre class="code-block-body">${cargo.weight / 2 + 100}</pre> </div>
<p>Explanation for this last: As the result of dividing the two
values, 40 (the weight of the cargo) and 2, a new value 20 is
created. Then 100 is added to it, so the value 120 is created. Then
120 is printed
(<code class="inline-code">${<em class="code-color">...</em>}</code>), and the
template execution goes on and all these values gone.</p>
<p>Certainly now you feel what the value term means.</p>
<h2 class="content-header header-section2" id="autoid_9">What is type?</h2>
<p>Values have an important aspect, their type. For example the
type of the value of the <code class="inline-code">user</code> variable is string,
and the type of the value of the <code class="inline-code">lotteryNumbers</code>
variable is sequence. The type of a value is important because it
determines to a large extent how and where you can use the value.
Like <code class="inline-code">${user / 2}</code> is an error, but
<code class="inline-code">${cargo.weight / 2}</code> works and prints 20, since
division only does make sense for a number, but not for a string.
Or, using dot like in <code class="inline-code">cargo.name</code> does make sense
only if <code class="inline-code">cargo</code> is a hash. Or, you can list with
<code class="inline-code">&lt;#list <em class="code-color">...</em>&gt;</code>
sequences only. Or, the condition of <code class="inline-code">&lt;#if
...&gt;</code> must be a boolean. And so on.</p>
<div class="callout note">
<strong class="callout-label">Note:</strong>
<p>A little terminology... Saying &quot;a boolean&quot; or &quot;a boolean
value&quot; or &quot;a value of type boolean&quot; are all the same.</p>
</div>
<p><a name="topic.multitype"></a>A value can have multiple types at the same time,
although it&#39;s rarely utilized. For example in the data-model below
<code class="inline-code">mouse</code> is both a string and a hash:</p>
<div class="code-block role-data-model">
<div class="code-block-label">Data Model</div><pre class="code-block-body">(root)
|
+- mouse = &quot;Yerri&quot;
|
+- age = 12
|
+- color = &quot;brown&quot;</pre> </div>
<p>If you merge this template with the above data-model:</p>
<div class="code-block role-template">
<div class="code-block-label">Template</div><pre class="code-block-body">${mouse} &lt;#-- uses mouse as a string --&gt;
${mouse.age} &lt;#-- uses mouse as a hash --&gt;
${mouse.color} &lt;#-- uses mouse as a hash --&gt;</pre> </div>
<p>the output will be:</p>
<div class="code-block role-output">
<div class="code-block-label">Output</div><pre class="code-block-body">Yerri
12
brown</pre> </div>
<h2 class="content-header header-section2" id="autoid_10">The data-model is a hash</h2>
<p>Looking at the various data-model examples you may already
realized: the thing marked as &quot;(root)&quot; is just a value of type hash.
When you write something like <code class="inline-code">user</code>, that means
that you want the &quot;user&quot; variable stored in the root hash. Like if
you were writing <code class="inline-code">root.user</code>, except that there is
no variable called &quot;root&quot; so that wouldn&#39;t work.</p>
<p>Some may get confused by the fact that our example data-model,
that is, the root hash, contains further hashes and sequences
(<code class="inline-code">lotteryNumbers</code> and <code class="inline-code">cargo</code>).
There is nothing special in that. A hash contains other variables,
and those variables have a value, which can be a string, a number,
etc., and of course it can be a hash or sequence as well. Because,
as it was explained earlier, a sequence or a hash is just a value,
like a string or a number is.</p>
<div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="dgui_datamodel.html"><span>Previous</span></a><a class="paging-arrow next" href="dgui_datamodel_types.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>