| <!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>Scalars - 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="Scalars"> |
| <meta property="og:locale" content="en_US"> |
| <meta property="og:url" content="https://freemarker.apache.org/docs/pgui_datamodel_scalar.html"> |
| <link rel="canonical" href="https://freemarker.apache.org/docs/pgui_datamodel_scalar.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'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_scalar.html"><span itemprop="name">Scalars</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","Scalars"];</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_basics.html"><span>Previous</span></a><a class="paging-arrow next" href="pgui_datamodel_parent.html"><span>Next</span></a></div><div class="title-wrapper"> |
| <h1 class="content-header header-section1" id="pgui_datamodel_scalar" itemprop="headline">Scalars</h1> |
| </div></div><p>There are 4 scalar types:</p><ul> |
| <li> |
| Boolean |
| </li> |
| |
| <li> |
| Number |
| </li> |
| |
| <li> |
| String |
| </li> |
| |
| <li> |
| Date-like (subtypes: date (no time part), time or |
| date-time) |
| </li> |
| </ul><p>For each scalar type is a |
| <code class="inline-code">Template<em class="code-color">Type</em>Model</code> |
| interface, where <code class="inline-code"><em class="code-color">Type</em></code> is |
| the name of the type. These interfaces define only one method: |
| <code class="inline-code"><em class="code-color">type</em> |
| getAs<em class="code-color">Type</em>();</code>. This returns the |
| value of the variable with the Java type (<code class="inline-code">boolean</code>, |
| <code class="inline-code">Number</code>, <code class="inline-code">String</code> and |
| <code class="inline-code">Date</code> respectively).</p> <div class="callout note"> |
| <strong class="callout-label">Note:</strong> |
| |
| <p>For historical reasons the interface for string scalars is |
| called <code class="inline-code">TemplateScalarModel</code>, not |
| <code class="inline-code">TemplateStringModel</code>. (It's because in early |
| FreeMarker strings were the only kind of scalars.)</p> |
| </div> |
| <p>A trivial implementation of these interfaces are available in |
| <code class="inline-code">freemarker.template</code> package with |
| <code class="inline-code">Simple<em class="code-color">Type</em></code> class name. |
| However, there is no <code class="inline-code">SimpleBooleanModel</code>; to |
| represent the boolean values you can use the |
| <code class="inline-code">TemplateBooleanModel.TRUE</code> and |
| <code class="inline-code">TemplateBooleanModel.FALSE</code> singletons.</p> <div class="callout note"> |
| <strong class="callout-label">Note:</strong> |
| |
| <p>For historical reasons the class for string scalars is called |
| <code class="inline-code">SimpleScalar</code>, not |
| <code class="inline-code">SimpleString</code>.</p> |
| </div> |
| <p>Scalars are immutable within FTL. When you set the value of a |
| variable in a template, then you replace the |
| <code class="inline-code">Template<em class="code-color">Type</em>Model</code> |
| instance with another instance, and don't change the value stored in |
| the original instance.</p> |
| |
| |
| |
| |
| <h2 class="content-header header-section2" id="autoid_31">Difficulties with the "date-like" types</h2> |
| |
| |
| |
| |
| |
| |
| <p>There is a complication around date-like types, because Java |
| API usually does not differentiate |
| <code class="inline-code">java.util.Date</code>-s that store only the date part |
| (April 4, 2003), only the time part (10:19:18 PM), or both (April 4, |
| 2003 10:19:18 PM). To display the value as text correctly (or to do |
| certain other operations), FreeMarker must know what parts of the |
| <code class="inline-code">java.util.Date</code> stores meaningful information, and |
| what parts are unused (usually 0-ed out). Unfortunately, this |
| information is usually only available when the value comes from a |
| database, because most databases have separate date, time and |
| date-time (aka. timestap) types, and <code class="inline-code">java.sql</code> has |
| 3 corresponding <code class="inline-code">java.util.Date</code> subclasses for |
| them.</p> |
| |
| <p><code class="inline-code">TemplateDateModel</code> interface has two |
| methods: <code class="inline-code">java.util.Date getAsDate()</code> and |
| <code class="inline-code">int getDateType()</code>. A typical implementation of |
| this interface, stores a <code class="inline-code">java.util.Date</code> object, |
| plus an integer that tells the subtype. The value of this integer |
| must be a constant from the <code class="inline-code">TemplateDateModel</code> |
| interface: <code class="inline-code">DATE</code>, <code class="inline-code">TIME</code>, |
| <code class="inline-code">DATETIME</code> and <code class="inline-code">UNKNOWN</code>.</p> |
| |
| <p>About <code class="inline-code">UNKNOWN</code>: <code class="inline-code">java.lang</code> |
| and <code class="inline-code">java.util</code> classes are usually converted |
| automatically into <code class="inline-code">TemplateModel</code> implementations |
| be the <code class="inline-code">ObjectWrapper</code> (see object wrapping |
| earlier). If the object wrapper has to wrap a |
| <code class="inline-code">java.util.Date</code>, that is not an instance of a |
| <code class="inline-code">java.sql</code> date class, it can't decide what the |
| subtype is, so it uses <code class="inline-code">UNKNOWN</code>. Later, if the |
| template has to use this variable, and the subtype is needed for the |
| operation, it will stop with error. To prevent this, for the |
| problematic variables the template author must specify the subtype |
| explicitly using the <a href="ref_builtins_date.html#ref_builtin_date_datetype"><code>date</code>, |
| <code>time</code> or <code>datetime</code> |
| built-ins</a> (like <code class="inline-code">lastUpdated?datetime</code>). |
| Note that if you use <code class="inline-code">string</code> built-in with format |
| parameter, as <code class="inline-code">foo?string["MM/dd/yyyy"]</code>, then |
| FreeMarker doesn't need to know the subtype.</p> |
| <div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="pgui_datamodel_basics.html"><span>Previous</span></a><a class="paging-arrow next" href="pgui_datamodel_parent.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> |