java

位置:IT落伍者 >> java >> 浏览文章

Servlet 3.0公开预览版引发争论


发布日期:2023年01月21日
 
Servlet 3.0公开预览版引发争论

JSR发布了Servlet规范的公开预览版同时在GlassFish代码分支上提供了参考实现这次发布引发了人们对于专家组(Expert Group)为下一代Servlet API和整个Java EE 平台做出的各种选择的争论

Servlet API一直处于风口浪尖从初期草稿开始JSR 专家组致力于在类似便捷开发插件性等领域完善和提高该规范其领袖之一Rajiv Mordani这样说道

便捷开发(Ease of Development):在早期草案中我们添加了一些注解允许你像POJO一样写Servlet但是在专家组的若干次讨论和社区反馈之后我们决定删除像@GET @POST这样的方法层注解保留doGetdoPos方法和扩展HttpServlet类但是那些重命名以更有效使用的最顶层注解仍然存在 @WebServlet用于声明一个servlet@ServletFilter声明过滤器@WebServletContextListener定 义ServletContextListener除了这些注解像@Resource这种自Servlet就一直支持的注解则保持不变

可插入性构建于servlet之上的Web框架在开发人员中很受欢迎其中很多人提出了各种各样的问题为了更好地支持框架便于开发人员编写web应用我们在servlet规范中添加一些方式以帮助开发人员根据自身情况使用和管理框架

异步处理这是我们在servlet规范中变化最大的部分在早期草案中我们暂停重新开始确定了我们定义的语义但是在这之后专家组对于如何解决异步处理的各种用例进行了大量的讨论规范中做出的修改现在也可以解决各种问题

Roy Van Rijn表达了他对于早期草案中出现的一些特性的担忧

我更倾向于完全不使用针对GET/POST方法的注解但是我发现Java EE 规范提倡使用类似的注解JSR的编写者别无选择(糟糕的借口)我在本文中表达的观点已经发给了JSR组织但至今没有回应

我也找不到一名成员给出原因解释澄清等等最近Java EE 规范发布公开预览版其中包含了对Servlet 规范的引用所以这会成为Java EE 的一部分但是我恳请他们花时间重新考虑关于注解的决定

随着规范公开预览版的发布来自Webtide的Greg Wilkins认为该规范非常糟糕是不和谐的专家组和有缺陷的流程的产物他的主要观点包括

它代表了API设计上的一次思想实验不关注实现的复杂性试用可行性和社区反馈

要求测试实现的请求被拒绝了

没有公开的或者合理的机制来收集来自社区的需求和宝贵的社区咨询

一些模糊的需求(比如包装的异步请求)在较晚时候包含进来没有用例和用户需求

写的非常糟糕就像大多数JCP文档一样

一些新的特性引起了安全隐患并可能导致部署缓慢

异步servlet的建议被改变了与早期草案不同最初的方法是Jetty Continuations的结果月即可在Jetty prerelease中试用已经在很多框架和应用中测试过包括ometdDWRJSF和BlazeDS

Greg总结说

我相信在现在的预览版中有明显的错误这些缺陷已经多的让人很容易就可以发现当我从专家组收到关于这些问题的支持信息时我无法确信规范领袖的合法身份我可能因为过于严厉而无法得到帮助了

Rajiv对Greg的答复中指出

在GlassFish中有相关实现

他从没看到过Greg的请求

如果不喜欢新功能可以禁止使用

没有明显的证据表明部署会变慢

异步servlet增加的方式更被社区所喜欢他引用了专家组的邮件

Rajiv也提到了来自RedHat的Bill Burke写的一篇博文其中他批评了Jetty 中的异步servlet实现

随后Greg Wilkins宣布他致力于Servlet 异步servlet的一个实现他在博客上列举了一些修正/扩展和与专家组的持续讨论其中包括

新的异步分发器类型(ASYNC DispatcherType )用于分发异步请求

当请求分发时isAsyncStarted()方法为false

如果getReader()或者getOutputStream()已经被调用则调用startAsync()或者 startAsync(requestresponse)时会抛出IllegalStateException异常这可以把异步处理器限制到简单的情 况下

如果通过startAsync(requestresponse)启动异步模式在AsyncContext上使用任何forward()方法都会有IllegalStateException异常这避免了分发包装器的复杂但允许异步处理器使用包装器

forward(path)和forward(contextpath)方法还没有实现

代码可以从Jetty分支和servletapi分支中得到

Grep谈到了异步servlet的事情

虽然还需要更多测试但是这个代码已经实现了基本的异步行为不需要很复杂的重新分发请求或者前递方法我相信这代表了的合理折中方案在我们从的简单子集里获得经验之后如果需要更多的特性可以添加到

上一篇:实例教程:Java Socket编程的一个秘密类[1]

下一篇:Java进行并发多连接socket编程