关于Servlet3.0与Servlet3.1大神们你们怎么选择?

雨花石 发布于 2017/01/10 23:46
阅读 1K+
收藏 1

问题背景:

Servlet3.1新特性——非阻塞式IO,ServletInputStream抽象类多了几个方法isFinished()、isReady()、setReadListener(ReadListener listener)。这些在之前的Servlet3.0里是没有的。

Tomcat7.x是Servlet3.0,Tomcat8.x是Servlet3.1。

之前是基于Tomcat7.x开发的程序,有个功能是做了个Request包装类,过滤ajax提交内容。里面把Request的getInputStream()方法重新实现。

@Override
public ServletInputStream getInputStream() throws IOException {
    if (bais == null) {
        bais = new ByteArrayInputStream(body);
    } else {
        bais.reset();
    }
    return new ServletInputStream() {
        @Override
        public int read() throws IOException {
            return bais.read();
        }
    };
}

由于在Tomcat7.x环境下实现的,所以ServletInputStream没有上面说的那几个方法。

工程编译打包好后发布到服务器是Tomcat8.x上,跑了许多天,居然没有报错。为什么?

大神们,我的问题就是,像这种情况,有没有隐患?或者Servlet3.1是否向下兼容Servlet3.0?我怎么也想不明白这样的兼容是怎么做的,抽象类都改了,实现类不改居然不报错。

而且更疑惑的是,我用的Spring4.3.5,看了里面ContentCachingRequestWrapper类用的ContentCachingInputStream居然也是没有实现Servlet3.1新增的那几个方法。还有DelegatingServletInputStream也是一样没实现。由此应该确定Spring4.3也是基于Servlet3.0的,没有实现Servlet3.1。

大神们,第二个问题,如标题,你们用Servlet3.1了吗?用了的话来讨论讨论,上面那几个方法有没有参考实现,给参考参考。

加载中
0
魔力猫
魔力猫

3.1肯定是兼容3.0的,这个毋庸置疑。当然,理论上哪怕完全兼容,现实中因为具体实现的差异,也可能会造成问题,但是这是一个概率问题,不是必然问题。

是否有隐患,只能靠日常监控和测试来查。我的建议是如果你怕有问题,可以尝试基于3.1的规则进行修改,去掉你们原来的魔改部分,用3.1规范重写。

返回顶部
顶部