blob: b19861e9a160f8b139e1ec496589361e13820647 [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>Create a data-model - 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="Create a data-model">
<meta property="og:locale" content="en_US">
<meta property="og:url" content="https://freemarker.apache.org/docs/pgui_quickstart_createdatamodel.html">
<link rel="canonical" href="https://freemarker.apache.org/docs/pgui_quickstart_createdatamodel.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_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="pgui_quickstart_createdatamodel.html"><span itemprop="name">Create a data-model</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","Getting Started","Create a data-model"];</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_quickstart_createconfiguration.html"><span>Previous</span></a><a class="paging-arrow next" href="pgui_quickstart_gettemplate.html"><span>Next</span></a></div><div class="title-wrapper">
<h1 class="content-header header-section1" id="pgui_quickstart_createdatamodel" itemprop="headline">Create a data-model</h1>
</div></div><p>In simple cases you can build data-models using
<code class="inline-code">java.lang</code> and <code class="inline-code">java.util</code> classes
and custom JavaBeans:</p><ul>
<li>
<p>Use <code class="inline-code">java.lang.String</code> for strings.</p>
</li>
<li>
<p>Use <code class="inline-code">java.lang.Number</code> subclasses for
numbers.</p>
</li>
<li>
<p>Use <code class="inline-code">java.lang.Boolean</code> for boolean
values.</p>
</li>
<li>
<p>Use <code class="inline-code">java.util.Date</code> and its subclasses for
date/time values</p>
</li>
<li>
<p>Use <code class="inline-code">java.util.List</code> or Java arrays for
sequences.</p>
</li>
<li>
<p>Use <code class="inline-code">java.util.Map</code> with
<code class="inline-code">String</code> keys for hashes.</p>
</li>
<li>
<p>Use your custom bean class for hashes where the items
correspond to the bean properties. For example the
<code class="inline-code">price</code> property (<code class="inline-code">getPrice()</code>)
of <code class="inline-code">product</code> can be get as
<code class="inline-code">product.price</code>. (The actions of the beans can be
exposed as well; see much later <a href="pgui_misc_beanwrapper.html">here</a>)</p>
</li>
</ul><p>For example, let&#39;s build the data-model of the <a href="dgui_quickstart_basics.html#example.first">first example of the Template Author&#39;s
Guide</a>. For convenience, here it is again:</p>
<div class="code-block role-data-model">
<div class="code-block-label">Data Model</div><pre class="code-block-body">(root)
|
+- user = &quot;Big Joe&quot;
|
+- latestProduct
|
+- url = &quot;products/greenmouse.html&quot;
|
+- name = &quot;green mouse&quot;</pre> </div>
<p>This Java code fragment that builds this data-model:</p>
<div class="code-block role-unspecified">
<pre class="code-block-body">// Create the root hash. We use a Map here, but it could be a JavaBean too.
Map&lt;String, Object&gt; root = new HashMap&lt;&gt;();
// Put string &quot;user&quot; into the root
root.put(&quot;user&quot;, &quot;Big Joe&quot;);
// Create the &quot;latestProduct&quot; hash. We use a JavaBean here, but it could be a Map too.
Product latest = new Product();
latest.setUrl(&quot;products/greenmouse.html&quot;);
latest.setName(&quot;green mouse&quot;);
// and put it into the root
root.put(&quot;latestProduct&quot;, latest);</pre> </div>
<p>As demonstrated above, for hashes (something that stores other
named items) you can use either a <code class="inline-code">Map</code> or any kind
of public class that has public
<code class="inline-code">get<em class="code-color">Xxx</em></code>/<code class="inline-code">is<em class="code-color">Xxx</em></code>
methods as prescribed by the JavaBeans specification. Like the above
<code class="inline-code">Product</code> class could be something like:</p>
<div class="code-block role-unspecified">
<pre class="code-block-body">/**
* Product bean; note that it must be a public class!
*/
public class Product {
private String url;
private String name;
// As per the JavaBeans spec., this defines the &quot;url&quot; bean property
// It must be public!
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
// As per the JavaBean spec., this defines the &quot;name&quot; bean property
// It must be public!
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}</pre> </div>
<p>Regardless if <code class="inline-code">latestProduct</code> is a
<code class="inline-code">Map</code> that contains the <code class="inline-code">&quot;name&quot;</code> and
<code class="inline-code">&quot;url&quot;</code> keys, or it&#39;s a JavaBean as shown above, in
the template you can use <code class="inline-code">${latestProduct.name}</code>. The
root itself need not be a <code class="inline-code">Map</code> either; it could be
an object with <code class="inline-code">getUser()</code> and
<code class="inline-code">getLastestProduct()</code> methods too.</p> <div class="callout note">
<strong class="callout-label">Note:</strong>
<p>The behavior described here only stands if the value of the
<code class="inline-code">object_wrapper</code> configuration setting is something
that&#39;s used in almost all real world setups anyway. Anything that
the <code class="inline-code">ObjectWrapper</code> wraps to be a hash (something
that implements the <code class="inline-code">TemplateHashModel</code> interface)
can be used as the root, and can be traversed in templates with the
dot and <code class="inline-code">[]</code> operators. Something that it doesn&#39;t
wrap to be a hash can&#39;t be used as the root or be traversed like
that.</p>
</div>
<div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="pgui_quickstart_createconfiguration.html"><span>Previous</span></a><a class="paging-arrow next" href="pgui_quickstart_gettemplate.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>