This is an automated email from the ASF dual-hosted git repository.

ddekany pushed a commit to branch 3
in repository https://gitbox.apache.org/repos/asf/freemarker.git

commit 64ae10976f644f88e7b5b2079d663f908cfb75dc
Author: ddekany <[email protected]>
AuthorDate: Wed Dec 27 21:33:41 2023 +0100

    Servlet: Switched from javax to Jakarta. JSP tag support is currently 
broken, but we probably should remove it anyway. Also updated Spring to 6.x, as 
that's what already supports on Jakarta.
---
 FM3-CHANGE-LOG.txt                                 |  2 +
 README.md                                          |  2 +
 freemarker-manual/src/main/docgen/en_US/book.xml   | 22 +++----
 freemarker-servlet/build.gradle.kts                | 38 ++++++------
 .../freemarker/servlet/AllHttpScopesHashModel.java |  6 +-
 .../freemarker/servlet/FreemarkerServlet.java      | 16 ++---
 .../freemarker/servlet/HttpRequestHashModel.java   | 17 ++----
 .../servlet/HttpRequestParametersHashModel.java    | 17 ++----
 .../freemarker/servlet/HttpSessionHashModel.java   | 13 ++--
 .../org/apache/freemarker/servlet/IncludePage.java | 28 ++++-----
 .../apache/freemarker/servlet/InitParamParser.java | 17 +++---
 .../servlet/ServletContextHashModel.java           |  5 +-
 .../freemarker/servlet/WebAppTemplateLoader.java   | 23 ++++---
 .../freemarker/servlet/jsp/BodyContentImpl.java    | 12 ++--
 .../freemarker/servlet/jsp/EventForwarding.java    | 10 ++--
 .../jsp/FreeMarkerJspApplicationContext.java       | 28 +++------
 .../servlet/jsp/FreeMarkerJspFactory.java          | 16 ++---
 .../servlet/jsp/FreeMarkerPageContext.java         | 22 +++----
 .../freemarker/servlet/jsp/JspTagModelBase.java    |  6 +-
 .../freemarker/servlet/jsp/JspWriterAdapter.java   |  7 +--
 .../freemarker/servlet/jsp/PageContextFactory.java |  3 +-
 .../servlet/jsp/SimpleTagDirectiveModel.java       | 21 ++++---
 .../freemarker/servlet/jsp/TagDirectiveModel.java  | 19 +++---
 .../freemarker/servlet/jsp/TaglibFactory.java      |  6 +-
 .../servlet/DummyMockServletContext.java           | 70 +++++++++++++---------
 .../freemarker/servlet/FreemarkerServletTest.java  | 42 ++++++-------
 .../servlet/jsp/JspTestFreemarkerServlet.java      |  3 +-
 .../servlet/jsp/RealServletContainertTest.java     | 35 +++++------
 .../freemarker/servlet/jsp/TLDParsingTest.java     | 23 ++++---
 .../jsp/taglibmembers/AttributeAccessorTag.java    |  5 +-
 .../jsp/taglibmembers/AttributeInfoTag.java        | 13 ++--
 .../servlet/jsp/taglibmembers/GetAndSetTag.java    | 11 ++--
 .../servlet/jsp/taglibmembers/TestSimpleTag.java   | 12 ++--
 .../servlet/jsp/taglibmembers/TestSimpleTag2.java  |  6 +-
 .../servlet/jsp/taglibmembers/TestSimpleTag3.java  |  6 +-
 .../servlet/jsp/taglibmembers/TestTag.java         | 10 +---
 .../servlet/jsp/taglibmembers/TestTag2.java        |  8 +--
 .../servlet/jsp/taglibmembers/TestTag3.java        |  8 +--
 .../servlet/test/DefaultModel2TesterAction.java    |  9 ++-
 .../freemarker/servlet/test/Model2Action.java      |  4 +-
 .../servlet/test/Model2TesterServlet.java          | 19 +++---
 .../freemarker/servlet/test/WebAppTestCase.java    | 19 ++----
 freemarker-spring/build.gradle.kts                 | 19 +++---
 .../model/AbstractSpringTemplateCallableModel.java | 12 +---
 .../AbstractSpringTemplateDirectiveModel.java      | 11 ++--
 .../model/AbstractSpringTemplateFunctionModel.java |  5 +-
 .../freemarker/spring/model/BindDirective.java     | 11 ++--
 .../spring/model/BindErrorsDirective.java          | 11 ++--
 .../freemarker/spring/model/EvalFunction.java      | 12 +---
 .../freemarker/spring/model/MessageFunction.java   | 17 ++----
 .../spring/model/NestedPathDirective.java          | 11 ++--
 .../model/SpringTemplateCallableHashModel.java     | 13 ++--
 .../freemarker/spring/model/ThemeFunction.java     |  5 +-
 .../freemarker/spring/model/TransformFunction.java |  9 ++-
 .../freemarker/spring/model/UrlFunction.java       | 47 ++++++---------
 ...stractCheckedElementTemplateDirectiveModel.java |  9 ++-
 ...DataBoundFormElementTemplateDirectiveModel.java | 11 ++--
 .../form/AbstractFormTemplateDirectiveModel.java   | 11 ++--
 .../AbstractHtmlElementTemplateDirectiveModel.java | 23 +++----
 ...ractHtmlInputElementTemplateDirectiveModel.java | 11 ++--
 ...tMultiCheckedElementTemplateDirectiveModel.java | 22 +++----
 ...SingleCheckedElementTemplateDirectiveModel.java | 11 ++--
 .../model/form/ButtonTemplateDirectiveModel.java   | 11 ++--
 .../model/form/CheckboxTemplateDirectiveModel.java | 11 ++--
 .../form/CheckboxesTemplateDirectiveModel.java     |  9 ++-
 .../model/form/ErrorsTemplateDirectiveModel.java   | 17 +++---
 .../model/form/FormTemplateDirectiveModel.java     | 28 ++++-----
 .../form/HiddenInputTemplateDirectiveModel.java    | 11 ++--
 .../model/form/InputTemplateDirectiveModel.java    | 11 ++--
 .../model/form/LabelTemplateDirectiveModel.java    | 11 ++--
 .../model/form/OptionTemplateDirectiveModel.java   | 11 ++--
 .../model/form/OptionsTemplateDirectiveModel.java  | 11 ++--
 .../form/PasswordInputTemplateDirectiveModel.java  | 11 ++--
 .../form/RadioButtonTemplateDirectiveModel.java    | 11 ++--
 .../form/RadioButtonsTemplateDirectiveModel.java   |  4 +-
 .../model/form/SelectTemplateDirectiveModel.java   | 23 +++----
 .../form/SpringFormTemplateCallableHashModel.java  | 13 ++--
 .../model/form/TextareaTemplateDirectiveModel.java | 11 ++--
 .../spring/web/view/AbstractFreeMarkerView.java    | 13 ++--
 .../freemarker/spring/web/view/FreeMarkerView.java | 23 +++----
 .../spring/web/view/FreeMarkerViewResolver.java    |  7 +--
 .../spring/web/view/PageContextServlet.java        | 12 ++--
 .../spring/web/view/PageContextServletConfig.java  |  6 +-
 .../apache/freemarker/spring/web/view/EchoTag.java |  6 +-
 .../web/view/FreeMarkerViewResolverTest.java       | 15 +++--
 .../spring/web/view/FreeMarkerViewTest.java        | 17 +++---
 86 files changed, 545 insertions(+), 698 deletions(-)

diff --git a/FM3-CHANGE-LOG.txt b/FM3-CHANGE-LOG.txt
index f9ac009e..92b2a028 100644
--- a/FM3-CHANGE-LOG.txt
+++ b/FM3-CHANGE-LOG.txt
@@ -640,3 +640,5 @@ Things not yet forward-ported from 2.3-gae
 - Lambda-like expressions: The way those work in 2.x is limited because of BC 
restrictions. So it should work differently here.
 - ?with_args/?with_args_last: Have to implement the better null handling in 
the template language first
 - Some of the Gradle build refinements, like signature related and, 
rebroducible build stuff
+- JSP taglib support is broken with Jakarta... but then, we probably don't 
want to support that on Jakarta.
+  So it should be removed.
diff --git a/README.md b/README.md
index 7533d408..f047dcba 100644
--- a/README.md
+++ b/README.md
@@ -4,3 +4,5 @@ Apache FreeMarker 3
 This is a placeholder README for the "experimental" FreeMarker 3 branch.
 
 See more here: 
https://cwiki.apache.org/confluence/display/FREEMARKER/FreeMarker+3
+
+See also the FM3-CHANGE-LOG.txt
diff --git a/freemarker-manual/src/main/docgen/en_US/book.xml 
b/freemarker-manual/src/main/docgen/en_US/book.xml
index 8569625e..6cdb76c4 100644
--- a/freemarker-manual/src/main/docgen/en_US/book.xml
+++ b/freemarker-manual/src/main/docgen/en_US/book.xml
@@ -7067,7 +7067,7 @@ public class Product {
         <literal>TemplateModel</literal> interface. This makes it possible,
         for example, to access <literal>java.sql.ResultSet</literal> as
         sequence variable in templates, or to access
-        <literal>javax.servlet.ServletRequest</literal> objects as a hash
+        <literal>jakarta.servlet.ServletRequest</literal> objects as a hash
         variable that contains the request attributes, or even to traverse XML
         documents as FTL variables (<link linkend="xgui">see here</link>). To
         wrap (convert) these objects, however, you need to plug the proper
@@ -12101,7 +12101,7 @@ ${bar?trim}</programlisting>
           between the <quote>beans</quote> of JSP scopes and FTL variables.
           For the custom JSP tags, the request, session and application scopes
           are exactly the same as with real JSP: the attributes of the
-          <literal>javax.servlet.ServletContext</literal>,
+          <literal>jakarta.servlet.ServletContext</literal>,
           <literal>HttpSession</literal> and <literal>ServletRequest</literal>
           objects. From the FTL side you see these 3 scopes together as the
           data-model, as it was explained earlier. The page scope corresponds
@@ -12151,7 +12151,7 @@ ${bar?trim}</programlisting>
 
           <para>Note that you can use JSP taglibs with FreeMarker even if the
           servlet container has no native JSP support, just make sure that the
-          <literal>javax.servlet.jsp.*</literal> packages for JSP 2.0 (or
+          <literal>jakarta.servlet.jsp.*</literal> packages for JSP 2.0 (or
           later) are available to your Web application.</para>
 
           <para>As of this writing, JSP features up to JSP 2.1 are
@@ -36883,7 +36883,7 @@ TemplateModel x = env.getVariable("x");  // get 
variable x</programlisting>
             <listitem>
               <para>Bug fixed: When using FreeMarker's JSP support with JSP
               tags that use
-              <literal>javax.servlet.jsp.PageContext.pushBody</literal> (like
+              <literal>jakarta.servlet.jsp.PageContext.pushBody</literal> (like
               some Stripes tags), <literal>"ArrayIndexOutOfBoundsException:
               -1"</literal> occurred inside
               
<literal>freemarker.ext.jsp.FreeMarkerPageContext.popWriter</literal>.</para>
@@ -38316,7 +38316,7 @@ TemplateModel x = env.getVariable("x");  // get 
variable x</programlisting>
           <para>There is a bugfix that may affect the behavior of you Web
           application if you use JSP tags in FreeMarker templates:
           FreeMarker's implementation of
-          <literal>javax.servlet.jsp.PageContext.getSession()</literal> was
+          <literal>jakarta.servlet.jsp.PageContext.getSession()</literal> was
           incorrect. The <literal>getSession()</literal> method is a
           convenience method by which the custom tag can get the current
           <literal>HttpSession</literal> object (possibly
@@ -38477,7 +38477,7 @@ TemplateModel x = env.getVariable("x");  // get 
variable x</programlisting>
 
             <listitem>
               <para>Bugfix: FreeMarker's implementation of
-              <literal>javax.servlet.jsp.PageContext.getSession()</literal>
+              <literal>jakarta.servlet.jsp.PageContext.getSession()</literal>
               was incorrect. The <literal>getSession()</literal> method is a
               convenience method by which the custom tag can get the current
               <literal>HttpSession</literal> object (possibly
@@ -40553,10 +40553,10 @@ TemplateModel x = env.getVariable("x");  // get 
variable x</programlisting>
               
<literal>Configuration.setServletContextForTemplateLoading</literal>
               has been changed: the first parameter is now
               <literal>Object</literal> instead of
-              <literal>javax.servlet.ServletContext</literal>. Thus, you have
+              <literal>jakarta.servlet.ServletContext</literal>. Thus, you have
               to recompile your classes that call this method. The change was
               required to prevent class-loading failure when
-              <literal>javax.servlet</literal> classes are not available and
+              <literal>jakarta.servlet</literal> classes are not available and
               you would not call this method.</para>
             </listitem>
 
@@ -41082,9 +41082,9 @@ TemplateModel x = env.getVariable("x");  // get 
variable x</programlisting>
 
             <listitem>
               <para>Bugfix: FreeMarker didn't work if the
-              <literal>javax.servlet</literal> classes was not available,
+              <literal>jakarta.servlet</literal> classes was not available,
               because <literal>Configuration</literal> explicitly referred to
-              <literal>javax.servlet.ServletContext</literal>.</para>
+              <literal>jakarta.servlet.ServletContext</literal>.</para>
             </listitem>
 
             <listitem>
@@ -42866,7 +42866,7 @@ TemplateModel x = env.getVariable("x");  // get 
variable x</programlisting>
         </listitem>
 
         <listitem>
-          <para>Obviously, <literal>javax.servlet</literal> classes are needed
+          <para>Obviously, <literal>jakarta.servlet</literal> classes are 
needed
           for <literal>FreemarkerServlet</literal>. Servlet version 2.2 or
           later is needed.</para>
         </listitem>
diff --git a/freemarker-servlet/build.gradle.kts 
b/freemarker-servlet/build.gradle.kts
index 496faf3b..2b561a67 100644
--- a/freemarker-servlet/build.gradle.kts
+++ b/freemarker-servlet/build.gradle.kts
@@ -34,29 +34,24 @@ dependencies {
     api(libs.legacyFreemarker)
 
     // Servlet, JSP, and EL related classes
-    compileOnly("javax.servlet:javax.servlet-api:3.1.0")
-    compileOnly("javax.servlet.jsp:javax.servlet.jsp-api:2.3.3")
-    compileOnly("javax.el:javax.el-api:3.0.0")
+    compileOnly("jakarta.servlet:jakarta.servlet-api:5.0.0")
+    compileOnly("jakarta.servlet.jsp:jakarta.servlet.jsp-api:3.0.0")
+    compileOnly("jakarta.el:jakarta.el-api:4.0.0")
 
-    // Chose the Jetty version very carefully, as it should implement the same 
Servlet API, JSP API, and EL API
-    // than what we declare above, because the same classes will come from 
Jetty as well. For example, Jetty depends
-    // on org.mortbay.jasper:apache-el, which contains the javax.el classes, 
along with non-javax.el classes, so you
-    // can't even exclude it. Similarly, org.eclipse.jetty:apache-jsp contains 
the JSP API javax.servlet.jsp classes,
-    // yet again along with other classes. Anyway, this mess is temporary, as 
we will migrate to Jakarta, and only
-    // support that.
-    val jettyVersion = "9.4.53.v20231009"
-    testImplementation("org.eclipse.jetty:jetty-server:$jettyVersion")
-    testImplementation("org.eclipse.jetty:jetty-webapp:$jettyVersion")
-    testImplementation("org.eclipse.jetty:jetty-util:$jettyVersion")
-    testImplementation("org.eclipse.jetty:apache-jsp:$jettyVersion")
+    // Jetty 12 is Servlet 6 (jakarta), Jetty 11 was Servlet 5 (also jakarta). 
But Spring Servlet API mocks,
+    // which we use in tests, jump from Servlet 4 (javax) to 6 (jakarta). So, 
we have to go with 12.
+    // (Note that Jetty artifact names, package names were completely changed 
in 12, also some old API-s
+    // were replaced with something else. So our test utility code is affected 
by this as well.)
+    val jettyVersion = "12.0.5"
+    // ".ee10" means Jakarta EE 10 => Servlet 6, JSP 3.1, JSTL 3.0
+    
testImplementation("org.eclipse.jetty.ee10:jetty-ee10-webapp:$jettyVersion")
+    
testImplementation("org.eclipse.jetty.ee10:jetty-ee10-annotations:$jettyVersion")
+    
testImplementation("org.eclipse.jetty.ee10:jetty-ee10-apache-jsp:$jettyVersion")
+    
testImplementation("org.eclipse.jetty.ee10:jetty-ee10-glassfish-jstl:$jettyVersion")
+    testImplementation("org.eclipse.jetty:jetty-slf4j-impl:$jettyVersion")
     // Jetty also contains the servlet-api and jsp-api and el-api classes
 
-    // JSP JSTL (not included in Jetty):
-    val apacheStandardTaglibsVersion = "1.2.5"
-    
testImplementation("org.apache.taglibs:taglibs-standard-impl:$apacheStandardTaglibsVersion")
-    
testImplementation("org.apache.taglibs:taglibs-standard-spec:$apacheStandardTaglibsVersion")
-
-    testImplementation("displaytag:displaytag:1.2") {
+    testImplementation("com.github.hazendaz:displaytag:2.5.3") {
         exclude(group = "com.lowagie", module = "itext")
         // We manage logging centrally:
         exclude(group = "org.slf4j", module = "slf4j-log4j12")
@@ -67,8 +62,9 @@ dependencies {
     // Override Java 9 incompatible version (coming from displaytag):
     testImplementation("commons-lang:commons-lang:2.6")
 
-    val springVersion = "2.5.6.SEC03"
+    val springVersion = "6.0.15"
     testImplementation("org.springframework:spring-core:$springVersion")
+    testImplementation("org.springframework:spring-web:$springVersion")
     testImplementation("org.springframework:spring-test:$springVersion")
 
     testImplementation(project(":freemarker-test-utils"))
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/AllHttpScopesHashModel.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/AllHttpScopesHashModel.java
index 80e0f9a6..9e674ba2 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/AllHttpScopesHashModel.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/AllHttpScopesHashModel.java
@@ -19,14 +19,14 @@
 
 package org.apache.freemarker.servlet;
 
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpSession;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.impl.SimpleHash;
 
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
 import java.util.HashMap;
 import java.util.Map;
 
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
index b7301fb2..f2c3a252 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
@@ -19,6 +19,12 @@
 
 package org.apache.freemarker.servlet;
 
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpSession;
 import org.apache.freemarker.core.*;
 import org.apache.freemarker.core.Configuration.ExtendableBuilder;
 import org.apache.freemarker.core.model.ObjectWrapper;
@@ -41,12 +47,6 @@ import 
org.apache.freemarker.servlet.jsp.TaglibFactory.MetaInfTldSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
 import java.io.IOException;
 import java.io.Writer;
 import java.nio.charset.Charset;
@@ -1080,11 +1080,11 @@ public class FreemarkerServlet extends HttpServlet {
      */
     protected String requestUrlToTemplatePath(HttpServletRequest request) 
throws ServletException {
         // First, see if it's an included request
-        String includeServletPath  = (String) 
request.getAttribute("javax.servlet.include.servlet_path");
+        String includeServletPath  = (String) 
request.getAttribute("jakarta.servlet.include.servlet_path");
         if (includeServletPath != null) {
             // Try path info; only if that's null (servlet is mapped to an
             // URL extension instead of to prefix) use servlet path.
-            String includePathInfo = (String) 
request.getAttribute("javax.servlet.include.path_info");
+            String includePathInfo = (String) 
request.getAttribute("jakarta.servlet.include.path_info");
             return includePathInfo == null ? includeServletPath : 
includePathInfo;
         } 
         // Seems that the servlet was not called as the result of a 
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestHashModel.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestHashModel.java
index 690e3bca..cf85742e 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestHashModel.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestHashModel.java
@@ -19,21 +19,16 @@
 
 package org.apache.freemarker.servlet;
 
-import java.util.ArrayList;
-import java.util.Enumeration;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.model.ObjectWrapper;
-import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
-import org.apache.freemarker.core.model.TemplateCollectionModel;
-import org.apache.freemarker.core.model.TemplateHashModelEx;
-import org.apache.freemarker.core.model.TemplateModel;
+import org.apache.freemarker.core.model.*;
 import org.apache.freemarker.core.model.impl.SimpleCollection;
 import org.apache.freemarker.core.model.impl.SimpleString;
 
+import java.util.ArrayList;
+import java.util.Enumeration;
+
 /**
  * TemplateHashModel wrapper for a HttpServletRequest attributes.
  */
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestParametersHashModel.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestParametersHashModel.java
index 104331a7..98973a0f 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestParametersHashModel.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestParametersHashModel.java
@@ -19,21 +19,16 @@
 
 package org.apache.freemarker.servlet;
 
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
+import jakarta.servlet.http.HttpServletRequest;
 import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.model.ObjectWrapper;
-import org.apache.freemarker.core.model.TemplateCollectionModel;
-import org.apache.freemarker.core.model.TemplateHashModelEx;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelIterator;
+import org.apache.freemarker.core.model.*;
 import org.apache.freemarker.core.model.impl.SimpleCollection;
 import org.apache.freemarker.core.model.impl.SimpleString;
 
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
 /**
  * TemplateHashModel wrapper for a HttpServletRequest parameters.
  */
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpSessionHashModel.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpSessionHashModel.java
index bf7f5a69..dbba19a5 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpSessionHashModel.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpSessionHashModel.java
@@ -19,18 +19,17 @@
 
 package org.apache.freemarker.servlet;
 
-import java.io.Serializable;
-
-import javax.servlet.GenericServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
+import jakarta.servlet.GenericServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpSession;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
 
+import java.io.Serializable;
+
 /**
  * TemplateHashModel wrapper for a HttpSession attributes.
  */
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/IncludePage.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/IncludePage.java
index ca138428..3e58e708 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/IncludePage.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/IncludePage.java
@@ -19,23 +19,11 @@
 
 package org.apache.freemarker.servlet;
 
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.Writer;
-import java.lang.reflect.Array;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
-
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponseWrapper;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -47,6 +35,12 @@ import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util.DeepUnwrap;
 import org.apache.freemarker.core.util.StringToIndexMap;
 
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.lang.reflect.Array;
+import java.util.*;
+
 
 /**
  * A model that when invoked with a 'path' parameter will perform a servlet 
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/InitParamParser.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/InitParamParser.java
index e74d475a..266945c4 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/InitParamParser.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/InitParamParser.java
@@ -18,15 +18,7 @@
  */
 package org.apache.freemarker.servlet;
 
-import java.io.File;
-import java.io.IOException;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import javax.servlet.ServletContext;
-
+import jakarta.servlet.ServletContext;
 import org.apache.freemarker.core._ObjectBuilderSettingEvaluator;
 import org.apache.freemarker.core._SettingEvaluationEnvironment;
 import org.apache.freemarker.core.templateresolver.TemplateLoader;
@@ -37,6 +29,13 @@ import org.apache.freemarker.core.util._StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.File;
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
 
 final class InitParamParser {
 
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/ServletContextHashModel.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/ServletContextHashModel.java
index 6a75777b..a3e2d772 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/ServletContextHashModel.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/ServletContextHashModel.java
@@ -19,9 +19,8 @@
 
 package org.apache.freemarker.servlet;
 
-import javax.servlet.GenericServlet;
-import javax.servlet.ServletContext;
-
+import jakarta.servlet.GenericServlet;
+import jakarta.servlet.ServletContext;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateHashModel;
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/WebAppTemplateLoader.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/WebAppTemplateLoader.java
index b72ce789..b1fbb611 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/WebAppTemplateLoader.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/WebAppTemplateLoader.java
@@ -19,18 +19,7 @@
 
 package org.apache.freemarker.servlet;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.Serializable;
-import java.lang.reflect.Method;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Objects;
-
-import javax.servlet.ServletContext;
-
+import jakarta.servlet.ServletContext;
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.templateresolver.TemplateLoader;
 import org.apache.freemarker.core.templateresolver.TemplateLoaderSession;
@@ -44,6 +33,16 @@ import org.apache.freemarker.core.util._StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.Serializable;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Objects;
+
 /**
  * A {@link TemplateLoader} that uses streams reachable through {@link 
ServletContext#getResource(String)} as its source
  * of templates.  
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/BodyContentImpl.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/BodyContentImpl.java
index af0a8e00..1204d991 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/BodyContentImpl.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/BodyContentImpl.java
@@ -19,14 +19,10 @@
 
 package org.apache.freemarker.servlet.jsp;
 
-import java.io.CharArrayReader;
-import java.io.CharArrayWriter;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.Writer;
-
-import javax.servlet.jsp.JspWriter;
-import javax.servlet.jsp.tagext.BodyContent;
+import jakarta.servlet.jsp.JspWriter;
+import jakarta.servlet.jsp.tagext.BodyContent;
+
+import java.io.*;
 
 /**
  * An implementation of BodyContent that buffers it's input to a char[].
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/EventForwarding.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/EventForwarding.java
index 4123f169..39dc7a15 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/EventForwarding.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/EventForwarding.java
@@ -19,14 +19,14 @@
 
 package org.apache.freemarker.servlet.jsp;
 
+import jakarta.servlet.*;
+import jakarta.servlet.http.HttpSessionAttributeListener;
+import jakarta.servlet.http.HttpSessionBindingEvent;
+import jakarta.servlet.http.HttpSessionEvent;
+import jakarta.servlet.http.HttpSessionListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.servlet.*;
-import javax.servlet.http.HttpSessionAttributeListener;
-import javax.servlet.http.HttpSessionBindingEvent;
-import javax.servlet.http.HttpSessionEvent;
-import javax.servlet.http.HttpSessionListener;
 import java.util.ArrayList;
 import java.util.EventListener;
 import java.util.Iterator;
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerJspApplicationContext.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerJspApplicationContext.java
index 559c70ff..521202ac 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerJspApplicationContext.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerJspApplicationContext.java
@@ -19,31 +19,17 @@
 
 package org.apache.freemarker.servlet.jsp;
 
-import java.util.Iterator;
-import java.util.LinkedList;
-
-import javax.el.ArrayELResolver;
-import javax.el.BeanELResolver;
-import javax.el.CompositeELResolver;
-import javax.el.ELContext;
-import javax.el.ELContextEvent;
-import javax.el.ELContextListener;
-import javax.el.ELResolver;
-import javax.el.ExpressionFactory;
-import javax.el.FunctionMapper;
-import javax.el.ListELResolver;
-import javax.el.MapELResolver;
-import javax.el.ResourceBundleELResolver;
-import javax.el.ValueExpression;
-import javax.el.VariableMapper;
-import javax.servlet.jsp.JspApplicationContext;
-import javax.servlet.jsp.el.ImplicitObjectELResolver;
-import javax.servlet.jsp.el.ScopedAttributeELResolver;
-
+import jakarta.el.*;
+import jakarta.servlet.jsp.JspApplicationContext;
+import jakarta.servlet.jsp.el.ImplicitObjectELResolver;
+import jakarta.servlet.jsp.el.ScopedAttributeELResolver;
 import org.apache.freemarker.core.util._ClassUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Iterator;
+import java.util.LinkedList;
+
 /**
  */
 class FreeMarkerJspApplicationContext implements JspApplicationContext {
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerJspFactory.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerJspFactory.java
index 1aa566af..bcad9e9c 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerJspFactory.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerJspFactory.java
@@ -19,14 +19,14 @@
 
 package org.apache.freemarker.servlet.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;
+import jakarta.servlet.Servlet;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.jsp.JspApplicationContext;
+import jakarta.servlet.jsp.JspEngineInfo;
+import jakarta.servlet.jsp.JspFactory;
+import jakarta.servlet.jsp.PageContext;
 
 /**
  */
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
index f7a5d882..2aff1108 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
@@ -20,6 +20,17 @@
 
 package org.apache.freemarker.servlet.jsp;
 
+import jakarta.el.ELContext;
+import jakarta.servlet.*;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponseWrapper;
+import jakarta.servlet.http.HttpSession;
+import jakarta.servlet.jsp.*;
+import jakarta.servlet.jsp.el.ELException;
+import jakarta.servlet.jsp.el.ExpressionEvaluator;
+import jakarta.servlet.jsp.el.VariableResolver;
+import jakarta.servlet.jsp.tagext.BodyContent;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.*;
@@ -31,17 +42,6 @@ import org.apache.freemarker.servlet.ServletContextHashModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.el.ELContext;
-import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
-import javax.servlet.http.HttpSession;
-import javax.servlet.jsp.*;
-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 java.io.IOException;
 import java.io.PrintWriter;
 import java.io.Writer;
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
index 95ef654b..f3631687 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
@@ -19,6 +19,9 @@
 
 package org.apache.freemarker.servlet.jsp;
 
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.DynamicAttributes;
+import jakarta.servlet.jsp.tagext.JspTag;
 import org.apache.freemarker.core.*;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
@@ -28,9 +31,6 @@ import 
org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
 import org.apache.freemarker.core.util._StringUtils;
 import 
org.apache.freemarker.servlet.jsp.SimpleTagDirectiveModel.TemplateExceptionWrapperJspException;
 
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.DynamicAttributes;
-import javax.servlet.jsp.tagext.JspTag;
 import java.beans.BeanInfo;
 import java.beans.IntrospectionException;
 import java.beans.Introspector;
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspWriterAdapter.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspWriterAdapter.java
index 8f135c2e..219b6a88 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspWriterAdapter.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspWriterAdapter.java
@@ -19,13 +19,12 @@
 
 package org.apache.freemarker.servlet.jsp;
 
+import jakarta.servlet.jsp.JspWriter;
+import org.apache.freemarker.core.util._SecurityUtils;
+
 import java.io.IOException;
 import java.io.Writer;
 
-import javax.servlet.jsp.JspWriter;
-
-import org.apache.freemarker.core.util._SecurityUtils;
-
 class JspWriterAdapter extends JspWriter {
     static final char[] NEWLINE = 
_SecurityUtils.getSystemProperty("line.separator", "\n").toCharArray();
     
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/PageContextFactory.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/PageContextFactory.java
index 9cfb0df2..5aa77f1f 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/PageContextFactory.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/PageContextFactory.java
@@ -19,12 +19,11 @@
 
 package org.apache.freemarker.servlet.jsp;
 
+import jakarta.servlet.jsp.PageContext;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateModel;
 
-import javax.servlet.jsp.PageContext;
-
 /**
  */
 class PageContextFactory {
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/SimpleTagDirectiveModel.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/SimpleTagDirectiveModel.java
index 619b8c6e..9868f60b 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/SimpleTagDirectiveModel.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/SimpleTagDirectiveModel.java
@@ -19,17 +19,12 @@
 
 package org.apache.freemarker.servlet.jsp;
 
-import java.beans.IntrospectionException;
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.jsp.JspContext;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.JspFragment;
-import javax.servlet.jsp.tagext.JspTag;
-import javax.servlet.jsp.tagext.SimpleTag;
-import javax.servlet.jsp.tagext.Tag;
-
+import jakarta.servlet.jsp.JspContext;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.JspFragment;
+import jakarta.servlet.jsp.tagext.JspTag;
+import jakarta.servlet.jsp.tagext.SimpleTag;
+import jakarta.servlet.jsp.tagext.Tag;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -38,6 +33,10 @@ import 
org.apache.freemarker.core.model.TemplateDirectiveModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
 
+import java.beans.IntrospectionException;
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Adapts a {@link SimpleTag}-based custom JSP tag to be a value that's 
callable in templates as an user-defined
  * directive. For {@link Tag}-based custom JSP tags {@link TagDirectiveModel} 
is used instead.
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TagDirectiveModel.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TagDirectiveModel.java
index fdb3a587..29395619 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TagDirectiveModel.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TagDirectiveModel.java
@@ -19,18 +19,9 @@
 
 package org.apache.freemarker.servlet.jsp;
 
-import java.beans.IntrospectionException;
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.JspWriter;
-import javax.servlet.jsp.tagext.BodyTag;
-import javax.servlet.jsp.tagext.IterationTag;
-import javax.servlet.jsp.tagext.SimpleTag;
-import javax.servlet.jsp.tagext.Tag;
-import javax.servlet.jsp.tagext.TryCatchFinally;
-
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.JspWriter;
+import jakarta.servlet.jsp.tagext.*;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -41,6 +32,10 @@ import org.apache.freemarker.core.model.TemplateModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.beans.IntrospectionException;
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Adapts a {@link Tag}-based custom JSP tag to be a value that's callable in 
templates as an user-defined directive.
  * For {@link SimpleTag}-based custom JSP tags {@link SimpleTagDirectiveModel} 
is used instead.
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index f7034d3e..6e469618 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -19,6 +19,9 @@
 
 package org.apache.freemarker.servlet.jsp;
 
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.jsp.tagext.Tag;
 import org.apache.freemarker.core.ConfigurationException;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -32,9 +35,6 @@ import org.slf4j.LoggerFactory;
 import org.xml.sax.*;
 import org.xml.sax.helpers.DefaultHandler;
 
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.jsp.tagext.Tag;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParserFactory;
 import java.beans.IntrospectionException;
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/DummyMockServletContext.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/DummyMockServletContext.java
index b54f696c..bda0fd93 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/DummyMockServletContext.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/DummyMockServletContext.java
@@ -18,9 +18,10 @@
  */
 package org.apache.freemarker.servlet;
 
-import javax.servlet.*;
-import javax.servlet.ServletRegistration.Dynamic;
-import javax.servlet.descriptor.JspConfigDescriptor;
+import jakarta.servlet.*;
+import jakarta.servlet.ServletRegistration.Dynamic;
+import jakarta.servlet.descriptor.JspConfigDescriptor;
+
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -111,36 +112,16 @@ public class DummyMockServletContext implements 
ServletContext {
         return null;
     }
 
-    @Override
-    public Servlet getServlet(String arg0) throws ServletException {
-        return null;
-    }
-
     @Override
     public String getServletContextName() {
         return "MyApp";
     }
 
-    @Override
-    public Enumeration getServletNames() {
-        return null;
-    }
-
-    @Override
-    public Enumeration getServlets() {
-        return null;
-    }
-
     @Override
     public void log(String arg0) {
         
     }
 
-    @Override
-    public void log(Exception arg0, String arg1) {
-        
-    }
-
     @Override
     public void log(String arg0, Throwable arg1) {
         
@@ -177,6 +158,11 @@ public class DummyMockServletContext implements 
ServletContext {
         return null;
     }
 
+    @Override
+    public Dynamic addJspFile(String s, String s1) {
+        return null;
+    }
+
     @Override
     public <T extends Servlet> T createServlet(Class<T> clazz) throws 
ServletException {
         return null;
@@ -193,19 +179,19 @@ public class DummyMockServletContext implements 
ServletContext {
     }
 
     @Override
-    public javax.servlet.FilterRegistration.Dynamic addFilter(String 
filterName, String className)
+    public jakarta.servlet.FilterRegistration.Dynamic addFilter(String 
filterName, String className)
             throws IllegalArgumentException, IllegalStateException {
         return null;
     }
 
     @Override
-    public javax.servlet.FilterRegistration.Dynamic addFilter(String 
filterName, Filter filter)
+    public jakarta.servlet.FilterRegistration.Dynamic addFilter(String 
filterName, Filter filter)
             throws IllegalArgumentException, IllegalStateException {
         return null;
     }
 
     @Override
-    public javax.servlet.FilterRegistration.Dynamic addFilter(String 
filterName, Class<? extends Filter> filterClass)
+    public jakarta.servlet.FilterRegistration.Dynamic addFilter(String 
filterName, Class<? extends Filter> filterClass)
             throws IllegalArgumentException, IllegalStateException {
         return null;
     }
@@ -251,6 +237,36 @@ public class DummyMockServletContext implements 
ServletContext {
         return null;
     }
 
+    @Override
+    public int getSessionTimeout() {
+        return 0;
+    }
+
+    @Override
+    public void setSessionTimeout(int i) {
+
+    }
+
+    @Override
+    public String getRequestCharacterEncoding() {
+        return null;
+    }
+
+    @Override
+    public void setRequestCharacterEncoding(String s) {
+
+    }
+
+    @Override
+    public String getResponseCharacterEncoding() {
+        return null;
+    }
+
+    @Override
+    public void setResponseCharacterEncoding(String s) {
+
+    }
+
     @Override
     public SessionCookieConfig getSessionCookieConfig() {
         return null;
@@ -282,7 +298,7 @@ public class DummyMockServletContext implements 
ServletContext {
 
     @Override
     public ClassLoader getClassLoader() {
-        return null;
+        return this.getClassLoader();
     }
 
     @Override
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/FreemarkerServletTest.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/FreemarkerServletTest.java
index 2a7db59a..c737ea89 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/FreemarkerServletTest.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/FreemarkerServletTest.java
@@ -18,31 +18,12 @@
  */
 package org.apache.freemarker.servlet;
 
-import static org.apache.freemarker.servlet.FreemarkerServlet.*;
-import static org.hamcrest.Matchers.*;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.nio.charset.UnsupportedCharsetException;
-import java.util.Locale;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.freemarker.core.Configuration;
-import org.apache.freemarker.core.Environment;
-import org.apache.freemarker.core.Template;
-import org.apache.freemarker.core.TemplateConfiguration;
-import org.apache.freemarker.core.TemplateException;
-import 
org.apache.freemarker.core.templateresolver.ConditionalTemplateConfigurationFactory;
-import org.apache.freemarker.core.templateresolver.FileNameGlobMatcher;
-import 
org.apache.freemarker.core.templateresolver.FirstMatchTemplateConfigurationFactory;
-import 
org.apache.freemarker.core.templateresolver.TemplateConfigurationFactory;
-import org.apache.freemarker.core.templateresolver.TemplateLoader;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.apache.freemarker.core.*;
+import org.apache.freemarker.core.templateresolver.*;
 import 
org.apache.freemarker.core.templateresolver.impl.ByteArrayTemplateLoader;
 import org.junit.Before;
 import org.junit.Test;
@@ -51,6 +32,17 @@ import org.springframework.mock.web.MockHttpServletResponse;
 import org.springframework.mock.web.MockServletConfig;
 import org.springframework.mock.web.MockServletContext;
 
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.charset.UnsupportedCharsetException;
+import java.util.Locale;
+
+import static org.apache.freemarker.servlet.FreemarkerServlet.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.junit.Assert.*;
+
 public class FreemarkerServletTest {
 
     private static final String OUTPUT_FORMAT_HEADER_FTL = 
"outputFormatHeader.f3ac";
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/JspTestFreemarkerServlet.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/JspTestFreemarkerServlet.java
index 1ce54ba1..63f16f4c 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/JspTestFreemarkerServlet.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/JspTestFreemarkerServlet.java
@@ -19,8 +19,7 @@
 
 package org.apache.freemarker.servlet.jsp;
 
-import javax.servlet.ServletContext;
-
+import jakarta.servlet.ServletContext;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.servlet.FreemarkerServlet;
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/RealServletContainertTest.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/RealServletContainertTest.java
index 893a7cdc..8b76a936 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/RealServletContainertTest.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/RealServletContainertTest.java
@@ -19,24 +19,11 @@
 
 package org.apache.freemarker.servlet.jsp;
 
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.util.AbstractList;
-import java.util.AbstractMap;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import com.google.common.collect.ImmutableSet;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.TemplateExceptionHandler;
 import org.apache.freemarker.core.model.ObjectWrapper;
@@ -53,9 +40,10 @@ import org.junit.Assert;
 import org.junit.Ignore;
 import org.junit.Test;
 
-import com.google.common.collect.ImmutableSet;
+import java.io.IOException;
+import java.util.*;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import static org.junit.Assert.*;
 
 /**
  * Tests {@link FreemarkerServlet} on a real (embedded) Servlet container.
@@ -71,6 +59,7 @@ public class RealServletContainertTest extends WebAppTestCase 
{
     private static final String WEBAPP_MULTIPLE_LOADERS = "multipleLoaders";
 
     @Test
+    @Ignore // Doesn't work since switched to Jakarta (with Jetty 12)
     public void basicTrivial() throws Exception {
         assertJSPAndFTLOutputEquals(WEBAPP_BASIC, "tester?view=trivial");
     }
@@ -114,6 +103,7 @@ public class RealServletContainertTest extends 
WebAppTestCase {
     }
     
     @Test
+    @Ignore // Doesn't work since switched to Jakarta (with Jetty 12)
     public void tldDiscoveryBasic() throws Exception {
         try {
             restartWebAppIfStarted(WEBAPP_TLD_DISCOVERY);
@@ -124,6 +114,7 @@ public class RealServletContainertTest extends 
WebAppTestCase {
     }
 
     @Test
+    @Ignore // Doesn't work since switched to Jakarta (with Jetty 12)
     public void tldDiscoveryBasicDefultOverride() throws Exception {
         try {
             restartWebAppIfStarted(WEBAPP_TLD_DISCOVERY);
@@ -135,6 +126,7 @@ public class RealServletContainertTest extends 
WebAppTestCase {
     }
     
     @Test
+    @Ignore // Doesn't work since switched to Jakarta (with Jetty 12)
     public void tldDiscoveryEmulatedProblems1() throws Exception {
         try {
             JspTestFreemarkerServlet.emulateNoJarURLConnections = true;
@@ -146,6 +138,7 @@ public class RealServletContainertTest extends 
WebAppTestCase {
     }
 
     @Test
+    @Ignore // Doesn't work since switched to Jakarta (with Jetty 12)
     public void tldDiscoveryEmulatedProblems2() throws Exception {
         try {
             JspTestFreemarkerServlet.emulateNoJarURLConnections = true;
@@ -163,6 +156,7 @@ public class RealServletContainertTest extends 
WebAppTestCase {
     }
 
     @Test
+    @Ignore // Doesn't work since switched to Jakarta (with Jetty 12)
     public void tldDiscoveryClasspathOnly() throws Exception {
         try {
             
System.setProperty(FreemarkerServlet.SYSTEM_PROPERTY_META_INF_TLD_SOURCES, 
"clear, classpath");
@@ -180,6 +174,7 @@ public class RealServletContainertTest extends 
WebAppTestCase {
      * Jetty container's JSTL jar-s will still be discovered.
      */
     @Test
+    @Ignore // Doesn't work since switched to Jakarta (with Jetty 12)
     public void tldDiscoveryNoClasspath() throws Exception {
         try {
             
System.setProperty(FreemarkerServlet.SYSTEM_PROPERTY_META_INF_TLD_SOURCES, 
"clear, webInfPerLibJars");
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/TLDParsingTest.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/TLDParsingTest.java
index 73c1e712..a7121b86 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/TLDParsingTest.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/TLDParsingTest.java
@@ -19,18 +19,10 @@
 
 package org.apache.freemarker.servlet.jsp;
 
-import static org.junit.Assert.*;
-
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Map;
-
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.TagSupport;
-import javax.xml.parsers.SAXParserFactory;
-
+import jakarta.servlet.ServletContextEvent;
+import jakarta.servlet.ServletContextListener;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.TagSupport;
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.NonTemplateCallPlace;
 import org.apache.freemarker.core.model.TemplateModel;
@@ -47,6 +39,13 @@ import org.junit.runners.JUnit4;
 import org.xml.sax.InputSource;
 import org.xml.sax.XMLReader;
 
+import javax.xml.parsers.SAXParserFactory;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Map;
+
+import static org.junit.Assert.*;
+
 @RunWith(JUnit4.class)
 public class TLDParsingTest {
 
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/AttributeAccessorTag.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/AttributeAccessorTag.java
index 49e071b4..3de184ff 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/AttributeAccessorTag.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/AttributeAccessorTag.java
@@ -19,9 +19,8 @@
 
 package org.apache.freemarker.servlet.jsp.taglibmembers;
 
-import javax.servlet.jsp.PageContext;
-import javax.servlet.jsp.tagext.SimpleTagSupport;
-
+import jakarta.servlet.jsp.PageContext;
+import jakarta.servlet.jsp.tagext.SimpleTagSupport;
 import org.apache.freemarker.core.util._StringUtils;
 
 public abstract class AttributeAccessorTag extends SimpleTagSupport {
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/AttributeInfoTag.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/AttributeInfoTag.java
index e8b6eea4..0a64d1f5 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/AttributeInfoTag.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/AttributeInfoTag.java
@@ -19,16 +19,15 @@
 
 package org.apache.freemarker.servlet.jsp.taglibmembers;
 
-import java.io.IOException;
-import java.util.Date;
-
-import javax.servlet.jsp.JspContext;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.JspWriter;
-
+import jakarta.servlet.jsp.JspContext;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.JspWriter;
 import org.apache.freemarker.core.util._DateUtils;
 import 
org.apache.freemarker.core.util._DateUtils.TrivialDateToISO8601CalendarFactory;
 
+import java.io.IOException;
+import java.util.Date;
+
 public class AttributeInfoTag extends AttributeAccessorTag {
 
     @SuppressWarnings("boxing")
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/GetAndSetTag.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/GetAndSetTag.java
index 2de1b848..0d74e5ea 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/GetAndSetTag.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/GetAndSetTag.java
@@ -19,14 +19,13 @@
 
 package org.apache.freemarker.servlet.jsp.taglibmembers;
 
-import java.io.IOException;
-
-import javax.servlet.jsp.JspContext;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.JspWriter;
-
+import jakarta.servlet.jsp.JspContext;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.JspWriter;
 import org.apache.freemarker.core.util._NullArgumentException;
 
+import java.io.IOException;
+
 public class GetAndSetTag extends AttributeAccessorTag {
     
     private Object value;
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestSimpleTag.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestSimpleTag.java
index 6311c145..a9974a1f 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestSimpleTag.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestSimpleTag.java
@@ -19,13 +19,13 @@
 
 package org.apache.freemarker.servlet.jsp.taglibmembers;
 
-import java.io.IOException;
+import jakarta.servlet.jsp.JspContext;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.JspWriter;
+import jakarta.servlet.jsp.tagext.JspFragment;
+import jakarta.servlet.jsp.tagext.SimpleTagSupport;
 
-import javax.servlet.jsp.JspContext;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.JspWriter;
-import javax.servlet.jsp.tagext.JspFragment;
-import javax.servlet.jsp.tagext.SimpleTagSupport;
+import java.io.IOException;
 
 public class TestSimpleTag extends SimpleTagSupport {
     private int bodyLoopCount = 1;
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestSimpleTag2.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestSimpleTag2.java
index b28f0a3d..2f56099c 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestSimpleTag2.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestSimpleTag2.java
@@ -19,10 +19,10 @@
 
 package org.apache.freemarker.servlet.jsp.taglibmembers;
 
-import java.io.IOException;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.SimpleTagSupport;
 
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.SimpleTagSupport;
+import java.io.IOException;
 
 public class TestSimpleTag2 extends SimpleTagSupport {
     @Override
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestSimpleTag3.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestSimpleTag3.java
index c0bddada..22124f5a 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestSimpleTag3.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestSimpleTag3.java
@@ -19,10 +19,10 @@
 
 package org.apache.freemarker.servlet.jsp.taglibmembers;
 
-import java.io.IOException;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.SimpleTagSupport;
 
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.SimpleTagSupport;
+import java.io.IOException;
 
 public class TestSimpleTag3 extends SimpleTagSupport {
     @Override
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestTag.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestTag.java
index 69729c34..b71c3d1e 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestTag.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestTag.java
@@ -19,14 +19,10 @@
 
 package org.apache.freemarker.servlet.jsp.taglibmembers;
 
-import java.io.IOException;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.*;
 
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.BodyTag;
-import javax.servlet.jsp.tagext.BodyTagSupport;
-import javax.servlet.jsp.tagext.IterationTag;
-import javax.servlet.jsp.tagext.Tag;
-import javax.servlet.jsp.tagext.TryCatchFinally;
+import java.io.IOException;
 
 /**
  */
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestTag2.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestTag2.java
index b709625f..0eb719e8 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestTag2.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestTag2.java
@@ -19,11 +19,11 @@
 
 package org.apache.freemarker.servlet.jsp.taglibmembers;
 
-import java.io.IOException;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.Tag;
+import jakarta.servlet.jsp.tagext.TagSupport;
 
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.Tag;
-import javax.servlet.jsp.tagext.TagSupport;
+import java.io.IOException;
 
 /**
  */
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestTag3.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestTag3.java
index 7c2d680f..6f8135dd 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestTag3.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/taglibmembers/TestTag3.java
@@ -19,11 +19,11 @@
 
 package org.apache.freemarker.servlet.jsp.taglibmembers;
 
-import java.io.IOException;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.Tag;
+import jakarta.servlet.jsp.tagext.TagSupport;
 
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.Tag;
-import javax.servlet.jsp.tagext.TagSupport;
+import java.io.IOException;
 
 /**
  */
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/DefaultModel2TesterAction.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/DefaultModel2TesterAction.java
index 30d17fa6..4e77a83c 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/DefaultModel2TesterAction.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/DefaultModel2TesterAction.java
@@ -19,14 +19,13 @@
 
 package org.apache.freemarker.servlet.test;
 
+import com.google.common.collect.ImmutableMap;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
 import java.util.Arrays;
 import java.util.Date;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import com.google.common.collect.ImmutableMap;
-
 /**
  * Used by {@link Model2TesterServlet} if no action was explicitly specified.
  */
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/Model2Action.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/Model2Action.java
index fa834179..6bf3fcfa 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/Model2Action.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/Model2Action.java
@@ -19,8 +19,8 @@
 
 package org.apache.freemarker.servlet.test;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 public interface Model2Action {
 
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/Model2TesterServlet.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/Model2TesterServlet.java
index c0e97393..22564450 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/Model2TesterServlet.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/Model2TesterServlet.java
@@ -19,21 +19,20 @@
 
 package org.apache.freemarker.servlet.test;
 
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.RequestDispatcher;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.util._StringUtils;
 import org.apache.freemarker.servlet.FreemarkerServlet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
 /**
  * MVC controller servlet used for {@link FreemarkerServlet} JUnit tests. It 
understands these request parameters:
  * <ul>
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/WebAppTestCase.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/WebAppTestCase.java
index 37b80232..6e17a44e 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/WebAppTestCase.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/test/WebAppTestCase.java
@@ -24,13 +24,12 @@ import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.freemarker.test.ResourcesExtractor;
 import org.apache.freemarker.test.TestUtils;
-import org.eclipse.jetty.annotations.ServletContainerInitializersStarter;
-import org.eclipse.jetty.apache.jsp.JettyJasperInitializer;
-import org.eclipse.jetty.plus.annotation.ContainerInitializer;
+import org.eclipse.jetty.ee10.apache.jsp.JettyJasperInitializer;
+import org.eclipse.jetty.ee10.servlet.listener.ContainerInitializer;
+import org.eclipse.jetty.ee10.webapp.WebAppContext;
 import org.eclipse.jetty.server.NetworkConnector;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.webapp.WebAppContext;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.slf4j.Logger;
@@ -69,9 +68,6 @@ public class WebAppTestCase {
 
     @BeforeClass
     public static void beforeClass() throws Exception {
-        // Work around Java 5 bug(?) that causes Jasper to fail with "zip file 
closed" when it reads the JSTL jar:
-        org.eclipse.jetty.util.resource.Resource.setDefaultUseCaches(false);
-
         LOG.info("Starting embedded Jetty...");
 
         server = new Server(0);
@@ -265,12 +261,9 @@ public class WebAppTestCase {
      * return value of "org.apache.jasper.Options.getTldCache()" is null
      */
     private static void addJasperInitializer(WebAppContext context) {
-        JettyJasperInitializer jettyJasperInitializer = new 
JettyJasperInitializer();
-        ServletContainerInitializersStarter servletContainerInitializersStarter
-                = new ServletContainerInitializersStarter(context);
-        ContainerInitializer containerInitializer = new 
ContainerInitializer(jettyJasperInitializer, null);
-        context.setAttribute("org.eclipse.jetty.containerInitializers", 
List.of(containerInitializer));
-        context.addBean(servletContainerInitializersStarter, true);
+        context.addEventListener(
+                ContainerInitializer.asContextListener(
+                        new JettyJasperInitializer()));
     }
 
     private static void deleteTemporaryDirectories() throws IOException {
diff --git a/freemarker-spring/build.gradle.kts 
b/freemarker-spring/build.gradle.kts
index b7423dcf..7d1649b7 100644
--- a/freemarker-spring/build.gradle.kts
+++ b/freemarker-spring/build.gradle.kts
@@ -32,30 +32,25 @@ dependencies {
     api(project(":freemarker-core"))
     api(project(":freemarker-servlet"))
 
-    val geronimoServletSpec3Version = "1.0"
-    val geronimoJspSpec22Version = "1.2"
-    val geronimoELSpec22Version = "1.0.4"
+    val springVersion = "6.0.15"
 
-    val springVersion = "4.0.9.RELEASE"
-
-    
compileOnly("org.apache.geronimo.specs:geronimo-servlet_3.0_spec:${geronimoServletSpec3Version}")
     compileOnly("org.springframework:spring-core:$springVersion")
     compileOnly("org.springframework:spring-beans:$springVersion")
     compileOnly("org.springframework:spring-context:$springVersion")
     compileOnly("org.springframework:spring-web:$springVersion")
     compileOnly("org.springframework:spring-webmvc:$springVersion")
+    compileOnly("jakarta.servlet:jakarta.servlet-api:6.0.0")
+    compileOnly("jakarta.servlet.jsp:jakarta.servlet.jsp-api:3.1.0")
+    compileOnly("jakarta.el:jakarta.el-api:5.0.0")
 
-    val taglibsStandardVersion = "1.2.1"
-
-    
testImplementation("org.apache.geronimo.specs:geronimo-servlet_3.0_spec:${geronimoServletSpec3Version}")
     testImplementation("org.springframework:spring-core:$springVersion")
     testImplementation("org.springframework:spring-beans:$springVersion")
     testImplementation("org.springframework:spring-context:$springVersion")
     testImplementation("org.springframework:spring-web:$springVersion")
     testImplementation("org.springframework:spring-webmvc:$springVersion")
     testImplementation("org.springframework:spring-test:$springVersion")
-    
testImplementation("org.apache.geronimo.specs:geronimo-jsp_2.2_spec:${geronimoJspSpec22Version}")
-    
testImplementation("org.apache.geronimo.specs:geronimo-el_2.2_spec:${geronimoELSpec22Version}")
-    
testImplementation("org.apache.taglibs:taglibs-standard-spec:${taglibsStandardVersion}")
+    testImplementation("jakarta.servlet:jakarta.servlet-api:6.0.0")
+    testImplementation("jakarta.servlet.jsp:jakarta.servlet.jsp-api:3.1.0")
+    testImplementation("jakarta.el:jakarta.el-api:5.0.0")
     testImplementation(project(":freemarker-test-utils"))
 }
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateCallableModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateCallableModel.java
index d7a83812..2beafa62 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateCallableModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateCallableModel.java
@@ -19,17 +19,11 @@
 
 package org.apache.freemarker.spring.model;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.model.ObjectWrapper;
-import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
-import org.apache.freemarker.core.model.TemplateCallableModel;
-import org.apache.freemarker.core.model.TemplateFunctionModel;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateStringModel;
+import org.apache.freemarker.core.model.*;
 import org.apache.freemarker.core.util.CallableUtils;
 import org.springframework.web.servlet.support.BindStatus;
 import org.springframework.web.servlet.support.RequestContext;
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateDirectiveModel.java
index 43668415..5c5d77bd 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateDirectiveModel.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -33,6 +29,9 @@ import 
org.apache.freemarker.core.model.TemplateDirectiveModel;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Abstract TemplateDirectiveModel for derived classes to support Spring MVC 
based templating environment.
  */
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateFunctionModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateFunctionModel.java
index afb32621..cf11ecbf 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateFunctionModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateFunctionModel.java
@@ -19,9 +19,8 @@
 
 package org.apache.freemarker.spring.model;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/BindDirective.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/BindDirective.java
index 1a3917c8..4c9e1502 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/BindDirective.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/BindDirective.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -35,6 +31,9 @@ import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Provides <code>TemplateModel</code> wrapping <code>BindStatus</code> for 
the given bind path, working similarly
  * to Spring Framework's <code>&lt;spring:bind /&gt;</code> JSP Tag Library.
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/BindErrorsDirective.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/BindErrorsDirective.java
index 2f6a93ea..9bebfc56 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/BindErrorsDirective.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/BindErrorsDirective.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -35,6 +31,9 @@ import org.apache.freemarker.core.util.CallableUtils;
 import org.springframework.validation.Errors;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Provides <code>TemplateModel</code> wrapping the bind errors (type of 
<code>org.springframework.validation.Errors</code>)
  * for the given name, working similarly to Spring Framework's 
<code>&lt;spring:hasBindErrors /&gt;</code> JSP Tag Library.
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/EvalFunction.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/EvalFunction.java
index ed6e8fa8..1536aa66 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/EvalFunction.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/EvalFunction.java
@@ -19,9 +19,8 @@
 
 package org.apache.freemarker.spring.model;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -33,12 +32,7 @@ import 
org.springframework.context.expression.BeanFactoryResolver;
 import org.springframework.context.expression.EnvironmentAccessor;
 import org.springframework.context.expression.MapAccessor;
 import org.springframework.core.convert.ConversionService;
-import org.springframework.expression.AccessException;
-import org.springframework.expression.EvaluationContext;
-import org.springframework.expression.Expression;
-import org.springframework.expression.ExpressionParser;
-import org.springframework.expression.PropertyAccessor;
-import org.springframework.expression.TypedValue;
+import org.springframework.expression.*;
 import org.springframework.expression.spel.standard.SpelExpressionParser;
 import org.springframework.expression.spel.support.StandardEvaluationContext;
 import org.springframework.expression.spel.support.StandardTypeConverter;
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/MessageFunction.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/MessageFunction.java
index 75132c7a..37b4de7f 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/MessageFunction.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/MessageFunction.java
@@ -19,20 +19,12 @@
 
 package org.apache.freemarker.spring.model;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.model.ArgumentArrayLayout;
-import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
-import org.apache.freemarker.core.model.TemplateCollectionModel;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelIterator;
+import org.apache.freemarker.core.model.*;
 import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util.StringToIndexMap;
 import org.apache.freemarker.core.util._StringUtils;
@@ -40,6 +32,9 @@ import org.springframework.context.MessageSource;
 import org.springframework.context.MessageSourceResolvable;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * A <code>TemplateFunctionModel</code> providing functionality equivalent to 
the Spring Framework's
  * <code>&lt;spring:message /&gt;</code> JSP Tag Library.
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/NestedPathDirective.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/NestedPathDirective.java
index 43788f6a..7f6225c1 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/NestedPathDirective.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/NestedPathDirective.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -36,6 +32,9 @@ import org.apache.freemarker.core.util.CallableUtils;
 import org.springframework.beans.PropertyAccessor;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Provides <code>TemplateModel</code> setting <code>spring.nestedPath</code> 
by the given bind path, working similarly
  * to Spring Framework's <code>&lt;spring:nestedPath /&gt;</code> JSP Tag 
Library.
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java
index ad748238..a3aff6fb 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java
@@ -19,18 +19,17 @@
 
 package org.apache.freemarker.spring.model;
 
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateStringModel;
 
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * TemplateHashModel wrapper for templates using Spring directives, functions 
and internal models.
  */
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/ThemeFunction.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/ThemeFunction.java
index ca457a7c..40c37c81 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/ThemeFunction.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/ThemeFunction.java
@@ -19,9 +19,8 @@
 
 package org.apache.freemarker.spring.model;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.context.MessageSource;
 import org.springframework.web.servlet.support.RequestContext;
 
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/TransformFunction.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/TransformFunction.java
index f76cc4b1..ef197d4d 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/TransformFunction.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/TransformFunction.java
@@ -19,11 +19,8 @@
 
 package org.apache.freemarker.spring.model;
 
-import java.beans.PropertyEditor;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -33,6 +30,8 @@ import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.util.CallableUtils;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.beans.PropertyEditor;
+
 /**
  * A <code>TemplateFunctionModel</code> providing functionality equivalent to 
the Spring Framework's
  * <code>&lt;spring:transform /&gt;</code> JSP Tag Library.
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/UrlFunction.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/UrlFunction.java
index 16a720d3..e0de6614 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/UrlFunction.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/UrlFunction.java
@@ -19,28 +19,12 @@
 
 package org.apache.freemarker.spring.model;
 
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.model.ArgumentArrayLayout;
-import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
-import org.apache.freemarker.core.model.TemplateBooleanModel;
-import org.apache.freemarker.core.model.TemplateHashModelEx;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateNumberModel;
-import org.apache.freemarker.core.model.TemplateStringModel;
+import org.apache.freemarker.core.model.*;
 import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util.StringToIndexMap;
 import org.apache.freemarker.core.util._KeyValuePair;
@@ -48,6 +32,10 @@ import 
org.springframework.web.servlet.support.RequestContext;
 import org.springframework.web.servlet.support.RequestDataValueProcessor;
 import org.springframework.web.util.UriUtils;
 
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 /**
  * A <code>TemplateFunctionModel</code> providing functionality equivalent to 
the Spring Framework's
  * <code>&lt;spring:url /&gt;</code> JSP Tag Library.
@@ -217,9 +205,8 @@ class UrlFunction extends 
AbstractSpringTemplateFunctionModel {
 
                 try {
                     uri = uri.replace(template, 
UriUtils.encodePath(paramValue, encoding));
-                } catch (UnsupportedEncodingException e) {
-                    throw 
CallableUtils.newGenericExecuteException("Unsupported servlet response 
encoding: " + encoding,
-                            this);
+                } catch (Exception e) {
+                    throw newUrlParameterValueSubstitutionException(e, 
encoding);
                 }
             } else {
                 template = URL_TEMPLATE_DELIMITER_PREFIX + '/' + paramName + 
URL_TEMPLATE_DELIMITER_SUFFIX;
@@ -229,9 +216,8 @@ class UrlFunction extends 
AbstractSpringTemplateFunctionModel {
 
                     try {
                         uri = uri.replace(template, 
UriUtils.encodePathSegment(paramValue, encoding));
-                    } catch (UnsupportedEncodingException e) {
-                        throw CallableUtils
-                                .newGenericExecuteException("Unsupported 
servlet response encoding: " + encoding, this);
+                    } catch (Exception e) {
+                        throw newUrlParameterValueSubstitutionException(e, 
encoding);
                     }
                 }
             }
@@ -263,9 +249,8 @@ class UrlFunction extends 
AbstractSpringTemplateFunctionModel {
                         queryStringBuilder.append('=');
                         
queryStringBuilder.append(UriUtils.encodeQueryParam(paramValue, encoding));
                     }
-                } catch (UnsupportedEncodingException e) {
-                    throw 
CallableUtils.newGenericExecuteException("Unsupported servlet response 
encoding: " + encoding,
-                            this);
+                } catch (Exception e) {
+                    throw newUrlParameterValueSubstitutionException(e, 
encoding);
                 }
             }
         }
@@ -273,6 +258,12 @@ class UrlFunction extends 
AbstractSpringTemplateFunctionModel {
         return queryStringBuilder.toString();
     }
 
+    private TemplateException 
newUrlParameterValueSubstitutionException(Exception e, String encoding) {
+        return CallableUtils.newGenericExecuteException(
+                "Failed to put parameter value into URI with encoding \"" + 
encoding + "\"",
+                this, e);
+    }
+
     private enum UrlType {
         CONTEXT_RELATIVE, RELATIVE, ABSOLUTE
     }
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractCheckedElementTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractCheckedElementTemplateDirectiveModel.java
index f005546c..119943d8 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractCheckedElementTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractCheckedElementTemplateDirectiveModel.java
@@ -19,14 +19,13 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
 
+import java.io.IOException;
+
 /**
  * Corresponds to 
<code>org.springframework.web.servlet.tags.form.AbstractCheckedElementTag</code>.
  */
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractDataBoundFormElementTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractDataBoundFormElementTemplateDirectiveModel.java
index 159c9c55..9592c864 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractDataBoundFormElementTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractDataBoundFormElementTemplateDirectiveModel.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -38,6 +34,9 @@ import org.springframework.web.servlet.support.BindStatus;
 import org.springframework.web.servlet.support.RequestContext;
 import org.springframework.web.servlet.support.RequestDataValueProcessor;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Corresponds to 
<code>org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag</code>.
  */
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractFormTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractFormTemplateDirectiveModel.java
index fa0152e9..8149e67a 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractFormTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractFormTemplateDirectiveModel.java
@@ -19,18 +19,17 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.beans.PropertyEditor;
-import java.io.IOException;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CustomStateKey;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.spring.model.AbstractSpringTemplateDirectiveModel;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.servlet.support.BindStatus;
 
+import java.beans.PropertyEditor;
+import java.io.IOException;
+
 /**
  * Corresponds to 
<code>org.springframework.web.servlet.tags.form.AbstractFormTag</code>.
  */
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlElementTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlElementTemplateDirectiveModel.java
index 3005075b..889f2615 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlElementTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlElementTemplateDirectiveModel.java
@@ -19,23 +19,12 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.model.ArgumentArrayLayout;
-import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
-import org.apache.freemarker.core.model.TemplateHashModelEx;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateStringModel;
+import org.apache.freemarker.core.model.*;
 import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.util.ObjectUtils;
@@ -43,6 +32,12 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.servlet.support.BindStatus;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
 /**
  * Corresponds to 
<code>org.springframework.web.servlet.tags.form.AbstractHtmlElementTag</code>.
  */
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlInputElementTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlInputElementTemplateDirectiveModel.java
index 83bee503..a71e5d26 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlInputElementTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlInputElementTemplateDirectiveModel.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -35,6 +31,9 @@ import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Corresponds to 
<code>org.springframework.web.servlet.tags.form.AbstractHtmlInputElementTag</code>.
  */
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractMultiCheckedElementTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractMultiCheckedElementTemplateDirectiveModel.java
index c23a7051..bdac2e68 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractMultiCheckedElementTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractMultiCheckedElementTemplateDirectiveModel.java
@@ -19,25 +19,14 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Collection;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.model.ArgumentArrayLayout;
-import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
-import org.apache.freemarker.core.model.TemplateHashModelEx;
+import org.apache.freemarker.core.model.*;
 import org.apache.freemarker.core.model.TemplateHashModelEx.KeyValuePair;
 import 
org.apache.freemarker.core.model.TemplateHashModelEx.KeyValuePairIterator;
-import org.apache.freemarker.core.model.TemplateIterableModel;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.beans.BeanWrapper;
@@ -46,6 +35,11 @@ import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Collection;
+import java.util.Map;
+
 /**
  * Corresponds to 
<code>org.springframework.web.servlet.tags.form.AbstractMultiCheckedElementTag</code>.
  */
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractSingleCheckedElementTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractSingleCheckedElementTemplateDirectiveModel.java
index 5424adaa..53e74d84 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractSingleCheckedElementTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractSingleCheckedElementTemplateDirectiveModel.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -32,6 +28,9 @@ import 
org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Corresponds to 
<code>org.springframework.web.servlet.tags.form.AbstractSingleCheckedElementTag</code>.
  */
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/ButtonTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/ButtonTemplateDirectiveModel.java
index 72ca43e9..66498d20 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/ButtonTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/ButtonTemplateDirectiveModel.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -35,6 +31,9 @@ import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Provides <code>TemplateModel</code> for data-binding-aware HTML '{@code 
button}' element.
  * This tag is provided for completeness if the application relies on a
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/CheckboxTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/CheckboxTemplateDirectiveModel.java
index 95da4164..af025d87 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/CheckboxTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/CheckboxTemplateDirectiveModel.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -36,6 +32,9 @@ import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.web.bind.WebDataBinder;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Provides <code>TemplateModel</code> for data-binding-aware HTML '{@code 
<input type="checkbox"/>}' element.
  * This tag is provided for completeness if the application relies on a
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/CheckboxesTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/CheckboxesTemplateDirectiveModel.java
index 170c79a2..344f3785 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/CheckboxesTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/CheckboxesTemplateDirectiveModel.java
@@ -19,15 +19,14 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
 import org.springframework.web.bind.WebDataBinder;
 
+import java.io.IOException;
+
 /**
  * Provides <code>TemplateModel</code> for data-binding-aware multiple HTML 
'{@code <input type="checkbox"/>}' elements.
  * This tag is provided for completeness if the application relies on a
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/ErrorsTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/ErrorsTemplateDirectiveModel.java
index 20f04baf..a7f6eb5a 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/ErrorsTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/ErrorsTemplateDirectiveModel.java
@@ -19,15 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -42,6 +35,12 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.servlet.support.BindStatus;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 /**
  * Provides <code>TemplateModel</code> for displaying errors for a particular 
field or object.
  * <P>
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/FormTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/FormTemplateDirectiveModel.java
index 79ab1ed2..c30da619 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/FormTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/FormTemplateDirectiveModel.java
@@ -19,13 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -44,6 +39,9 @@ import 
org.springframework.web.servlet.support.RequestDataValueProcessor;
 import org.springframework.web.util.HtmlUtils;
 import org.springframework.web.util.UriUtils;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Provides <code>TemplateModel</code> for data-binding-aware HTML '{@code 
form}' element whose inner directives
  * are bound to properties on a <em>form object</em>.
@@ -338,21 +336,15 @@ class FormTemplateDirectiveModel extends 
AbstractHtmlElementTemplateDirectiveMod
             String requestUri = requestContext.getRequestUri();
             String encoding = getResponse().getCharacterEncoding();
 
-            try {
-                requestUri = UriUtils.encodePath(requestUri, encoding);
-            } catch (UnsupportedEncodingException ex) {
-                // According to Spring MVC Javadoc, it shouldn't happen.
-            }
+            requestUri = UriUtils.encodePath(requestUri, encoding);
 
             HttpServletResponse response = getResponse();
 
-            if (response != null) {
-                requestUri = response.encodeURL(requestUri);
-                String queryString = requestContext.getQueryString();
+            requestUri = response.encodeURL(requestUri);
+            String queryString = requestContext.getQueryString();
 
-                if (StringUtils.hasText(queryString)) {
-                    requestUri += "?" + HtmlUtils.htmlEscape(queryString);
-                }
+            if (StringUtils.hasText(queryString)) {
+                requestUri += "?" + HtmlUtils.htmlEscape(queryString);
             }
 
             if (StringUtils.hasText(requestUri)) {
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/HiddenInputTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/HiddenInputTemplateDirectiveModel.java
index 3cbcdd36..2c1d143d 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/HiddenInputTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/HiddenInputTemplateDirectiveModel.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -35,6 +31,9 @@ import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Provides <code>TemplateModel</code> for data-binding-aware HTML '{@code 
input}' element with a '{@code type}'
  * of '{@code hidden}'.
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModel.java
index e262d3f4..93877e23 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModel.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -35,6 +31,9 @@ import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Provides <code>TemplateModel</code> for data-binding-aware HTML '{@code 
input}' element with a '{@code type}'
  * of '{@code text}'.
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/LabelTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/LabelTemplateDirectiveModel.java
index b7685661..34c635ac 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/LabelTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/LabelTemplateDirectiveModel.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -36,6 +32,9 @@ import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.util.StringUtils;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Provides <code>TemplateModel</code> for data-binding-aware HTML '{@code 
label}' element.
  * <P>
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/OptionTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/OptionTemplateDirectiveModel.java
index b94c1c4f..0a4c7bfc 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/OptionTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/OptionTemplateDirectiveModel.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -36,6 +32,9 @@ import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Provides a convenient <code>TemplateModel</code> that allow to supply a 
collection that are to be rendered
  * as an HTML '{@code option}' element.
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/OptionsTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/OptionsTemplateDirectiveModel.java
index 4367eaf6..4b6b01b4 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/OptionsTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/OptionsTemplateDirectiveModel.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -36,6 +32,9 @@ import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Provides a convenient <code>TemplateModel</code> that allow to supply a 
collection that are to be rendered
  * as HTML '{@code option}' elements.
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/PasswordInputTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/PasswordInputTemplateDirectiveModel.java
index 52729e18..dd9a2f2b 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/PasswordInputTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/PasswordInputTemplateDirectiveModel.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -35,6 +31,9 @@ import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Provides <code>TemplateModel</code> for data-binding-aware HTML '{@code 
input}' element with a '{@code type}'
  * of '{@code password}'.
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/RadioButtonTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/RadioButtonTemplateDirectiveModel.java
index d6b8e162..fad23ab1 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/RadioButtonTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/RadioButtonTemplateDirectiveModel.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -35,6 +31,9 @@ import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Provides <code>TemplateModel</code> for data-binding-aware HTML '{@code 
<input type="radio"/>}' element.
  * This tag is provided for completeness if the application relies on a
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/RadioButtonsTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/RadioButtonsTemplateDirectiveModel.java
index 26e6ef88..3ebe9919 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/RadioButtonsTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/RadioButtonsTemplateDirectiveModel.java
@@ -19,8 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 
 /**
  * Provides <code>TemplateModel</code> for data-binding-aware multiple HTML 
'{@code <input type="radio"/>}' elements.
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SelectTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SelectTemplateDirectiveModel.java
index 6fe29a6e..295d53f9 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SelectTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SelectTemplateDirectiveModel.java
@@ -19,29 +19,24 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.beans.PropertyEditor;
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Collection;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.model.ArgumentArrayLayout;
-import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
-import org.apache.freemarker.core.model.TemplateBooleanModel;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateStringModel;
+import org.apache.freemarker.core.model.*;
 import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.servlet.support.BindStatus;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.beans.PropertyEditor;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Collection;
+import java.util.Map;
+
 /**
  * Provides <code>TemplateModel</code> for data-binding-aware HTML '{@code 
select}' element.
  * <P>
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SpringFormTemplateCallableHashModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SpringFormTemplateCallableHashModel.java
index 8e28c4c0..7e60b5a5 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SpringFormTemplateCallableHashModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SpringFormTemplateCallableHashModel.java
@@ -19,17 +19,16 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
 
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * TemplateHashModel wrapper for templates using Spring directives, functions 
and internal models.
  */
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/TextareaTemplateDirectiveModel.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/TextareaTemplateDirectiveModel.java
index bfc5bde1..7aa48ee1 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/TextareaTemplateDirectiveModel.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/TextareaTemplateDirectiveModel.java
@@ -19,12 +19,8 @@
 
 package org.apache.freemarker.spring.model.form;
 
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
@@ -35,6 +31,9 @@ import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util.StringToIndexMap;
 import org.springframework.web.servlet.support.RequestContext;
 
+import java.io.IOException;
+import java.io.Writer;
+
 /**
  * Provides <code>TemplateModel</code> for data-binding-aware HTML '{@code 
textarea}' element.
  * <P>
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/AbstractFreeMarkerView.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/AbstractFreeMarkerView.java
index 6d3c2aef..ab8eb77a 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/AbstractFreeMarkerView.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/AbstractFreeMarkerView.java
@@ -18,13 +18,8 @@
  */
 package org.apache.freemarker.spring.web.view;
 
-import java.io.IOException;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.ParseException;
 import org.apache.freemarker.core.Template;
@@ -37,6 +32,10 @@ import org.slf4j.LoggerFactory;
 import org.springframework.context.ApplicationContextException;
 import org.springframework.web.servlet.view.AbstractTemplateView;
 
+import java.io.IOException;
+import java.util.Locale;
+import java.util.Map;
+
 /**
  * Adapter base class for FreeMarker template-based views, with the ability to 
access {@link Configuration}
  * and {@link ObjectWrapperAndUnwrapper}.
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerView.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerView.java
index ddb63fe6..e101fb3f 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerView.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerView.java
@@ -18,28 +18,21 @@
  */
 package org.apache.freemarker.spring.web.view;
 
-import java.util.Map;
-
-import javax.servlet.GenericServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
+import jakarta.servlet.GenericServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpSession;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.TemplateHashModel;
-import org.apache.freemarker.servlet.AllHttpScopesHashModel;
-import org.apache.freemarker.servlet.FreemarkerServlet;
-import org.apache.freemarker.servlet.HttpRequestHashModel;
-import org.apache.freemarker.servlet.HttpRequestParametersHashModel;
-import org.apache.freemarker.servlet.HttpSessionHashModel;
-import org.apache.freemarker.servlet.IncludePage;
-import org.apache.freemarker.servlet.ServletContextHashModel;
+import org.apache.freemarker.servlet.*;
 import org.apache.freemarker.servlet.jsp.TaglibFactory;
 import org.apache.freemarker.spring.model.AbstractDelegatingTemplateHashModel;
 import org.apache.freemarker.spring.model.SpringTemplateCallableHashModel;
 import 
org.apache.freemarker.spring.model.form.SpringFormTemplateCallableHashModel;
 
+import java.util.Map;
+
 /**
  * FreeMarker template based view implementation, with being able to provide a 
{@link ServletContextHashModel}
  * and {@link TaglibFactory} models to the templates.
@@ -48,7 +41,7 @@ public class FreeMarkerView extends AbstractFreeMarkerView {
 
     /**
      * Internal servlet instance to provide a page object in JSP tag library 
usages.
-     * @see javax.servlet.jsp.PageContext#getPage()
+     * @see jakarta.servlet.jsp.PageContext#getPage()
      */
     private GenericServlet pageContextServlet;
 
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolver.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolver.java
index 3a5a554b..370dd680 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolver.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolver.java
@@ -18,9 +18,8 @@
  */
 package org.apache.freemarker.spring.web.view;
 
-import javax.servlet.GenericServlet;
-import javax.servlet.ServletException;
-
+import jakarta.servlet.GenericServlet;
+import jakarta.servlet.ServletException;
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
@@ -56,7 +55,7 @@ public class FreeMarkerViewResolver extends 
AbstractTemplateViewResolver impleme
 
     /**
      * Internal servlet instance to provide a page object in JSP tag library 
usages.
-     * @see javax.servlet.jsp.PageContext#getPage()
+     * @see jakarta.servlet.jsp.PageContext#getPage()
      */
     private GenericServlet pageContextServlet;
 
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/PageContextServlet.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/PageContextServlet.java
index 97f43216..8080c1d1 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/PageContextServlet.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/PageContextServlet.java
@@ -18,16 +18,16 @@
  */
 package org.apache.freemarker.spring.web.view;
 
-import java.io.IOException;
+import jakarta.servlet.GenericServlet;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
 
-import javax.servlet.GenericServlet;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import java.io.IOException;
 
 /**
  * A built-in internal servlet class to be used as page object in JSP tag 
libraries used in FreeMarker templates.
- * JSP Tag Library implementations may invoke 
<code>javax.servlet.jsp.PageContext#getPage()</code> to get the
+ * JSP Tag Library implementations may invoke 
<code>jakarta.servlet.jsp.PageContext#getPage()</code> to get the
  * reference of the servlet. So, this internal servlet implementation is 
provided for that.
  */
 @SuppressWarnings("serial")
diff --git 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/PageContextServletConfig.java
 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/PageContextServletConfig.java
index ad1bb2d4..3e68b135 100644
--- 
a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/PageContextServletConfig.java
+++ 
b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/PageContextServletConfig.java
@@ -18,12 +18,12 @@
  */
 package org.apache.freemarker.spring.web.view;
 
+import jakarta.servlet.ServletConfig;
+import jakarta.servlet.ServletContext;
+
 import java.util.Collections;
 import java.util.Enumeration;
 
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-
 /**
  * A built-in internal {@link ServletConfig} class used when initializing the 
page context servlet
  * ({@link PageContextServlet}) internally.
diff --git 
a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/EchoTag.java
 
b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/EchoTag.java
index 2a7e752d..6c3e5e5a 100644
--- 
a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/EchoTag.java
+++ 
b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/EchoTag.java
@@ -18,10 +18,10 @@
  */
 package org.apache.freemarker.spring.web.view;
 
-import java.io.IOException;
+import jakarta.servlet.jsp.JspException;
+import jakarta.servlet.jsp.tagext.TagSupport;
 
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.TagSupport;
+import java.io.IOException;
 
 /**
  * Simple Example JSP Tag Library for unit test.
diff --git 
a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolverTest.java
 
b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolverTest.java
index 9cfab1a3..038d9189 100644
--- 
a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolverTest.java
+++ 
b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreeMarkerViewResolverTest.java
@@ -18,14 +18,7 @@
  */
 package org.apache.freemarker.spring.web.view;
 
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.servlet.ServletContext;
-
+import jakarta.servlet.ServletContext;
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader;
 import org.junit.Before;
@@ -36,6 +29,12 @@ import org.springframework.mock.web.MockServletContext;
 import org.springframework.web.context.WebApplicationContext;
 import org.springframework.web.context.support.GenericWebApplicationContext;
 
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
 public class FreeMarkerViewResolverTest {
 
     private ServletContext servletContext;
diff --git 
a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreeMarkerViewTest.java
 
b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreeMarkerViewTest.java
index 10598f96..7cb89a8b 100644
--- 
a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreeMarkerViewTest.java
+++ 
b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreeMarkerViewTest.java
@@ -18,15 +18,8 @@
  */
 package org.apache.freemarker.spring.web.view;
 
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
-import javax.servlet.GenericServlet;
-import javax.servlet.ServletContext;
-
+import jakarta.servlet.GenericServlet;
+import jakarta.servlet.ServletContext;
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader;
@@ -41,6 +34,12 @@ import org.springframework.mock.web.MockServletContext;
 import org.springframework.web.context.WebApplicationContext;
 import org.springframework.web.context.support.GenericWebApplicationContext;
 
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static org.junit.Assert.assertEquals;
+
 public class FreeMarkerViewTest {
 
     private ServletContext servletContext;

Reply via email to