You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2023/12/25 17:23:41 UTC
(freemarker) 02/02: Dropped support for very old Servlet and JSP versions, and now requiring at least Servlet 3.0 and JSP 2.2. This way, we only need to support a single javax Servlet/JSP version, and could remove the complications from supporting multiple old versions. Also, with this, the "jsp20" and "jsp21" Gradle configurations were unified as "javaxServlet" (because later we want to have "jakartaServlet" too).
This is an automated email from the ASF dual-hosted git repository.
ddekany pushed a commit to branch 2.3-gae
in repository https://gitbox.apache.org/repos/asf/freemarker.git
commit 651598673527586ab793664589ae83644451fa43
Author: ddekany <dd...@apache.org>
AuthorDate: Mon Dec 25 18:12:14 2023 +0100
Dropped support for very old Servlet and JSP versions, and now requiring at least Servlet 3.0 and JSP 2.2. This way, we only need to support a single javax Servlet/JSP version, and could remove the complications from supporting multiple old versions. Also, with this, the "jsp20" and "jsp21" Gradle configurations were unified as "javaxServlet" (because later we want to have "jakartaServlet" too).
---
build.gradle.kts | 33 ++--
.../freemarker/cache/WebappTemplateLoader.java | 0
.../ext/jsp/CustomTagAndELFunctionCombiner.java | 0
.../java/freemarker/ext/jsp/EventForwarding.java | 0
.../ext/jsp/FreeMarkerJspApplicationContext.java | 0
.../freemarker/ext/jsp/FreeMarkerJspFactory.java | 30 +++-
.../freemarker/ext/jsp/FreeMarkerPageContext.java | 172 +++++++++++++++------
.../java/freemarker/ext/jsp/FreemarkerTag.java | 0
.../java/freemarker/ext/jsp/JspContextModel.java | 0
.../java/freemarker/ext/jsp/JspTagModelBase.java | 0
.../java/freemarker/ext/jsp/JspWriterAdapter.java | 0
.../freemarker/ext/jsp/PageContextFactory.java | 23 ++-
.../ext/jsp/SimpleTagDirectiveModel.java | 0
.../java/freemarker/ext/jsp/TagTransformModel.java | 0
.../java/freemarker/ext/jsp/TaglibFactory.java | 0
.../java/freemarker/ext/jsp/TaglibMethodUtil.java | 0
.../src/main/java/freemarker/ext/jsp/package.html | 0
.../ext/servlet/AllHttpScopesHashModel.java | 0
.../freemarker/ext/servlet/FreemarkerServlet.java | 0
.../ext/servlet/HttpRequestHashModel.java | 0
.../servlet/HttpRequestParametersHashModel.java | 0
.../ext/servlet/HttpSessionHashModel.java | 0
.../java/freemarker/ext/servlet/IncludePage.java | 0
.../freemarker/ext/servlet/InitParamParser.java | 0
.../ext/servlet/ServletContextHashModel.java | 0
.../freemarker/ext/servlet/SuppressFBWarnings.java | 0
.../main/java/freemarker/ext/servlet/package.html | 0
.../ext/jsp/JspTestFreemarkerServlet.java | 0
...spTestFreemarkerServletWithDefaultOverride.java | 0
.../ext/jsp/RealServletContainertTest.java | 0
.../java/freemarker/ext/jsp/TLDParsingTest.java | 0
.../freemarker/ext/jsp/TaglibMethodUtilTest.java | 0
.../jsp/taglibmembers/AttributeAccessorTag.java | 0
.../ext/jsp/taglibmembers/AttributeInfoTag.java | 0
.../ext/jsp/taglibmembers/EnclosingClass.java | 0
.../ext/jsp/taglibmembers/GetAndSetTag.java | 0
.../ext/jsp/taglibmembers/TestFunctions.java | 0
.../ext/jsp/taglibmembers/TestSimpleTag.java | 0
.../ext/jsp/taglibmembers/TestSimpleTag2.java | 0
.../ext/jsp/taglibmembers/TestSimpleTag3.java | 0
.../freemarker/ext/jsp/taglibmembers/TestTag.java | 0
.../freemarker/ext/jsp/taglibmembers/TestTag2.java | 0
.../freemarker/ext/jsp/taglibmembers/TestTag3.java | 0
.../config/WebappLocalFreemarkerServlet.java | 0
.../ext/servlet/FreemarkerServletTest.java | 0
.../ext/servlet/InitParamParserTest.java | 0
.../freemarker/template/MockServletContext.java | 0
.../template/TemplateNotFoundMessageTest.java | 0
.../test/servlet/DefaultModel2TesterAction.java | 0
.../java/freemarker/test/servlet/Model2Action.java | 0
.../test/servlet/Model2TesterServlet.java | 0
.../freemarker/test/servlet/WebAppTestCase.java | 0
.../META-INF/tldDiscovery MetaInfTldSources-1.tld | 0
.../freemarker/ext/jsp/TLDParsingTest.tld | 0
.../ext/jsp/templates/classpath-test.ftl | 0
.../ext/jsp/tldDiscovery-ClassPathTlds-1.tld | 0
.../ext/jsp/tldDiscovery-ClassPathTlds-2.tld | 0
.../freemarker/ext/jsp/webapps/basic/CONTENTS.txt | 0
.../basic/WEB-INF/el-function-tag-name-clash.tld | 0
.../ext/jsp/webapps/basic/WEB-INF/el-functions.tld | 0
.../basic/WEB-INF/expected/attributes-2.3.0.txt | 0
.../WEB-INF/expected/attributes-2.3.22-future.txt | 0
.../webapps/basic/WEB-INF/expected/attributes.txt | 0
.../webapps/basic/WEB-INF/expected/customTags1.txt | 0
.../ext/jsp/webapps/basic/WEB-INF/test.tld | 0
.../ext/jsp/webapps/basic/WEB-INF/web.xml | 0
.../ext/jsp/webapps/basic/attributes.ftl | 0
.../ext/jsp/webapps/basic/customELFunctions1.ftl | 0
.../ext/jsp/webapps/basic/customELFunctions1.jsp | 0
.../ext/jsp/webapps/basic/customTags1.ftl | 0
.../jsp/webapps/basic/elFunctionsTagNameClash.ftl | 0
.../jsp/webapps/basic/elFunctionsTagNameClash.jsp | 0
.../ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl | 0
.../freemarker/ext/jsp/webapps/basic/trivial.ftl | 0
.../freemarker/ext/jsp/webapps/basic/trivial.jsp | 0
.../freemarker/ext/jsp/webapps/config/CONTENTS.txt | 0
.../webapps/config/WEB-INF/classes/sub/test.ftl | 0
.../jsp/webapps/config/WEB-INF/classes/test.ftl | 0
.../config/WEB-INF/lib/templates.jar/sub/test2.ftl | 0
.../jsp/webapps/config/WEB-INF/templates/test.ftl | 0
.../ext/jsp/webapps/config/WEB-INF/web.xml | 0
.../freemarker/ext/jsp/webapps/config/test.ftl | 0
.../freemarker/ext/jsp/webapps/errors/CONTENTS.txt | 0
.../ext/jsp/webapps/errors/WEB-INF/web.xml | 0
.../ext/jsp/webapps/errors/failing-parsetime.ftlnv | 0
.../ext/jsp/webapps/errors/failing-parsetime.jsp | 0
.../ext/jsp/webapps/errors/failing-runtime.ftl | 0
.../ext/jsp/webapps/errors/failing-runtime.jsp | 0
.../ext/jsp/webapps/errors/not-failing.ftl | 0
.../ext/jsp/webapps/multipleLoaders/CONTENTS.txt | 0
.../multipleLoaders/WEB-INF/templates/test.ftl | 0
.../jsp/webapps/multipleLoaders/WEB-INF/web.xml | 0
.../ext/jsp/webapps/tldDiscovery/CONTENTS.txt | 0
.../WEB-INF/expected/subdir/test-rel.txt | 0
.../WEB-INF/expected/test-noClasspath.txt | 0
.../tldDiscovery/WEB-INF/expected/test1.txt | 0
.../webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld | 0
.../webapps/tldDiscovery/WEB-INF/fmtesttag4.tld | 0
.../lib/taglib-foo.jar/META-INF/foo bar.tld | 0
.../WEB-INF/subdir-with-tld/fmtesttag3.tld | 0
.../WEB-INF/taglib 2.jar/META-INF/taglib.tld | 0
.../ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml | 0
.../tldDiscovery/not-auto-scanned/fmtesttag.tld | 0
.../jsp/webapps/tldDiscovery/subdir/test-rel.ftl | 0
.../jsp/webapps/tldDiscovery/test-noClasspath.ftl | 0
.../ext/jsp/webapps/tldDiscovery/test1.ftl | 0
.../test/resources/freemarker/test/servlet/web.xml | 0
.../freemarker/ext/jsp/PageContextFactory.java | 71 ---------
.../ext/jsp/_FreeMarkerPageContext2.java | 97 ------------
.../freemarker/ext/jsp/FreeMarkerJspFactory21.java | 51 ------
.../ext/jsp/_FreeMarkerPageContext21.java | 121 ---------------
freemarker-manual/src/main/docgen/en_US/book.xml | 25 ++-
112 files changed, 206 insertions(+), 417 deletions(-)
diff --git a/build.gradle.kts b/build.gradle.kts
index e9a2750b..b023bee2 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -39,8 +39,7 @@ tasks.withType<JavaCompile>().configureEach {
freemarkerRoot {
configureSourceSet(SourceSet.MAIN_SOURCE_SET_NAME) { enableTests() }
- configureSourceSet("jsp20")
- configureSourceSet("jsp21") { enableTests() }
+ configureSourceSet("javaxServlet") { enableTests() }
configureSourceSet("jython20")
configureSourceSet("jython22")
configureSourceSet("jython25") { enableTests() }
@@ -105,7 +104,7 @@ tasks.jar.configure {
configurations {
register("combinedClasspath") {
extendsFrom(named("jython25CompileClasspath").get())
- extendsFrom(named("jsp21CompileClasspath").get())
+ extendsFrom(named("javaxServletCompileClasspath").get())
}
}
@@ -494,7 +493,7 @@ eclipse {
configurations["combinedClasspath"],
configurations["core16CompileClasspath"],
configurations["testUtilsCompileClasspath"],
- configurations["jsp21TestCompileClasspath"]
+ configurations["javaxServletTestCompileClasspath"]
)
}
}
@@ -515,7 +514,7 @@ configurations {
exclude(group = "xml-apis", module = "xml-apis")
}
- "jsp21TestImplementation" {
+ "javaxServletTestImplementation" {
extendsFrom(compileClasspath.get())
exclude(group = "javax.servlet.jsp")
exclude(group = "javax.servlet", module = "servlet-api")
@@ -544,27 +543,23 @@ dependencies {
testImplementation(xalan)
- "jsp20CompileOnly"("javax.servlet.jsp:jsp-api:2.0")
- "jsp20CompileOnly"("javax.servlet:servlet-api:2.4")
+ "javaxServletCompileOnly"("javax.servlet.jsp:jsp-api:2.1")
+ "javaxServletCompileOnly"("javax.servlet:servlet-api:2.5")
- "jsp21CompileOnly"(sourceSets["jsp20"].output)
- "jsp21CompileOnly"("javax.servlet.jsp:jsp-api:2.1")
- "jsp21CompileOnly"("javax.servlet:servlet-api:2.5")
-
- "jsp21TestImplementation"("org.eclipse.jetty:jetty-server:${jettyVersion}")
- "jsp21TestImplementation"("org.eclipse.jetty:jetty-webapp:${jettyVersion}")
- "jsp21TestImplementation"("org.eclipse.jetty:jetty-util:${jettyVersion}")
- "jsp21TestImplementation"("org.eclipse.jetty:apache-jsp:${jettyVersion}")
+ "javaxServletTestImplementation"("org.eclipse.jetty:jetty-server:${jettyVersion}")
+ "javaxServletTestImplementation"("org.eclipse.jetty:jetty-webapp:${jettyVersion}")
+ "javaxServletTestImplementation"("org.eclipse.jetty:jetty-util:${jettyVersion}")
+ "javaxServletTestImplementation"("org.eclipse.jetty:apache-jsp:${jettyVersion}")
// Jetty also contains the servlet-api and jsp-api classes
// JSP JSTL (not included in Jetty):
- "jsp21TestImplementation"("org.apache.taglibs:taglibs-standard-impl:${tagLibsVersion}")
- "jsp21TestImplementation"("org.apache.taglibs:taglibs-standard-spec:${tagLibsVersion}")
+ "javaxServletTestImplementation"("org.apache.taglibs:taglibs-standard-impl:${tagLibsVersion}")
+ "javaxServletTestImplementation"("org.apache.taglibs:taglibs-standard-spec:${tagLibsVersion}")
- "jsp21TestImplementation"("org.springframework:spring-core:${springVersion}") {
+ "javaxServletTestImplementation"("org.springframework:spring-core:${springVersion}") {
exclude(group = "commons-logging", module = "commons-logging")
}
- "jsp21TestImplementation"("org.springframework:spring-test:${springVersion}") {
+ "javaxServletTestImplementation"("org.springframework:spring-test:${springVersion}") {
exclude(group = "commons-logging", module = "commons-logging")
}
diff --git a/freemarker-jsp20/src/main/java/freemarker/cache/WebappTemplateLoader.java b/freemarker-javax-servlet/src/main/java/freemarker/cache/WebappTemplateLoader.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/cache/WebappTemplateLoader.java
rename to freemarker-javax-servlet/src/main/java/freemarker/cache/WebappTemplateLoader.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/EventForwarding.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/EventForwarding.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/EventForwarding.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/EventForwarding.java
diff --git a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
similarity index 100%
rename from freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
similarity index 69%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
index 9f673357..0df7dfd8 100644
--- a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
+++ b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
@@ -20,16 +20,21 @@
package freemarker.ext.jsp;
import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
+import javax.servlet.jsp.JspApplicationContext;
import javax.servlet.jsp.JspEngineInfo;
import javax.servlet.jsp.JspFactory;
import javax.servlet.jsp.PageContext;
-/**
- */
-abstract class FreeMarkerJspFactory extends JspFactory {
- protected abstract String getSpecificationVersion();
+class FreeMarkerJspFactory extends JspFactory {
+ private static final String SPECIFICATION_VERSION = "2.2";
+ private static final String JSPCTX_KEY = "freemarker.ext.jsp.FreeMarkerJspFactory21#jspAppContext";
+
+ protected String getSpecificationVersion() {
+ return SPECIFICATION_VERSION;
+ }
@Override
public JspEngineInfo getEngineInfo() {
@@ -60,4 +65,21 @@ abstract class FreeMarkerJspFactory extends JspFactory {
// for this API.
throw new UnsupportedOperationException();
}
+
+ @Override
+ public JspApplicationContext getJspApplicationContext(ServletContext ctx) {
+ JspApplicationContext jspctx = (JspApplicationContext) ctx.getAttribute(
+ JSPCTX_KEY);
+ if (jspctx == null) {
+ synchronized (ctx) {
+ jspctx = (JspApplicationContext) ctx.getAttribute(JSPCTX_KEY);
+ if (jspctx == null) {
+ jspctx = new FreeMarkerJspApplicationContext();
+ ctx.setAttribute(JSPCTX_KEY, jspctx);
+ }
+ }
+ }
+ return jspctx;
+ }
+
}
\ No newline at end of file
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
similarity index 76%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
index 041f8926..b97d2c74 100644
--- a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
+++ b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
@@ -23,12 +23,15 @@ package freemarker.ext.jsp;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.ListIterator;
+import javax.el.ELContext;
import javax.servlet.GenericServlet;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
@@ -41,8 +44,14 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import javax.servlet.http.HttpSession;
+import javax.servlet.jsp.JspApplicationContext;
+import javax.servlet.jsp.JspContext;
+import javax.servlet.jsp.JspFactory;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
+import javax.servlet.jsp.el.ELException;
+import javax.servlet.jsp.el.ExpressionEvaluator;
+import javax.servlet.jsp.el.VariableResolver;
import javax.servlet.jsp.tagext.BodyContent;
import freemarker.core.Environment;
@@ -50,6 +59,7 @@ import freemarker.ext.servlet.FreemarkerServlet;
import freemarker.ext.servlet.HttpRequestHashModel;
import freemarker.ext.servlet.ServletContextHashModel;
import freemarker.ext.util.WrapperTemplateModel;
+import freemarker.log.Logger;
import freemarker.template.AdapterTemplateModel;
import freemarker.template.ObjectWrapper;
import freemarker.template.ObjectWrapperAndUnwrapper;
@@ -62,13 +72,22 @@ import freemarker.template.TemplateModelIterator;
import freemarker.template.TemplateNumberModel;
import freemarker.template.TemplateScalarModel;
import freemarker.template._VersionInts;
+import freemarker.template.utility.ClassUtil;
import freemarker.template.utility.UndeclaredThrowableException;
-/**
- */
-abstract class FreeMarkerPageContext extends PageContext implements TemplateModel {
+class FreeMarkerPageContext extends PageContext implements TemplateModel {
+ private static final Logger LOG = Logger.getLogger("freemarker.jsp");
+
+ static {
+ if (JspFactory.getDefaultFactory() == null) {
+ JspFactory.setDefaultFactory(new FreeMarkerJspFactory());
+ }
+ LOG.debug("Using JspFactory implementation class " +
+ JspFactory.getDefaultFactory().getClass().getName());
+ }
+
private static final Class OBJECT_CLASS = Object.class;
-
+
private final Environment environment;
private final int incompatibleImprovements;
private List tags = new ArrayList();
@@ -80,7 +99,8 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
private final ObjectWrapper wrapper;
private final ObjectWrapperAndUnwrapper unwrapper;
private JspWriter jspOut;
-
+ private ELContext elContext;
+
protected FreeMarkerPageContext() throws TemplateModelException {
environment = Environment.getCurrentEnvironment();
incompatibleImprovements = environment.getConfiguration().getIncompatibleImprovements().intValue();
@@ -94,15 +114,15 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
if (appModel instanceof ServletContextHashModel) {
this.servlet = ((ServletContextHashModel) appModel).getServlet();
} else {
- throw new TemplateModelException("Could not find an instance of " +
- ServletContextHashModel.class.getName() +
- " in the data model under either the name " +
- FreemarkerServlet.KEY_APPLICATION_PRIVATE + " or " +
+ throw new TemplateModelException("Could not find an instance of " +
+ ServletContextHashModel.class.getName() +
+ " in the data model under either the name " +
+ FreemarkerServlet.KEY_APPLICATION_PRIVATE + " or " +
FreemarkerServlet.KEY_APPLICATION);
}
-
- TemplateModel requestModel =
- environment.getGlobalVariable(FreemarkerServlet.KEY_REQUEST_PRIVATE);
+
+ TemplateModel requestModel =
+ environment.getGlobalVariable(FreemarkerServlet.KEY_REQUEST_PRIVATE);
if (!(requestModel instanceof HttpRequestHashModel)) {
requestModel = environment.getGlobalVariable(
FreemarkerServlet.KEY_REQUEST);
@@ -116,10 +136,10 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
unwrapper = this.wrapper instanceof ObjectWrapperAndUnwrapper
? (ObjectWrapperAndUnwrapper) this.wrapper : null;
} else {
- throw new TemplateModelException("Could not find an instance of " +
- HttpRequestHashModel.class.getName() +
- " in the data model under either the name " +
- FreemarkerServlet.KEY_REQUEST_PRIVATE + " or " +
+ throw new TemplateModelException("Could not find an instance of " +
+ HttpRequestHashModel.class.getName() +
+ " in the data model under either the name " +
+ FreemarkerServlet.KEY_REQUEST_PRIVATE + " or " +
FreemarkerServlet.KEY_REQUEST);
}
@@ -132,17 +152,17 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
setAttribute(CONFIG, servlet.getServletConfig());
setAttribute(PAGECONTEXT, this);
setAttribute(APPLICATION, servlet.getServletContext());
- }
-
+ }
+
ObjectWrapper getObjectWrapper() {
return wrapper;
}
-
+
@Override
public void initialize(
- Servlet servlet, ServletRequest request, ServletResponse response,
- String errorPageURL, boolean needsSession, int bufferSize,
- boolean autoFlush) {
+ Servlet servlet, ServletRequest request, ServletResponse response,
+ String errorPageURL, boolean needsSession, int bufferSize,
+ boolean autoFlush) {
throw new UnsupportedOperationException();
}
@@ -157,7 +177,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
@Override
public void setAttribute(String name, Object value, int scope) {
- switch(scope) {
+ switch (scope) {
case PAGE_SCOPE: {
try {
environment.setGlobalVariable(name, wrapper.wrap(value));
@@ -263,7 +283,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
@Override
public void removeAttribute(String name, int scope) {
- switch(scope) {
+ switch (scope) {
case PAGE_SCOPE: {
environment.getGlobalNamespace().remove(name);
break;
@@ -300,11 +320,11 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
@Override
public Enumeration getAttributeNamesInScope(int scope) {
- switch(scope) {
+ switch (scope) {
case PAGE_SCOPE: {
try {
- return
- new TemplateHashModelExEnumeration(environment.getGlobalNamespace());
+ return
+ new TemplateHashModelExEnumeration(environment.getGlobalNamespace());
} catch (TemplateModelException e) {
throw new UndeclaredThrowableException(e);
}
@@ -347,7 +367,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
public HttpSession getSession() {
return getSession(false);
}
-
+
@Override
public Object getPage() {
return servlet;
@@ -401,7 +421,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
public PrintWriter getWriter() {
return pw;
}
-
+
@Override
public ServletOutputStream getOutputStream() {
throw new UnsupportedOperationException("JSP-included resource must use getWriter()");
@@ -422,13 +442,13 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
@Override
public BodyContent pushBody() {
- return (BodyContent) pushWriter(new TagTransformModel.BodyContentImpl(getOut(), true));
- }
+ return (BodyContent) pushWriter(new TagTransformModel.BodyContentImpl(getOut(), true));
+ }
- @Override
-public JspWriter pushBody(Writer w) {
- return pushWriter(new JspWriterAdapter(w));
- }
+ @Override
+ public JspWriter pushBody(Writer w) {
+ return pushWriter(new JspWriterAdapter(w));
+ }
@Override
public JspWriter popBody() {
@@ -444,35 +464,95 @@ public JspWriter pushBody(Writer w) {
}
}
return null;
- }
-
+ }
+
void popTopTag() {
tags.remove(tags.size() - 1);
- }
+ }
void popWriter() {
jspOut = (JspWriter) outs.remove(outs.size() - 1);
setAttribute(OUT, jspOut);
}
-
+
void pushTopTag(Object tag) {
tags.add(tag);
- }
-
+ }
+
JspWriter pushWriter(JspWriter out) {
outs.add(jspOut);
jspOut = out;
setAttribute(OUT, jspOut);
return out;
- }
-
+ }
+
+ /**
+ * Attempts to locate and manufacture an expression evaulator instance. For this to work you <b>must</b> have the
+ * Apache Commons-EL package in the classpath. If Commons-EL is not available, this method will throw an
+ * UnsupportedOperationException.
+ */
+ @Override
+ public ExpressionEvaluator getExpressionEvaluator() {
+ try {
+ Class type = ((ClassLoader) AccessController.doPrivileged(
+ new PrivilegedAction() {
+ @Override
+ public Object run() {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ })).loadClass
+ ("org.apache.commons.el.ExpressionEvaluatorImpl");
+ return (ExpressionEvaluator) type.newInstance();
+ } catch (Exception e) {
+ throw new UnsupportedOperationException("In order for the getExpressionEvaluator() " +
+ "method to work, you must have downloaded the apache commons-el jar and " +
+ "made it available in the classpath.");
+ }
+ }
+
+ /**
+ * Returns a variable resolver that will resolve variables by searching through the page scope, request scope,
+ * session scope and application scope for an attribute with a matching name.
+ */
+ @Override
+ public VariableResolver getVariableResolver() {
+ final PageContext ctx = this;
+
+ return new VariableResolver() {
+ @Override
+ public Object resolveVariable(String name) throws ELException {
+ return ctx.findAttribute(name);
+ }
+ };
+ }
+
+ @Override
+ public ELContext getELContext() {
+ if (elContext == null) {
+ JspApplicationContext jspctx = JspFactory.getDefaultFactory().getJspApplicationContext(getServletContext());
+ if (jspctx instanceof FreeMarkerJspApplicationContext) {
+ elContext = ((FreeMarkerJspApplicationContext) jspctx).createNewELContext(this);
+ elContext.putContext(JspContext.class, this);
+ } else {
+ throw new UnsupportedOperationException(
+ "Can not create an ELContext using a foreign JspApplicationContext (of class "
+ + ClassUtil.getShortClassNameOfObject(jspctx) + ").\n" +
+ "Hint: The cause of this is often that you are trying to use JSTL tags/functions in " +
+ "FTL. "
+ + "In that case, know that that's not really suppored, and you are supposed to use FTL "
+ + "constrcuts instead, like #list instead of JSTL's forEach, etc.");
+ }
+ }
+ return elContext;
+ }
+
private static class TemplateHashModelExEnumeration implements Enumeration {
private final TemplateModelIterator it;
-
+
private TemplateHashModelExEnumeration(TemplateHashModelEx hashEx) throws TemplateModelException {
it = hashEx.keys().iterator();
}
-
+
@Override
public boolean hasMoreElements() {
try {
@@ -481,7 +561,7 @@ public JspWriter pushBody(Writer w) {
throw new UndeclaredThrowableException(tme);
}
}
-
+
@Override
public Object nextElement() {
try {
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreemarkerTag.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreemarkerTag.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreemarkerTag.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/FreemarkerTag.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspContextModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspContextModel.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspContextModel.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspContextModel.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspTagModelBase.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspTagModelBase.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspTagModelBase.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspTagModelBase.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/PageContextFactory.java
similarity index 53%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/PageContextFactory.java
index 2eed561f..b7fedb97 100644
--- a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
+++ b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/PageContextFactory.java
@@ -19,12 +19,21 @@
package freemarker.ext.jsp;
+import javax.servlet.jsp.PageContext;
-/**
- */
-class FreeMarkerJspFactory2 extends FreeMarkerJspFactory {
- @Override
- protected String getSpecificationVersion() {
- return "2.0";
+import freemarker.core.Environment;
+import freemarker.template.TemplateModel;
+import freemarker.template.TemplateModelException;
+
+class PageContextFactory {
+ static FreeMarkerPageContext getCurrentPageContext() throws TemplateModelException {
+ Environment env = Environment.getCurrentEnvironment();
+ TemplateModel pageContextModel = env.getGlobalVariable(PageContext.PAGECONTEXT);
+ if (pageContextModel instanceof FreeMarkerPageContext) {
+ return (FreeMarkerPageContext) pageContextModel;
+ }
+ FreeMarkerPageContext pageContext = new FreeMarkerPageContext();
+ env.setGlobalVariable(PageContext.PAGECONTEXT, pageContext);
+ return pageContext;
}
-}
\ No newline at end of file
+}
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TagTransformModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TagTransformModel.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/TagTransformModel.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TagTransformModel.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibFactory.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TaglibFactory.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibFactory.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TaglibFactory.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/package.html b/freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/package.html
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/jsp/package.html
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/jsp/package.html
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/IncludePage.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/IncludePage.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/IncludePage.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/IncludePage.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/InitParamParser.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/InitParamParser.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/InitParamParser.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/InitParamParser.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/package.html b/freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/package.html
similarity index 100%
rename from freemarker-jsp20/src/main/java/freemarker/ext/servlet/package.html
rename to freemarker-javax-servlet/src/main/java/freemarker/ext/servlet/package.html
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/TLDParsingTest.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/TLDParsingTest.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/TLDParsingTest.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/TLDParsingTest.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/ext/servlet/InitParamParserTest.java b/freemarker-javax-servlet/src/test/java/freemarker/ext/servlet/InitParamParserTest.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/ext/servlet/InitParamParserTest.java
rename to freemarker-javax-servlet/src/test/java/freemarker/ext/servlet/InitParamParserTest.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/template/MockServletContext.java b/freemarker-javax-servlet/src/test/java/freemarker/template/MockServletContext.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/template/MockServletContext.java
rename to freemarker-javax-servlet/src/test/java/freemarker/template/MockServletContext.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java b/freemarker-javax-servlet/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java
rename to freemarker-javax-servlet/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java b/freemarker-javax-servlet/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java
rename to freemarker-javax-servlet/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2Action.java b/freemarker-javax-servlet/src/test/java/freemarker/test/servlet/Model2Action.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2Action.java
rename to freemarker-javax-servlet/src/test/java/freemarker/test/servlet/Model2Action.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2TesterServlet.java b/freemarker-javax-servlet/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
rename to freemarker-javax-servlet/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
diff --git a/freemarker-jsp21/src/test/java/freemarker/test/servlet/WebAppTestCase.java b/freemarker-javax-servlet/src/test/java/freemarker/test/servlet/WebAppTestCase.java
similarity index 100%
rename from freemarker-jsp21/src/test/java/freemarker/test/servlet/WebAppTestCase.java
rename to freemarker-javax-servlet/src/test/java/freemarker/test/servlet/WebAppTestCase.java
diff --git a/freemarker-jsp21/src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld b/freemarker-javax-servlet/src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld
similarity index 100%
rename from freemarker-jsp21/src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld
rename to freemarker-javax-servlet/src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl b/freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl
rename to freemarker-javax-servlet/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl
diff --git a/freemarker-jsp21/src/test/resources/freemarker/test/servlet/web.xml b/freemarker-javax-servlet/src/test/resources/freemarker/test/servlet/web.xml
similarity index 100%
rename from freemarker-jsp21/src/test/resources/freemarker/test/servlet/web.xml
rename to freemarker-javax-servlet/src/test/resources/freemarker/test/servlet/web.xml
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/PageContextFactory.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/PageContextFactory.java
deleted file mode 100644
index 51aad6d0..00000000
--- a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/PageContextFactory.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.ext.jsp;
-
-import javax.servlet.jsp.PageContext;
-
-import freemarker.core.Environment;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-import freemarker.template.utility.UndeclaredThrowableException;
-
-/**
- */
-class PageContextFactory {
- private static final Class pageContextImpl = getPageContextImpl();
-
- private static Class getPageContextImpl() {
- try {
- try {
- PageContext.class.getMethod("getELContext", (Class[]) null);
- return Class.forName("freemarker.ext.jsp._FreeMarkerPageContext21");
- } catch (NoSuchMethodException e1) {
- try {
- PageContext.class.getMethod("getExpressionEvaluator", (Class[]) null);
- return Class.forName("freemarker.ext.jsp._FreeMarkerPageContext2");
- } catch (NoSuchMethodException e2) {
- throw new IllegalStateException(
- "Since FreeMarker 2.3.24, JSP support requires at least JSP 2.0.");
- }
- }
- } catch (ClassNotFoundException e) {
- throw new NoClassDefFoundError(e.getMessage());
- }
- }
-
- static FreeMarkerPageContext getCurrentPageContext() throws TemplateModelException {
- Environment env = Environment.getCurrentEnvironment();
- TemplateModel pageContextModel = env.getGlobalVariable(PageContext.PAGECONTEXT);
- if (pageContextModel instanceof FreeMarkerPageContext) {
- return (FreeMarkerPageContext) pageContextModel;
- }
- try {
- FreeMarkerPageContext pageContext =
- (FreeMarkerPageContext) pageContextImpl.newInstance();
- env.setGlobalVariable(PageContext.PAGECONTEXT, pageContext);
- return pageContext;
- } catch (IllegalAccessException e) {
- throw new IllegalAccessError(e.getMessage());
- } catch (InstantiationException e) {
- throw new UndeclaredThrowableException(e);
- }
- }
-
-}
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java
deleted file mode 100644
index d2fa19dc..00000000
--- a/freemarker-jsp20/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.ext.jsp;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.jsp.JspFactory;
-import javax.servlet.jsp.PageContext;
-import javax.servlet.jsp.el.ELException;
-import javax.servlet.jsp.el.ExpressionEvaluator;
-import javax.servlet.jsp.el.VariableResolver;
-
-import freemarker.log.Logger;
-import freemarker.template.TemplateModelException;
-
-/**
- * Don't use this class; it's only public to work around Google App Engine Java
- * compliance issues. FreeMarker developers only: treat this class as package-visible.
- *
- * Implementation of PageContext that contains JSP 2.0 specific methods.
- */
-public class _FreeMarkerPageContext2 extends FreeMarkerPageContext {
- private static final Logger LOG = Logger.getLogger("freemarker.jsp");
-
- static {
- if (JspFactory.getDefaultFactory() == null) {
- JspFactory.setDefaultFactory(new FreeMarkerJspFactory2());
- }
- LOG.debug("Using JspFactory implementation class " +
- JspFactory.getDefaultFactory().getClass().getName());
- }
-
- public _FreeMarkerPageContext2() throws TemplateModelException {
- super();
- }
-
- /**
- * Attempts to locate and manufacture an expression evaulator instance. For this
- * to work you <b>must</b> have the Apache Commons-EL package in the classpath. If
- * Commons-EL is not available, this method will throw an UnsupportedOperationException.
- */
- @Override
- public ExpressionEvaluator getExpressionEvaluator() {
- try {
- Class type = Thread.currentThread().getContextClassLoader().loadClass
- ("org.apache.commons.el.ExpressionEvaluatorImpl");
- return (ExpressionEvaluator) type.newInstance();
- } catch (Exception e) {
- throw new UnsupportedOperationException("In order for the getExpressionEvaluator() " +
- "method to work, you must have downloaded the apache commons-el jar and " +
- "made it available in the classpath.");
- }
- }
-
- /**
- * Returns a variable resolver that will resolve variables by searching through
- * the page scope, request scope, session scope and application scope for an
- * attribute with a matching name.
- */
- @Override
- public VariableResolver getVariableResolver() {
- final PageContext ctx = this;
-
- return new VariableResolver() {
- @Override
- public Object resolveVariable(String name) throws ELException {
- return ctx.findAttribute(name);
- }
- };
- }
-
- /**
- * Includes the specified path. The flush argument is ignored!
- */
- @Override
- public void include(String path, boolean flush) throws IOException, ServletException {
- super.include(path);
- }
-}
diff --git a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java b/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java
deleted file mode 100644
index d7670c0f..00000000
--- a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.ext.jsp;
-
-import javax.servlet.ServletContext;
-import javax.servlet.jsp.JspApplicationContext;
-
-/**
- */
-class FreeMarkerJspFactory21 extends FreeMarkerJspFactory {
- private static final String JSPCTX_KEY =
- FreeMarkerJspFactory21.class.getName() + "#jspAppContext";
-
- @Override
- protected String getSpecificationVersion() {
- return "2.1";
- }
-
- @Override
- public JspApplicationContext getJspApplicationContext(ServletContext ctx) {
- JspApplicationContext jspctx = (JspApplicationContext) ctx.getAttribute(
- JSPCTX_KEY);
- if (jspctx == null) {
- synchronized (ctx) {
- jspctx = (JspApplicationContext) ctx.getAttribute(JSPCTX_KEY);
- if (jspctx == null) {
- jspctx = new FreeMarkerJspApplicationContext();
- ctx.setAttribute(JSPCTX_KEY, jspctx);
- }
- }
- }
- return jspctx;
- }
-}
\ No newline at end of file
diff --git a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java b/freemarker-jsp21/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
deleted file mode 100644
index d99e22cc..00000000
--- a/freemarker-jsp21/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.ext.jsp;
-
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-import javax.el.ELContext;
-import javax.servlet.jsp.JspApplicationContext;
-import javax.servlet.jsp.JspContext;
-import javax.servlet.jsp.JspFactory;
-import javax.servlet.jsp.PageContext;
-import javax.servlet.jsp.el.ELException;
-import javax.servlet.jsp.el.ExpressionEvaluator;
-import javax.servlet.jsp.el.VariableResolver;
-
-import freemarker.log.Logger;
-import freemarker.template.TemplateModelException;
-import freemarker.template.utility.ClassUtil;
-
-/**
- * Don't use this class; it's only public to work around Google App Engine Java
- * compliance issues. FreeMarker developers only: treat this class as package-visible.
- *
- * Implementation of PageContext that contains JSP 2.0 and JSP 2.1 specific
- * methods.
- */
-public class _FreeMarkerPageContext21 extends FreeMarkerPageContext {
- private static final Logger LOG = Logger.getLogger("freemarker.jsp");
-
- static {
- if (JspFactory.getDefaultFactory() == null) {
- JspFactory.setDefaultFactory(new FreeMarkerJspFactory21());
- }
- LOG.debug("Using JspFactory implementation class " +
- JspFactory.getDefaultFactory().getClass().getName());
- }
-
- public _FreeMarkerPageContext21() throws TemplateModelException {
- super();
- }
-
- /**
- * Attempts to locate and manufacture an expression evaulator instance. For this
- * to work you <b>must</b> have the Apache Commons-EL package in the classpath. If
- * Commons-EL is not available, this method will throw an UnsupportedOperationException.
- */
- @Override
- public ExpressionEvaluator getExpressionEvaluator() {
- try {
- Class type = ((ClassLoader) AccessController.doPrivileged(
- new PrivilegedAction() {
- @Override
- public Object run() {
- return Thread.currentThread().getContextClassLoader();
- }
- })).loadClass
- ("org.apache.commons.el.ExpressionEvaluatorImpl");
- return (ExpressionEvaluator) type.newInstance();
- } catch (Exception e) {
- throw new UnsupportedOperationException("In order for the getExpressionEvaluator() " +
- "method to work, you must have downloaded the apache commons-el jar and " +
- "made it available in the classpath.");
- }
- }
-
- /**
- * Returns a variable resolver that will resolve variables by searching through
- * the page scope, request scope, session scope and application scope for an
- * attribute with a matching name.
- */
- @Override
- public VariableResolver getVariableResolver() {
- final PageContext ctx = this;
-
- return new VariableResolver() {
- @Override
- public Object resolveVariable(String name) throws ELException {
- return ctx.findAttribute(name);
- }
- };
- }
-
- private ELContext elContext;
-
- @Override
- public ELContext getELContext() {
- if (elContext == null) {
- JspApplicationContext jspctx = JspFactory.getDefaultFactory().getJspApplicationContext(getServletContext());
- if (jspctx instanceof FreeMarkerJspApplicationContext) {
- elContext = ((FreeMarkerJspApplicationContext) jspctx).createNewELContext(this);
- elContext.putContext(JspContext.class, this);
- } else {
- throw new UnsupportedOperationException(
- "Can not create an ELContext using a foreign JspApplicationContext (of class "
- + ClassUtil.getShortClassNameOfObject(jspctx) + ").\n" +
- "Hint: The cause of this is often that you are trying to use JSTL tags/functions in FTL. "
- + "In that case, know that that's not really suppored, and you are supposed to use FTL "
- + "constrcuts instead, like #list instead of JSTL's forEach, etc.");
- }
- }
- return elContext;
- }
-}
diff --git a/freemarker-manual/src/main/docgen/en_US/book.xml b/freemarker-manual/src/main/docgen/en_US/book.xml
index fce81f36..9d184e00 100644
--- a/freemarker-manual/src/main/docgen/en_US/book.xml
+++ b/freemarker-manual/src/main/docgen/en_US/book.xml
@@ -30097,7 +30097,10 @@ TemplateModel x = env.getVariable("x"); // get variable x</programlisting>
<para>Release date: [TODO]</para>
<para>Please note that with this version the minimum required Java
- version was increased from Java 7 to Java 8.</para>
+ version was increased from Java 7 to Java 8. Also for the few who
+ relly on Servlet and/or JSP support, the minimum is now increased to
+ Servlet 3.0, and JSP 2.2 (which are still very old versions from
+ 2011).</para>
<section>
<title>Changes on the FTL side</title>
@@ -30301,6 +30304,26 @@ TemplateModel x = env.getVariable("x"); // get variable x</programlisting>
</listitem>
</itemizedlist>
</listitem>
+
+ <listitem>
+ <para>Minimum requirements were increased:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Java 8 (or higher)</para>
+ </listitem>
+
+ <listitem>
+ <para>If Servlet-related features are used, Servlet 3.0 (or
+ higher)</para>
+ </listitem>
+
+ <listitem>
+ <para>If JSP-related features are used, JSP 2.2 (or
+ higher)</para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
</itemizedlist>
</section>
</section>