我的spring应用程序使用servlet 2.5和spring框架4,它部署在tomcat 9中,工作正常。我不知道为什么tomcat没有抱怨它,因为它需要servlet 4,如文档所示。它是向后兼容的,还是spring在做一些魔术?为了清楚起见,我们在代码中使用servlet 2.5中的接口,它不应该用servlet 4编译,因为我们用2.5编译,但我们希望它在tomcat运行时失败。谢谢
发布于 2020-07-23 18:10:59
您是否在使用servlet规范4中不再存在的方法/类?没有魔法-它向下兼容。例如,如果您试图运行Tomcat5.5 (servlet规范2.4)中的AsyncEvent代码,则会遇到问题。但是,在新服务器上运行旧代码--而不使用已经完全更改或消失的东西--很少是一个问题。
编辑
你说“旧”代码有:
Map parameterMap = request.getParameterMap();这即使不是最佳做法,也仍然有效。对于较新的编译器,您可能会收到编译器的警告,表示您不使用泛型,但它仍然有效。从那时起爪哇人就说:
返回:一个不变的java.util.Map,包含参数名作为键,参数值作为映射值。参数映射中的键为String类型。参数映射中的值为String数组类型。
因此,旧代码必须将键转换为字符串,将值转换为String[] --就像较新的代码那样:
Map<String, String[]> parameterMap = request.getParameterMap();这两个版本都将在编译器的最近版本中编译,不过,您可能会收到不利用泛型的代码的警告。
关键是泛型的使用-- <String, String[]>部件。使用泛型时代码更清晰,编译器可以帮助解决问题。使用非泛型版本,您可以尝试将映射中的键转换为任何对象。它可以编译,但在运行时您可能会得到一个ClassCastException。
从Tomcat的角度来看,它仍然在返回相同的东西。
这样更清楚吗?
https://stackoverflow.com/questions/63059349
复制相似问题