blob: 9e415554924b0332ebe10758c96a43a9a619b7c5 [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.0 RC2 - 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="FreeMarker Manual">
<meta property="og:title" content="2.0 RC2">
<meta property="og:locale" content="en_US">
<meta property="og:url" content="http://example.com/versions_2_0RC2.html">
<link rel="canonical" href="http://example.com/versions_2_0RC2.html">
<link rel="icon" href="favicon.png" type="image/png">
<link rel="stylesheet" type="text/css" href="docgen-resources/docgen.min.css?1594338517553">
</head>
<body itemscope itemtype="https://schema.org/Code">
<meta itemprop="url" content="http://example.com/">
<meta itemprop="name" content="FreeMarker Manual">
<!--[if lte IE 9]>
<div style="background-color: #C00; color: #fff; padding: 12px 24px;">Please use a modern browser to view this website.</div>
<![endif]--><div class="header-top-bg"><div class="site-width header-top"><a class="logo" href="http://example.com" role="banner"> <img itemprop="image" src="logo.png" alt="My Logo">
</a></div></div><div class="header-bottom-bg"><div class="site-width search-row"><a href="index.html" class="navigation-header">FreeMarker Manual</a><div class="navigation-header"></div></div><div class="site-width breadcrumb-row"><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">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">Versions</span></a></li><li class="step-3" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="versions_2_0RC2.html"><span itemprop="name">2.0 RC2</span></a></li></ul><div class="bookmarks" title="Bookmarks"><span class="sr-only">Bookmarks:</span><ul class="bookmark-list"><li><a href="alphaidx.html">Index</a></li><li><a href="gloss.html">Glossary</a></li><li><a href="ref.html">Reference</a></li><li><a href="app_faq.html">FAQ</a></li><li><a href="preface.html#test_target">Bőregér</a></li></ul></div></div></div> <div class="main-content site-width">
<div class="content-wrapper no-toc">
<div id="table-of-contents-wrapper" class="col-left">
</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_0RC3.html"><span>Previous</span></a><a class="paging-arrow next" href="versions_2_0RC1.html"><span>Next</span></a></div><div class="title-wrapper">
<h1 class="content-header header-section1" id="versions_2_0RC2" itemprop="headline">2.0 RC2</h1>
</div></div><div class="page-menu">
<div class="page-menu-title">Page Contents</div>
<ul><li><a class="page-menu-link" href="#autoid_236" data-menu-target="autoid_236">Changes to Template Language</a></li><li><a class="page-menu-link" href="#autoid_237" data-menu-target="autoid_237">API Changes</a></li></ul> </div><p>FreeMarker 2.0 RC 2 was released on 4 April 2002. Here is a
summary of changes wrt to the first release.</p>
<h2 class="content-header header-section2" id="autoid_236">Changes to Template Language</h2>
<ul>
<li>
<p>Certain built-in functionality is provided via a new
operator, &#39;?&#39;. Thus, <code class="inline-code">myList?size</code> provides the
number of elements in a list. Similarly,
<code class="inline-code">myString?length</code> provides the length of a
string, <code class="inline-code">myString?upper_case</code> puts the string
all in capital letters, and <code class="inline-code">myHash?keys</code>
provides a sequence containing the keys in the hash. See <a href="ref_builtins.html">Reference/Built-in Reference</a> for list of all available
built-ins.</p>
</li>
<li>
<p>Numerical comparisons can now be made using the &quot;natural&quot;
operators &lt; and &gt; but there are also &quot;web-safe&quot;
alternatives, such as <em>\lt</em> and
<em>\gt</em>, since the use of these characters may
confuse HTML editors and parsers. Note that these changed
between rc1 and rc2, they now start with a backslash. A little
asymmetry is the fact that if you use the natural greater-than
or greater-than-or-equals operators (i.e. &gt; or &gt;=) the
expression must be in parentheses. With any other operator, the
parentheses are optional.</p>
</li>
<li>
<p>Within an iteration loop -- i.e. a
<code class="inline-code">foreach</code> or a <code class="inline-code">list</code> block --
the current count in the loop is available as the special
variable
<code class="inline-code"><em class="code-color">index</em>_count</code>. where
<em>index</em> is the name of the variable in
the iteration. A boolean variable called
<code class="inline-code"><em class="code-color">index</em>_has_next</code> is
also defined that indicates whether there are any more items in
the iteration after this one. Note that the index starts at
zero, so you will often be adding one to it in practice.</p>
</li>
<li>
<p>The <code class="inline-code">&lt;#break&gt;</code> directive can now be
used to break out of a <code class="inline-code">&lt;#foreach...&gt;</code> or
a <code class="inline-code">&lt;list...&gt;</code> loop. (Prior to this
version, it only worked within a switch-case block.) There is a
new directive called <code class="inline-code">&lt;#stop&gt;</code> that, when
encountered, simply halts processing of the template. This can
be useful for debugging purposes.</p>
</li>
<li>
<p>When invoking java methods that have been exposed to the
page, using the code in freemarker.ext.*, there are built-ins
that allow you to indicate the numerical type that you wish to
pass as the value. For instance, if you had two methods, one
that takes an int and another that takes a long, and you wanted
to pass in a value, you would have to specify which method.
<code class="inline-code">myMethod(1?int)</code> or
<code class="inline-code">myMethod(1?long)</code>. This is unnecessary if
there is only one method of the given name.</p>
</li>
<li>
<p>Ranges can be used to get the sublist from a list or the
substring of a string. For example:
<code class="inline-code">myList[0..3]</code> will return items 0 through 3 of
the list in question. Or, for example, you could get all the
elements of the list except for the first and last ones via:
<code class="inline-code">myList[1..(myList?size-2)]</code></p>
</li>
<li>
<p>Or we could get the first 6 characters of a string via
<code class="inline-code">myString[0..5]</code></p>
</li>
<li>
<p>Lists can be concatenated using the &#39;+&#39; operator.
Previously, this overloading of &#39;+&#39; only applied to
strings.</p>
</li>
<li>
<p>An attempt to compare a number to a string now throws an
exception, since it is indicative of a coding error. Note that
there is a backward compatibility mode that can be set (see
below) that loosens this up in order to be able to process
legacy templates.</p>
</li>
</ul>
<h2 class="content-header header-section2" id="autoid_237">API Changes</h2>
<ul>
<li>
<p>The <code class="inline-code">TemplateSequenceModel</code> interface now
has a <code class="inline-code">size()</code> method for getting the number of
elements in the sequence in question.</p>
</li>
<li>
<p>The <code class="inline-code">TemplateModelIterator</code> interface now
has a <code class="inline-code">hasNext()</code> method.</p>
</li>
<li>
<p>The default sequence and hash implementations,
<code class="inline-code">freemarker.template.SimpleSequence</code> and
<code class="inline-code">freemarker.template.SimpleHash</code> are now
unsynchronized. If you need the methods to be synchronized, you
can get a synchronized wrapper via the
<code class="inline-code">synchronizedWrapper()</code> in either class.</p>
</li>
<li>
<p>The <code class="inline-code">freemarker.utility.ExtendedList</code> and
<code class="inline-code">freemarker.utility.ExtendedHash</code> classes were
removed, since all of the extra keys that it defined are now
available using the appropriate &#39;?&#39; built-in operation, i.e.
<code class="inline-code">myHash?keys</code> or <code class="inline-code">myList?size</code>
or <code class="inline-code">myList?last</code>.</p>
</li>
<li>
<p>There is a method in
<code class="inline-code">java.freemarker.Configuration</code> named
<code class="inline-code">setDebugMode()</code> which allows you to decide
whether stack traces are simply output to the web client (the
best situation in development) or thrown back to the caller to
be handled more gracefully (the best situation in
production).</p>
</li>
<li>
<p>There is a flag that can be set to turn on a processing
mode that is more backward-compatible with FreeMarker Classic.
This is off by default, but you can set it via
<code class="inline-code">Template.setClassicCompatibility(true)</code>. What
this does is that it allows scalars to be treated as a
single-item list in a list directive. Also, it allows somewhat
more looseness about types. In FreeMarker 1.x, <code class="inline-code">&lt;#if
x==&quot;1&quot;&gt;</code> and <code class="inline-code">&lt;#if x==1&gt;</code>
were in fact equivalent. This meant that legacy templates might
tend to be slack about this. If classic compatibility is not
set, an attempt to compare the string &quot;1&quot; with the number 1 will
result in an exception being thrown. (Note that it is preferable
to get your templates working without the backward compatibility
flag, since it usually will require only minor changes. However,
for people with a lot of templates and no time to check over
them, this flag may be of use.)</p>
</li>
</ul>
<div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="versions_2_0RC3.html"><span>Previous</span></a><a class="paging-arrow next" href="versions_2_0RC1.html"><span>Next</span></a></div></div></div></div> </div>
</div>
<div class="site-footer"><div class="site-width"><div class="footer-bottom"> <p class="last-generated">
Last generated:
<time itemprop="dateModified" datetime="2020-07-09T23:48:37Z" title="Thursday, July 9, 2020 11:48:37 PM GMT">2020-07-09 23:48:37 GMT</time> </p>
<p class="copyright">
© <span itemprop="copyrightYear">1999</span>–2020
<a itemtype="http://schema.org/Organization" itemprop="copyrightHolder" href="https://apache.org/">The Apache Software Foundation</a> </p>
</div></div></div></body>
</html>