阅读更多

13顶
0踩

企业架构

原创新闻 Servlet 3.1 新特性示例

2013-09-09 09:51 by 正式记者 jinnianshilongnian 评论(21) 有46388人浏览

 

参考示例github地址

《servlet3.1规范》下载

serlvet3.1在线版javadoc

 

servlet3.x新特性示例:

  • 最近JavaEE 7也发布了,其包含Servlet3.1规范,目前glassfish4已经实现了该规范,所以写了一个参考示例方便参考学习。建议学习之前,请先阅读Servlet3规范,效果更佳。

1、更加便利的注解支持

  • 提供了@WebServlet、@WebFilter、@WebListener、@WebInitParam等注解的支持

2、可插性设计

2.1、web模块化
  • 可以将一个项目分成N个模块,然后通过扫描模块下的META-INF/web-fragment.xml进行装配
2.2、容器启动时可插拔
  • 使用ServletContainerInitializer实现,可以在容器启动时自动回调其onStartup方法,插入一些功能
2.3、零XML化SpringMVC
  • 使用ServletContainerInitializer即SpringMVC注解配置实现无XML化的SpringMVC配置

3、异步处理支持

3.1、servlet的异步支持
  • 通过Servlet提供的异步支持完成了comet:streaming(长连接)和ajax长轮询
  • 使用Servlet提供的AsyncListener进行状态回调
  • 最后通过ajax长轮询实现了一个聊天室功能
3.2、SpringMVC对Servlet的异步支持
  • 使用SpringMVC框架提供的异步支持实现comet:streaming(长连接)和ajax长轮询
  • 使用SpringMVC框架提供的Callable实现异步计算
  • 使用SpringMVC框架提供的DeferredResult实现延迟结果(实现ajax长轮询)
  • Spring框架没有提供长连接实现,具体还得使用原生支持
  • 最后通过ajax长轮询实现了一个聊天室功能

4、其他

4.1、API改进
  • 比如提供HttpOnly支持、HttpServletRequest#getRequestedSessionId直接获取请求时的会话ID、HttpServletResponse#getStatus等直接获取响应状态码、响应头等信息
  • 比如Servlet3.1的request/response#getContentLengthLong得到long型内容长度、ServletContext#getVirtualServerName得到虚拟主机名
  • 比如Servlet3.1的通过HttpServletRequest#changeSessionId()直接更改会话ID,并可以通过HttpSessionIdListener监听
  • 其他的请参考源代码
4.2、获取静态资源
  • 可以直接获取Jar包里的/META-INF/resources下的资源(包括jsp)
4.3、全新的文件上传支持
  • 使用HttpServletRequest#getPart/#getParts得到请求的Part(如文件/参数)等
4.4、servlet 3.1的非阻塞I/O支持
  • 提供WriteListener、ReadListener实现非阻塞I/O支持
4.5、servlet 3.1的协议升级支持
  • 使用HttpServletRequest.upgrade和HttpUpgradeHandler实现HTTP/1.1协议升级,如升级到Websocket等等
  • 示例实现了一个直接与socket通信的回显和时间功能

5、pjax与bigpipe

  • 使用pjax(ajax + pushState) 无刷新ajax(并能记录ajax加载的历史记录)加载内容
  • 使用bigpipe并发加载页面片段,并使用springmvc抽象bigpipe,简化bigpipe开发,可以基于此完善的更易使用

具体请参考源代码,欢迎一起探讨学习。有问题请回复。

几点说明

  • 本系列使用Maven构建,需要Maven基础;
  • 本系列并没有写学习指南,作者认为直接看代码即可,如有不懂的可参考如《Servlet 3.1规范》和javadoc
  • servlet3.1目前仅glassfish支持,在运行servlet3.1的程序时,请使用glassfish maven插件运行。

 

参考示例github地址

《servlet3.1规范》下载

serlvet3.1在线版javadoc

13
0
评论 共 21 条 请登录后发表评论
21 楼 hillhill 2014-09-25 15:41
tomcat8支持websocket 1.0规范 ,中文翻译可以看这个
http://blog.csdn.net/hills/article/details/39368951

20 楼 jinnianshilongnian 2013-09-11 11:48
archy123 写道
It was of course possible to implement WebSocket applications in Java prior to the introduction of Java EE 7, but each of the many different APIs that could be used were slightly different, so if you had written a WebSocket application in Apache Tomcat 7 it would need modifying to work with Jetty, or JBoss or Resin. Having a standard method for doing this in Java EE is a welcome addition.

看来都是自己的实现,不是对 java ee标准的实现。

是的
19 楼 archy123 2013-09-11 11:48
It was of course possible to implement WebSocket applications in Java prior to the introduction of Java EE 7, but each of the many different APIs that could be used were slightly different, so if you had written a WebSocket application in Apache Tomcat 7 it would need modifying to work with Jetty, or JBoss or Resin. Having a standard method for doing this in Java EE is a welcome addition.

看来都是自己的实现,不是对 java ee标准的实现。
18 楼 jinnianshilongnian 2013-09-11 11:48
archy123 写道
jinnianshilongnian 写道
archy123 写道
jinnianshilongnian 写道
skydream 写道
最关心的是jetty了,去看了一下官网,目前正在开发的9.1版本将会支持servlet 3.1,不过还不知道具体什么时间release。

估计会很快的,3.1没加多少新东西; tomcat8已经RC了

tomcat有点慢啊,tomEE还只支持j2ee6呢。只能先用glassfish 写websocket玩玩了

tomcat7 支持websocket servlet3.0
http://tomcat.apache.org/tomcat-7.0-doc/index.html

是吗?但是我用java ee 7 api写的websocket程序无法在tomcat7上运行啊。



你可以到官方看下
http://tomcat.apache.org/tomcat-7.0-doc/web-socket-howto.html#Overview

需要使用 org.apache.catalina.websocket自己的API,而不是JSR 356; 因为那时候JSR356 还没有final。

tomcat8.0实现了 Java WebSocket 1.0 API
http://tomcat.apache.org/tomcat-8.0-doc/web-socket-howto.html

所以要走 Java WebSocket 1.0 API  需要tomcat8
17 楼 archy123 2013-09-11 11:44
jinnianshilongnian 写道
archy123 写道
jinnianshilongnian 写道
skydream 写道
最关心的是jetty了,去看了一下官网,目前正在开发的9.1版本将会支持servlet 3.1,不过还不知道具体什么时间release。

估计会很快的,3.1没加多少新东西; tomcat8已经RC了

tomcat有点慢啊,tomEE还只支持j2ee6呢。只能先用glassfish 写websocket玩玩了

tomcat7 支持websocket servlet3.0
http://tomcat.apache.org/tomcat-7.0-doc/index.html

是吗?但是我用java ee 7 api写的websocket程序无法在tomcat7上运行啊。
16 楼 pdreamer 2013-09-11 09:33
[align=center][size=x-large][color=red]
[flash=200,200][url][img][list]
[*]
引用
[u][i][b][/b][/i][/u]
[/list][/img][/url][/flash]
[/color][/size][/align]   
15 楼 fjjiaboming 2013-09-11 07:57
哇 . sevrlet 用spring MVC?
14 楼 jinnianshilongnian 2013-09-10 16:51
lzzgym 写道
servlet规范为何与springmvc有这么大的关联??

没关系; 不过springmvc提供了servlet3的一些抽象;比如用于异步的DeferredResult;简化开发(但是整体封装的比较弱。)
13 楼 damoqiongqiu 2013-09-10 15:13
12 楼 lzzgym 2013-09-10 14:49
servlet规范为何与springmvc有这么大的关联??
11 楼 jinnianshilongnian 2013-09-10 11:34
archy123 写道
jinnianshilongnian 写道
skydream 写道
最关心的是jetty了,去看了一下官网,目前正在开发的9.1版本将会支持servlet 3.1,不过还不知道具体什么时间release。

估计会很快的,3.1没加多少新东西; tomcat8已经RC了

tomcat有点慢啊,tomEE还只支持j2ee6呢。只能先用glassfish 写websocket玩玩了

tomcat7 支持websocket servlet3.0
http://tomcat.apache.org/tomcat-7.0-doc/index.html
10 楼 zhangthe9 2013-09-10 11:14
archy123 写道
jinnianshilongnian 写道
skydream 写道
最关心的是jetty了,去看了一下官网,目前正在开发的9.1版本将会支持servlet 3.1,不过还不知道具体什么时间release。

估计会很快的,3.1没加多少新东西; tomcat8已经RC了

tomcat有点慢啊,tomEE还只支持j2ee6呢。只能先用glassfish 写websocket玩玩了

tomcat 7不是支持websocket了?
9 楼 archy123 2013-09-10 10:44
jinnianshilongnian 写道
skydream 写道
最关心的是jetty了,去看了一下官网,目前正在开发的9.1版本将会支持servlet 3.1,不过还不知道具体什么时间release。

估计会很快的,3.1没加多少新东西; tomcat8已经RC了

tomcat有点慢啊,tomEE还只支持j2ee6呢。只能先用glassfish 写websocket玩玩了
8 楼 jinnianshilongnian 2013-09-09 16:13
zhangthe9 写道
chapter4/api
glass fish4

com.sishuok.chapter4.web.servlet.ApiServlet

//把默认的JSESSIONID--修改为->id   可以观察客户端变成了id
sessionCookieConfig.setName("id");


java.lang.IllegalStateException: Unable to configure name session tracking cookie property for servlet context /chapter4, because this servlet context has already been initialized

还要修改什么地方吗

jetty是可以的;

从你的错误信息看是glassfish实现的问题,要求这个设置必须放在
需要在容器初始化时 完成 如ServletContextListener#contextInitialized方法中调用

7 楼 zhangthe9 2013-09-09 15:59
chapter4/api
glass fish4

com.sishuok.chapter4.web.servlet.ApiServlet

//把默认的JSESSIONID--修改为->id   可以观察客户端变成了id
sessionCookieConfig.setName("id");


java.lang.IllegalStateException: Unable to configure name session tracking cookie property for servlet context /chapter4, because this servlet context has already been initialized

还要修改什么地方吗
6 楼 jinnianshilongnian 2013-09-09 14:45
zhangthe9 写道
servlet3.1目前仅glassfish支持,在运行servlet3.1的程序时,请使用glassfish maven插件运行。

有哪些特性TOMCAT 7还不支持

或者看规范的 changelist
5 楼 jinnianshilongnian 2013-09-09 14:45
zhangthe9 写道
servlet3.1目前仅glassfish支持,在运行servlet3.1的程序时,请使用glassfish maven插件运行。

有哪些特性TOMCAT 7还不支持

比如非阻塞IO  你可以下载servlet3.1规范 红色部分是更新部分
4 楼 zhangthe9 2013-09-09 13:48
servlet3.1目前仅glassfish支持,在运行servlet3.1的程序时,请使用glassfish maven插件运行。

有哪些特性TOMCAT 7还不支持
3 楼 jinnianshilongnian 2013-09-09 13:39
skydream 写道
最关心的是jetty了,去看了一下官网,目前正在开发的9.1版本将会支持servlet 3.1,不过还不知道具体什么时间release。

估计会很快的,3.1没加多少新东西; tomcat8已经RC了
2 楼 skydream 2013-09-09 13:28
最关心的是jetty了,去看了一下官网,目前正在开发的9.1版本将会支持servlet 3.1,不过还不知道具体什么时间release。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 解决360浏览器兼容模式的页面显示问题

    以360的几款浏览器为例,我们优先通过Webkit内核渲染主流的网站,只有小量的网站通过IE内核渲染,以保证页面兼容。在过去很长一段时间里,我们主要的控制手段是一个几百k大小网址库,一个通过长期人工运营收集的网址...

  • acrobat页面显示问题

    最近对着电脑的时间比以前多太多了,每天都用Acrobat看pdf(千万别告诉我你用Adobe Reader),为了保护眼睛,需要更改下页面显示。   一、背景颜色  经常对着电脑看文档的人,需要修改下背景颜色。  通常默认...

  • 对于solrcloud节点删除后,依然在页面显示问题

    因为在创建solrcloud的节点后,配置文件会传入Zookeeper中进行统一的配置,但是在配置文件中手动删除节点后,重启后虽然节点显示不能用,但是在页面依然显示, 这是因为没有在Zookeeper的配置中进行处理,这里...

  • 在cmd命令行使用sqlplus时的页面显示问题

    1、问题描述:页面显示不全 解决方式: ----set linesize 设置一行显示的字符数 ----set pagesize 设置一页显示的行数 可以使用show linesize;查看当前设置的格式,或者show all; 我这里设置 set ...

  • freemarker 页面显示html标签问题

    在页面显示富文本的内容时,会自动将内容加上双引号,导致页面展示时连同标签一起展示,想了好多种办法都不行,最后终于想到了一个办法,总结如下: 1、将后台内容用一个隐藏域在页面上存储下来 <div id=&...

  • swagger页面不显示_swagger页面打开问题

    项目B,在局域网上那台linux机器运行,swagger没问题,但是在本地IDEA上运行,swagger页面打开状况如下:A和B用的2.9.2,都是springboot项目,配置都是一样的@Configuration@EnableSwagger2public class ...

  • vue2 vue-router 不显示页面问题

    最后发现是vue-router版本的问题,最新的版本是4.x.x , 使用cnpm install vue-router -S, 时默认安装了最新。我的项目的问题是,版本不兼容,环境配置不对。在项目配置的时候,默认 npm 包导出的是运行时构建,即 ...

  • 解决WordPress文章页面无法显示的问题

    解决方法 3.1 手动解决 在Word Press文章编辑页面中进行手动修改链接为纯英文可以解决这个问题。 缺点:使用该方法解决问题,每一篇发布的文章都需要进行手动修改连接,这太不方便了。 3.2 插件解决 在WordPress中...

  • 微信小程序页面不显示数据问题

    今天调试一个下拉框代码,我的代码是从我项目其他页面原模原样copy过来的,但是发现数据还是不能跟之前一样正常显示在页面上,最终发现原来代码需要添加如下的代码才能显示在页面上,就因为这个问题我寻找了一个下午...

  • 解决浏览器缩放导致页面显示不全问题

    问题 pc端web页面开发时,发现windows系统经常推荐用户使用125%、150%比例的缩放窗口,这样导致web页面被进行缩放,除此之外还有人为的按钮缩放。故此,在页面devicePixelRatio(设备像素比例)变化后,通过计算页面...

  • 北京银行网银页面显示问题

    最近使用北京银行的网银发现页面显示问题很大,后来凑巧发现是The World3.3浏览器启用IE高级渲染引起的(工具-》启用IE高级渲染)。大家在使用北京银行网银时,把它关掉就可以了。

  • 前端Vue页面跳转后不显示问题

    前端Vue页面跳转后不显示问题 1、index.js里面的代码 2、点击页面的代码 这样写完后发现页面跳转了,但是跳转页面没有显示 3、解决问题 这个一定要添加,我已经忘记好几次了

  • 解决中国教育考试网中小学教师资格考试报名系统的页面显示问题

    小师妹在中国教育考试网(http://ntce.neea.edu.cn/)进行中小学教师资格考试报名遇到了页面无法正常显示的问题,截图如下:

  • druid监控页面SQL不显示问题

    druid监控页面SQL不显示问题 如果可以正常访问界面,系统与数据库有交互,但是druid页面SQL监控却没数据 第一步查看【数据源】 检查filter是否没数据 第二步若没有数据,则查看自己的配置类 可以程序编写...

  • html页面中文显示乱码问题解决方法

    页面的显示编码和存储编码不一致 解决方案:修改显示编码和存储编码为一致。 步骤: 修改页面的显示编码 修改页面的存储编码 修改页面的显示编码 页面的显示编码就是浏览器用来解析页面的编码,常用的是utf-8编码。...

  • eclipse中jsp页面图片不显示问题

    在给一个web项目里的jsp页面添加一个背景图片,使用background:url的方式获取图片路径,但是一直不显示,最后发现还是根本路径的问题。 解决: 使用java代码获取项目根路径,通过绝对路径方式引入图片 在jsp文件的...

  • iframe 嵌入页面后无法显示的问题

    X-Frame-Options可用于指示是否应该允许浏览器呈现在一个页面<FRAME> 或 <IFRAME>中. 以确保网站内容是不是嵌入到其它网站. <head> <meta http-equiv="Content-Type" content="text/html; ...

  • spring boot 项目页面显示不出来

    在网上看见一种关于springboot的项目结构,并模仿着写了一下,导致无法访问页面,在网上查阅了相关问题及解决办法,特此留下记录。 Whitelabel Error Page This application has no explicit mapping for /error, ...

  • vue页面显示小数位数问题处理

    前几天,写了个数据占比的echarts的图,本来写的也没有问题,快上线了,突然被告知,数据小数位数展示的不合理啊,如下图所示: 接口返回数据如上图所示,我一看这简单啊,使用parseFloat(value).toFixed(3),这个公式不就...

  • vue切换页面echarts图表不显示的问题

    在vue项目中切换tab页面或者在后台管理框架中切换面包屑echarts图表会不显示,初次进入的时候能够正常显示,本地运行也没有问题,这个问题只在线上部署的时候出现。目前找到了两个解决方案,做下记录。echarts挂载的...

Global site tag (gtag.js) - Google Analytics