Latest in branch 3.0
3.0.0
Released 20 Oct 2020
(5 years ago)
SoftwareJSP/Jakarta Pages
Version3.0
RequirementServlet 5.0
Jakarta EE 9/9.1
Initial release3.0.0
20 Oct 2020
(5 years ago)
Latest release3.0.0
20 Oct 2020
(5 years ago)
Namespace changejakarta.servlet.jsp
Release noteshttps://projects.eclipse.org/projects/ee4j.jsp/releases/3.0
Source codehttps://github.com/jakartaee/pages/tree/3.0.0-RELEASE
Documentationhttps://javadoc.io/doc/jakarta.servlet.jsp/jakarta.servlet.jsp-api/3.0.0/index.html
Downloadhttps://mvnrepository.com/artifact/jakarta.servlet.jsp/jakarta.servlet.jsp-api/3.0.0
JSP/Jakarta Pages 3.0 ReleasesView full list

What Is New in JSP 3.0

JSP 3.0, part of Jakarta EE 9, is a maintenance release focused on namespace changes and alignment with the Jakarta EE platform. The core functionality remains stable, with the primary updates being the migration from the javax.* to the jakarta.* package namespace.

Change Type Description
Namespace Change All APIs moved from javax.servlet.jsp to jakarta.servlet.jsp.
Specification Alignment Updated to depend on Jakarta Servlet 5.0 and Jakarta Expression Language 4.0.
Removed Deprecated Features Removed the deprecated JSP 2.0-style, Java-based tag files for a cleaner API.

How does the namespace change affect my existing code?

The shift to jakarta.* packages is the most impactful change. This means all your imports and any XML namespace declarations in TLD or JSP files need to be updated. For example, the page directive must now use jakarta.servlet.jsp.

In practice, this is a straightforward find-and-replace operation, but it must be done across your entire codebase. This change was necessary to avoid conflicts and establish a clear path forward under the Jakarta EE governance.

Before and After Example

<%-- Old JSP 2.3 --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%-- New JSP 3.0 --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="https://jakarta.ee/xml/ns/jakartaee/jstl/core" %>

What features were removed in this version?

JSP 3.0 formally removed support for the old JSP 2.0-style tag files that were implemented with Java classes. These were the tag files that used the .tag extension and were backed by a Java class extending TagSupport or BodyTagSupport.

This matters because it streamlines the specification. The recommended approach has been to use the simpler, JSP-based tag files (with a .tagx extension) for years. If you're still using the old style, you'll need to migrate them to the modern standard.

What are the new minimum required dependencies?

JSP 3.0 now requires a container that supports Jakarta Servlet 5.0 and Jakarta Expression Language 4.0. This is a direct result of the package namespace change propagating through the entire Jakarta EE stack.

You can't run JSP 3.0 on an older Jakarta EE 8 or Java EE 8 server. You'll need an application server like Tomcat 10+, Jetty 11+, or a full Jakarta EE 9+ compatible implementation like GlassFish 6.

FAQ

Is JSP 3.0 a major feature release?
No, it's primarily a maintenance release. The main goal was the namespace migration from javax.* to jakarta.* to align with Jakarta EE 9. No significant new JSP-specific features were added.

Do I have to change all my JSP files for Jakarta EE 9?
Yes. Any JSP file that uses the old javax.servlet.* namespace in taglib directives or EL will break. You must update the URIs and any programmatic API calls to use jakarta.*.

Can I use JSTL with JSP 3.0?
Yes, but you must use Jakarta Standard Tag Library (JSTL) 2.0, which is also part of Jakarta EE 9. The URI in your <%@ taglib %> directive needs to be updated to the new Jakarta namespace.

What happens if I don't update my taglib URI?
The container will not be able to resolve the tag library descriptor (TLD), and your JSP page will fail to compile or throw a runtime exception, resulting in a blank page or an error.

Is the JSP syntax itself different in 3.0?
No, the core syntax for writing scriptlets, expressions, declarations, and directives remains exactly the same. Only the underlying Java package names and specification dependencies have changed.

Releases In Branch 3.0

VersionRelease date
3.0.020 Oct 2020
(5 years ago)
3.0.0-RC213 Jun 2020
(5 years ago)
3.0.0-RC112 Apr 2020
(6 years ago)
3.0.0-M113 Feb 2020
(6 years ago)