blob: e6446b7f102016701a51f4cae8f267714b312ca4 [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.32 - 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.32">
<meta property="og:locale" content="en_US">
<meta property="og:url" content="https://freemarker.apache.org/docs/versions_2_3_32.html">
<link rel="canonical" href="https://freemarker.apache.org/docs/versions_2_3_32.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_32.html"><span itemprop="name">2.3.32</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.32"];</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="app_versions.html"><span>Previous</span></a><a class="paging-arrow next" href="versions_2_3_31.html"><span>Next</span></a></div><div class="title-wrapper">
<h1 class="content-header header-section1" id="versions_2_3_32" itemprop="headline">2.3.32</h1>
</div></div><div class="page-menu">
<div class="page-menu-title">Page Contents</div>
<ul><li><a class="page-menu-link" href="#autoid_150" data-menu-target="autoid_150">Changes on the FTL side</a></li><li><a class="page-menu-link" href="#autoid_151" data-menu-target="autoid_151">Changes on the Java side</a></li></ul> </div><p>Release date: 2023-01-12</p>
<h2 class="content-header header-section2" id="autoid_150">Changes on the FTL side</h2>
<ul>
<li>
<p>Improved outputting values for computer/parser consumption
(such as for generating JSON, JavaScript values, values encoded
into URL-s):</p>
<ul>
<li>
<p>Added new configuration setting, <a href="gloss.html#gloss.c_format"><code>c_format</code></a>
(also settable via the <a href="ref_directive_setting.html#ref.directive.setting"><code>setting</code>
directive</a>). This specifies what syntax to use when
formatting values for computer consumption/parser, like
<code class="inline-code">&quot;JSON&quot;</code>. Most prominently, this affects
the <a href="ref_builtins_number.html#ref_builtin_c"><code>c</code>
built-in</a>, hence the name. See valid setting values,
and their meaning here: <a href="dgui_misc_computer_vs_human_format.html">Template Author&#39;s Guide/Miscellaneous/Formatting for humans, or for computers</a>.</p>
<p>If you set the <a href="pgui_config_incompatible_improvements.html#pgui_config_incompatible_improvements_how_to_set"><code>incompatible_improvements</code>
setting</a> to 2.3.32, the default of
<code class="inline-code">c_format</code> changes from
<code class="inline-code">&quot;legacy&quot;</code> to <code class="inline-code">&quot;JavaScript or
JSON&quot;</code>, which is a format that most targets can
parse (because we just format simple values, not lists and
maps). With lower
<code class="inline-code">incompatible_improvements</code>, the default
value is <code class="inline-code">&quot;legacy&quot;</code> that emulates the old
behavior of <code class="inline-code">?c</code> (where you can lose
numerical precision, etc.), so it&#39;s recommended to set it to
something else.</p>
</li>
<li>
<p><code class="inline-code"><a href="ref_builtins_number.html#ref_builtin_c">?c</a></code> now formats
string values to string literals (with quotation marks and
escaping), according the language specified in the <a href="gloss.html#gloss.c_format"><code>c_format</code>
setting</a>, such as <code class="inline-code">JSON</code>,
<code class="inline-code">Java</code>, etc. Earlier, <code class="inline-code">?c</code>
only allowed numbers, and booleans.</p>
<p>To generate JSON, you can now write a piece of
template like this:</p>
<div class="code-block role-template">
<div class="code-block-label">Template</div><pre class="code-block-body">&quot;fullName&quot;: ${user.fullName?c},</pre> </div>
<p>Then the output will be like:</p>
<div class="code-block role-output">
<div class="code-block-label">Output</div><pre class="code-block-body">&quot;fullName&quot;: &quot;John Doe&quot;,</pre> </div>
<p>Note that the quotation marks were added by
<code class="inline-code">?c</code>, and weren&#39;t typed into the
template.</p>
</li>
<li>
<p>Added <a href="ref_builtins_number.html#ref_builtin_cn">?cn</a>, which
is like <code class="inline-code"><a href="ref_builtins_number.html#ref_builtin_c">?c</a></code>, except if the
value is <code class="inline-code">null</code>/missing, it will output a
<code class="inline-code">null</code> literal, according the language
specified in the new <a href="gloss.html#gloss.c_format"><code>c_format</code>
setting</a>.</p>
<p>Let&#39;s say, in the previous example
<code class="inline-code">user.fullName</code> is expected to be
<code class="inline-code">null</code> sometimes. Then you can just use
<code class="inline-code">?cn</code> instead if
<code class="inline-code">?c</code>:</p>
<div class="code-block role-template">
<div class="code-block-label">Template</div><pre class="code-block-body">&quot;fullName&quot;: ${user.fullName?cn},</pre> </div>
<p>If said variable is <code class="inline-code">null</code>, the
output will be like this (otherwise it will be a quoted
string like earlier):</p>
<div class="code-block role-output">
<div class="code-block-label">Output</div><pre class="code-block-body">&quot;fullName&quot;: null,</pre> </div>
<p>Note that with this approach you don&#39;t complicate the
template anymore to avoid printing quotation marks. Of
course, <code class="inline-code">?cn</code> works on numerical and
boolean values as well (and of course those won&#39;t be quoted,
only strings).</p>
</li>
<li>
<p><code class="inline-code">c_format</code>-s other than
<code class="inline-code">&quot;legacy&quot;</code> use slightly different number
formatting than <code class="inline-code">?c</code> did in earlier
versions. The change affects some non-whole numbers, and
whole numbers with over 100 digits. The goal of this change
is to make the formatting lossless, and also to avoiding
huge output with exponents of high magnitude. See details at
the documentation of the <a href="ref_builtins_number.html#ref_builtin_c"><code>c</code>
built-in</a>.</p>
<p>Setting the <a href="pgui_config_incompatible_improvements.html#pgui_config_incompatible_improvements_how_to_set"><code>incompatible_improvements</code>
setting</a> to 2.3.32 will change the default of
<code class="inline-code">c_format</code> for <code class="inline-code">&quot;legacy&quot;</code>
to <code class="inline-code">&quot;JavaScript or JSON&quot;</code>, and therefore
changes number formatting too.</p>
<p>Of course, all this only affects number formatting
done with <code class="inline-code">?c</code>, <code class="inline-code">?cn</code>, and
with <code class="inline-code">&quot;c&quot;</code> (or
<code class="inline-code">&quot;computer&quot;</code>)
<code class="inline-code">number_format</code>, and not number formatting
in general.</p>
</li>
<li>
<p>For consistency, when setting the
<code class="inline-code">number_format</code> setting (also when
formatting with
<code class="inline-code">?string(<em class="code-color">format</em>)</code>),
now <code class="inline-code">&quot;c&quot;</code> can be used instead of
"computer". Both has the same effect on
formatting, but <code class="inline-code">&quot;c&quot;</code> is preferred from now
on.</p>
</li>
</ul>
</li>
<li>
<p><a href="https://issues.apache.org/jira/browse/FREEMARKER-208">FREEMARKER-208</a>:
Added <a href="ref_builtins_string.html#ref_builtin_c_lower_case"><code>?c_lower_case</code></a>,
and <a href="ref_builtins_string.html#ref_builtin_c_upper_case"><code>?c_upper_case</code></a>,
which are the non-localized (computer language) variants of
<code class="inline-code">?lower_case</code>, and
<code class="inline-code">?upper_case</code>. The primary problem people run
into with the localized versions is that with Turkish locale the
letter <code class="inline-code">i</code>, and <code class="inline-code">I</code> has
different conversions than in most languages, which causes
problem if the conversion was for computer consumption (for
technical purposes), and not for humans.</p>
</li>
<li>
<p>In <code class="inline-code">freemarker.ext.xml</code>, which is the
old, long deprecated XML wrapper, that almost nobody uses
anymore (the commonly used one is
<code class="inline-code">freemarker.ext.dom</code>), the
<code class="inline-code">_registerNamespace</code> key now works, doing what
the documentation always stated. Before this fix it just behaved
as if it was the name of an element you are looking for.</p>
</li>
</ul>
<h2 class="content-header header-section2" id="autoid_151">Changes on the Java side</h2>
<ul>
<li>
<p>Added <code class="inline-code">Configurable.setCFormat(CFormat)</code>,
with the usual accompanying setting API methods/constants. See
the <code class="inline-code">c_format</code>-, and the
<code class="inline-code">?c</code>-related changes earlier in the FTL
section.</p>
</li>
<li>
<p>Added
<code class="inline-code">Environment.getCTemplateNumberFormat()</code> that
returns a
<code class="inline-code">freemarker.core.TemplateNumberFormat</code>, and
deprecated <code class="inline-code">getCNumberFormat()</code> that returns a
<code class="inline-code">java.text.NumberFormat</code>. The behavior defined
in the <code class="inline-code">CFormat</code> (see earlier) is only
reflected exactly by the return value of the new method. The
deprecated method returns a format that&#39;s a best effort
approximation.</p>
</li>
<li>
<p>Added
<code class="inline-code">freemarker.core.MarkupOutputFormat.outputForeign(MO2
mo, Writer out)</code> method, which for a
<code class="inline-code">MarkupOutputFormat</code> where
<code class="inline-code">isOutputFormatMixingAllowed()</code> returns
<code class="inline-code">true</code>, allows full control over how to print a
different markup into it. This can check what other markup is
allowed, and do conversion if necessary. (<a href="https://github.com/apache/freemarker/pull/83">GitHub
PR 83</a>)</p>
</li>
<li>
<p>Fixed performance bug with XML processing
(<code class="inline-code">freemarker.ext.dom</code>) when converting an XML
element that contains lots of text nodes (instead of a single
big text node) to a string. (<a href="https://github.com/apache/freemarker/pull/82">GitHub
PR 82</a>)</p>
</li>
<li>
<p>Improved <code class="inline-code">StringUtil.jsStringEnc</code> and
<code class="inline-code">javaSctringEnc</code> to support quoting. Also
<code class="inline-code">jsStringEnc</code> now have a mode that targets both
JavaScript and JSON, and doesn&#39;t give up apostrophe
escaping.</p>
</li>
<li>
<p><a href="https://issues.apache.org/jira/browse/FREEMARKER-198">FREEMARKER-198</a>:
Fixed possible deadlock when the
<code class="inline-code">Configuration</code>, and
<code class="inline-code">DefaultObjectWrapper</code> class
<em>static</em> initialization is triggered in
different threads around the same time. (In the very unlikely
case your application can run into this, this will hang the code
that initializes FreeMarker before it has processed any
templates, and it can&#39;t happen anymore if any template
processing managed to start.)</p>
</li>
<li>
<p><a href="https://issues.apache.org/jira/browse/FREEMARKER-190">FREEMARKER-190</a>:
Updated dom4j version used during FreeMarker project compilation
from 1.3 to 2.1.3. Users can still use FreeMarker with dom4j 1.3
(mostly just luck, but it works). FreeMarker&#39;s dom4j support is
long deprecated anyway, and almost nobody uses it anyway. We
were forced to do this change because old dom4j versions have
security vulnerabilities, and although FreeMarker is not
affected by them (like we do not pull in dom4j as dependency
into the projects of our users), we were flagged as vulnerable
at certain places for merely supporting 1.3.</p>
</li>
<li>
<p>Slightly improved
<code class="inline-code">DefaultMemberAccessPolicy-rules</code> (used by
default), and <code class="inline-code">unsafeMethods.properties</code> (long
deprecated, not used by default). Note that no matter how much
we tweak these, they will never provide proper security if you
have untrusted templates! See <a href="app_faq.html#faq_template_uploading_security">this in the
FAQ</a>!</p>
</li>
</ul>
<div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="app_versions.html"><span>Previous</span></a><a class="paging-arrow next" href="versions_2_3_31.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>