Tomcat 9 和 Servlet API 2.5

Tomcat 9 and Servlet API 2.5

我的 spring Web 应用程序使用 servlet api 2.5 和 spring 框架 4。它部署在 tomcat 9。它工作正常。我不确定为什么 tomcat 没有抱怨它,因为根据文档它需要 servlet api 4。它是向后兼容还是 spring 正在做一些魔术?为清楚起见,我们在代码中使用 servlet api 2.5 的接口,不应使用 servlet api 4 进行编译。它正在编译,因为我们正在使用 2.5 进行编译,但我们预计它会在运行时失败tomcat。谢谢

您是否正在使用 servlet 规范 4 中不再存在的 methods/classes?没有魔法——它是向下兼容的。如果您尝试 运行,例如 Tomcat 5.5(servlet 规范 2.4)中的 AsyncEvent 代码,那么是的,您会遇到问题。但是 运行在新服务器上使用旧代码 - 不使用已经完全改变或消失的东西 - 很少有问题。

编辑

你说“旧”代码有:

Map parameterMap = request.getParameterMap();

即使不是最佳实践,这仍然有效。使用较新的编译器,您可能会收到编译器的警告,提示您没有使用泛型,但它仍然有效。因为那时的 Javadocs 说:

Returns: an immutable java.util.Map containing parameter names as keys and parameter values as map values. The keys in the parameter map are of type String. The values in the parameter map are of type String array.

所以您的旧代码 必须 将键转换为 String 并将值转换为 String[] - 就像更新的代码一样:

Map<String, String[]> parameterMap = request.getParameterMap();

这两个版本都将在最新版本的编译器中编译,不过,您可能会再次收到有关未利用泛型的代码的警告。

关键是泛型的使用 - <String, String[]> 部分。使用泛型时代码更清晰,编译器可以帮助解决问题。使用非泛型版本,您可以尝试将映射中的键转换为任何对象。它会编译,但在 运行 时你可能会得到 ClassCastException.

从 Tomcat 的角度来看,它仍然返回同样的东西。

是不是更清楚了?