blob: 4e06d94239917b6d27971efa9d943adec49dc881 [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>2.3.7 - 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="2.3.7">
<meta property="og:locale" content="en_US">
<meta property="og:url" content="https://freemarker.apache.org/docs/versions_2_3_7.html">
<link rel="canonical" href="https://freemarker.apache.org/docs/versions_2_3_7.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="app.html"><span itemprop="name">Appendixes</span></a></li><li class="step-2" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="app_versions.html"><span itemprop="name">Version history</span></a></li><li class="step-3" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="versions_2_3_7.html"><span itemprop="name">2.3.7</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","Appendixes","Version history","2.3.7"];</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="versions_2_3_8.html"><span>Previous</span></a><a class="paging-arrow next" href="versions_2_3_7rc1.html"><span>Next</span></a></div><div class="title-wrapper">
<h1 class="content-header header-section1" id="versions_2_3_7" itemprop="headline">2.3.7</h1>
</div></div><div class="page-menu">
<div class="page-menu-title">Page Contents</div>
<ul><li><a class="page-menu-link" href="#autoid_208" data-menu-target="autoid_208">Changes on the Java side</a></li><li><a class="page-menu-link" href="#autoid_209" data-menu-target="autoid_209">Changes on the FTL side</a></li></ul> </div><p>Date of release: 2006-06-23</p><p>This release, compared to 2.3.7 RC1, contains new operators for
handling null/missing variables, , the <code class="inline-code">substring</code>
built-in, and some more bugfixes. Note that 2.3.7 RC1 has a long
change log, so you may want to <a href="versions_2_3_7rc1.html">read
that</a> too.</p>
<h2 class="content-header header-section2" id="autoid_208">Changes on the Java side</h2>
<ul>
<li>
<p>The <code class="inline-code">seq_contains</code> built-in now handles
<code class="inline-code">TemplateCollectionModel</code>-s as well.</p>
</li>
<li>
<p>Bug fixed: In 2.3.7 RC1
<code class="inline-code">FreemarkerServlet</code> has always died with
<code class="inline-code">NullPointerException</code> during
initialization.</p>
</li>
</ul>
<h2 class="content-header header-section2" id="autoid_209">Changes on the FTL side</h2>
<ul>
<li>
<p>3 new operators were added for terser missing variable
handling. These operators make the <code class="inline-code">default</code>,
<code class="inline-code">exists</code> and <code class="inline-code">if_exists</code>
built-ins deprecated. (The parser doesn&#39;t issue any warning
messages when you use deprecated built-ins, and they are still
working.):</p>
<ul>
<li>
<p><code class="inline-code"><em class="code-color">exp1</em>!<em class="code-color">exp2</em></code>
is near equivalent with
<code class="inline-code"><em class="code-color">exp1</em>?default(<em class="code-color">exp2</em>)</code>,
also
<code class="inline-code">(<em class="code-color">exp1</em>)!<em class="code-color">exp2</em></code>
is near equivalent with
<code class="inline-code">(<em class="code-color">exp1</em>)?default(<em class="code-color">exp2</em>)</code>.
The only difference is that this new operator doesn&#39;t
evaluate the
<code class="inline-code"><em class="code-color">exp2</em></code> when the
default value is not needed.</p>
</li>
<li>
<p><code class="inline-code"><em class="code-color">exp1</em>!</code> is
similar to
<code class="inline-code"><em class="code-color">exp1</em>?if_exists</code>,
also <code class="inline-code">(<em class="code-color">exp1</em>)!</code>
is similar to
<code class="inline-code">(<em class="code-color">exp1</em>)?if_exists</code>.
The difference is that with this new operator the default
value is an empty string and an empty list and empty hash at
the same time (multi-type variable), while with
<code class="inline-code">if_exists</code> the default value was an empty
string and an empty list and empty hash and boolean
<code class="inline-code">false</code> and a transform that does nothing
and ignores all parameters at the same time.</p>
</li>
<li>
<p><code class="inline-code"><em class="code-color">exp1</em>??</code>
is equivalent with
<code class="inline-code"><em class="code-color">exp1</em>?exists</code>,
also <code class="inline-code">(<em class="code-color">exp1</em>)??</code>
is equivalent with with
<code class="inline-code">(<em class="code-color">exp1</em>)?exists</code>.</p>
</li>
</ul>
</li>
<li>
<p>New built-in:
<code class="inline-code"><em class="code-color">exp</em>?substring(<em class="code-color">from</em>,
<em class="code-color">toExclusive</em>)</code>, also callable
as
<code class="inline-code"><em class="code-color">exp</em>?substring(<em class="code-color">from</em>)</code>.
Getting substrings was possible for a long time like
<code class="inline-code"><em class="code-color">myString</em>[<em class="code-color">from</em>..<em class="code-color">toInclusive</em>]</code>
and
<code class="inline-code"><em class="code-color">myString</em>[<em class="code-color">from</em>..]</code>,
but
<code class="inline-code"><em class="code-color">myString</em>?substring(<em class="code-color">from</em>,
<em class="code-color">toExclusive</em>)</code> and
<code class="inline-code"><em class="code-color">myString</em>?substring(<em class="code-color">from</em>)</code>
has the advantage that it has an exclusive end, which is more
practical. (Edit: Since 2.3.21 ranges are the preferred way
again, as it has
<code class="inline-code"><em class="code-color">myString</em>[<em class="code-color">from</em>..&lt;<em class="code-color">toExclusive</em>]</code>.)
Sequence (list) slices still has to be get with the old syntax,
since <code class="inline-code">substring</code> only applies to strings.
Please note that the "to" parameter is 1 greater
with this new builtin, as it is an exclusive index. Further
difference is that the <code class="inline-code">substring</code> built-in
requires that the "from" index is less than or
equal to the "to" index. So 0 length substrings are
possible now, but not reversed substrings.</p>
</li>
<li>
<p>Bug fixed: <a href="http://sourceforge.net/tracker/?func=detail&amp;atid=100794&amp;aid=1487694&amp;group_id=794">[1487694]</a>
malfunction when the <code class="inline-code">recover</code> directive has no
nested content</p>
</li>
</ul>
<div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="versions_2_3_8.html"><span>Previous</span></a><a class="paging-arrow next" href="versions_2_3_7rc1.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>