servlet:Servlet 3.0公开预览版引发争论

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

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

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

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

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

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

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

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

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

        它代表了API设计上次思想实验不关注实现复杂性、试用可行性和社区反馈
        要求测试实现请求被拒绝了
        没有公开或者合理机制来收集来自社区需求和宝贵社区咨询
        些模糊需求(比如包装异步请求)在较晚时候包含进来没有用例和用户需求
        写非常糟糕就像大多数JCP文档
        些新特性引起了安全隐患并可能导致部署缓慢
        异步servlet建议被改变了和早期草案区别最初思路方法是Jetty Continuations结果从2008年3月即可在Jetty-7 pre-release中试用已经在很多框架和应用中测试过包括ometd、DWR、JSF和BlazeDS

        Greg整理总结说:

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

        Rajiv对Greg答复中指出:

        在GlassFish中有相关实现
        他从没看到过Greg请求
        如果不喜欢新功能可以禁止使用
        没有明显证据表明部署会变慢
        异步servlet增加方式更被社区所喜欢他引用了专家组邮件

        Rajiv也提到了来自RedHatBill Burke写篇博文其中他批评了Jetty 6中异步servlet实现


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

        新异步分发器类型(ASYNC DispatcherType )用于分发异步请求 
        当请求分发时isAsyncStarted思路方法为false 
        如果getReader或者getOutputStream已经被startAsync或者 startAsync(request.response)时会抛出IllegalStateException异常这可以把异步处理器限制到简单情 况下 
        如果通过startAsync(request,response)启动异步模式在AsyncContext上使用任何forward(...)思路方法都会有IllegalStateException异常这避免了分发包装器复杂但允许异步处理器使用包装器 
        forward(path)和forward(context,path)思路方法还没有实现

        代码可以从Jetty分支和servlet-api分支中得到

        Grep谈到了异步servlet事情:

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

Tags:  jspservlet javax.servlet javaservlet servlet

延伸阅读

最新评论

发表评论