Yes, but the for FreeMarker there are also some tags. And writing your own set is easy. And they're much more readable. i.e. the JSP above uses a quick and dirty written input tag (<input:text ../>):
JSP:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:fmt="http://java.sun.com/jsp/jstl/fmt">
<jsp:directive.page contentType="text/html; charset=utf-8" language="java"/>
<jsp:directive.attribute name="path" required="true"/>
<jsp:directive.attribute name="title" required="true" />
<jsp:directive.attribute name="labelkey" required="true" />
<jsp:directive.attribute name="required" required="true" type="java.lang.Boolean"/>
<jsp:directive.attribute name="size" required="true" type="java.lang.Integer"/>
<jsp:directive.attribute name="maxlength" required="true" type="java.lang.Integer"/>
<spring:bind path="${path}" xmlns:spring="http://www.springframework.org/tags">
<jsp:element name="dt">
<jsp:body>
<label for="${status.expression}" title="${title}"><fmt:message key="${labelkey}"/><c:if test="${required eq true}"><em>*</em></c:if><c:if test="${!required eq true}">:</c:if></label>
<c:if test="${status.error}">*
<c:forEach items="${status.errorMessages}" var="error">
<em>${error}</em><br />
</c:forEach>
</c:if>
</jsp:body>
</jsp:element>
<jsp:element name="dd">
<jsp:body>
<input type="text" size="${size}" maxlength="${maxlength}" title="${title}" id="${status.expression}" name="${status.expression}" value="${status.value}" />
</jsp:body>
</jsp:element>
</spring:bind>
</jsp:root>
The same thing in Freemarker looks like this:
Code:
<#import "/spring.ftl" as spring />
<#macro text path,labelkey,required,title,size,maxlength>
<@spring.bind path/>
<dt>
<label for="${spring.status.expression}" title="${title}"><@spring.message labelkey/><#if required==true><em>*</em></#if></label>
<#list spring.status.errorMessages as error>
<em>${error}</em><br/>
</#list>
</dt>
<dd><input type="text" size="${size}" maxlength="${maxlength}" title="${title}" id="${spring.status.expression}" name="${spring.status.expression}" value="${spring.status.value}" /></dd>
</#macro>
There's certainly a difference in readability and amount of code 
And you can put more than one tag in one file. But really, the main benefit of using FreeMarker here is performance (at least during develpment). It really sucks to wait 30 seconds or more if your container starts compiling 30 tags or so. With FM it's there with almost no delay.
I used JSPs exclusively, but I'm sold on FreeMarker now and only use JSP if some requirement (or marketing) dictates it.
-andi