开发者社区> 问答> 正文

关于Servlet3.0与Servlet3.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了吗?用了的话来讨论讨论,上面那几个方法有没有参考实现,给参考参考。

展开
收起
爱吃鱼的程序员 2020-06-08 18:09:27 729 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

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

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

    2020-06-08 18:09:44
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载