Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
321 views
in Technique[技术] by (71.8m points)

java - How to find servlet API version for glassfish server?

While coding a servlet I found a method that says

Since:
    Servlet 3.1

I guess that if I have the autohint from NetBeans to use it is because I have that Servlet version. But I cannot find a place to confirm that. I'm using glassfish4.1 as container. If I go to mypathtoglassfish4.1glassfishmodules there I can see javax.servlet-api.jar and inside a manifest that says:

Implementation-Version: 3.1.0

Is that the proper way to check that? I'm especially interested in being able to tell my colleagues "go to that jar and check that property" so I'm sure that my code will run on their server.

As alternative, I found a webpage Oracle GlassFish Server 3.1 Application Development Guide that says: "GlassFish Server supports the Java Servlet Specification version 3.0." but obviously for Glassfish 3.1, and I couldn't find one of those for every glassfish version (not even for mine -4.1 )

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Look at Java EE version. Servlet (and JSP, JSF, EJB, JPA, etc) version goes hand in hand with Java EE version.

  • Java EE 8 = Servlet 4.0
  • Java EE 7 = Servlet 3.1
  • Java EE 6 = Servlet 3.0
  • Java EE 5 = Servlet 2.5
  • J2EE 1.4 = Servlet 2.4
  • J2EE 1.3 = Servlet 2.3
  • J2EE 1.2 = Servlet 2.2

Look at the server homepage/documentation how it presents itself. For GlassFish, that is currently (with 4.1):

World's first Java EE 7 Application Server

So, it's Servlet 3.1.

But, with a big but, that's one thing. The second thing is, the webapp's web.xml version also plays a role. Not everyone knows that.

If your webapp's web.xml is declared conform Servlet 3.1 like below,

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">

    <!-- Config here. -->
</web-app>

then your webapp will also really run in Servlet 3.1 modus.

However, if it's declared conform Servlet 3.0 like below or even older,

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <!-- Config here. -->
</web-app>

then your webapp will run in Servlet 3.0 compatibility modus, even when deployed to a Servlet 3.1 compatible container! The above influences the ServletContext#getMajorVersion() and getMinorVersion(), so they actually say nothing about the container, but only about the webapp itself.

If your webapp's web.xml contains a <!DOCTYPE>, regardless of the DTD and the version, then it will run in Servlet 2.3 compatibility modus, even when there's a newer XSD declared!

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "java.sun.com/dtd/web-app_2_3.dtd">
<web-app 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">

    <!-- This is WRONG! The DOCTYPE must be removed! -->
</web-app>

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...