servlet3.1
Servlet3.1新增的新特性
强制更改sessionId
由HttpServletRequest 的changeSessionId()方法实现
非阻塞式IO
非阻塞式IO
我们应该知道Servlet底层的IO是通过如下两个IO流支持的
ServletInputStream : 用来读取数据的输入流
ServletOutputStream : 用来输出数据的输出流
从Servlet3.1开始,ServletInputStream新增了一个setReadListener(ReadListener listener)方法实现非阻塞式读取数据。
从Servlet3.1开始,ServletOutputStream新增了一个setWriterListener(WriteListener listener)方法实现非阻塞式输出数据。
以ReadListener示例
Servlet代码:
@WebServlet(name="AsyncServlet",urlPatterns={"/testAsyn.do"},asyncSupported=true)
public class AsyncServlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
//解决乱码
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");
//通过request获得AsyncContent对象
AsyncContext actx = request.startAsync();
//设置异步调用超时时长
actx.setTimeout(30*3000);
ServletInputStream in = request.getInputStream();
//异步读取(实现了非阻塞式读取)
in.setReadListener(new MyReadListener(in,actx));
// 直接输出到页面的内容(不等异步完成就直接给页面)
//但这些内容必须放在标签内,否则会在页面输出错误内容,这儿反正我测试是这样,具体不知对不对??
PrintWriter out = response.getWriter();
out.println("<h1>不等异步返回结果就直接返到页面的内容</h1>");
out.flush();
}
}
ReadListener代码:
public class MyReadListener implements ReadListener{
private ServletInputStream in;
private AsyncContext ac;
public MyReadListener(ServletInputStream input,AsyncContext context){
this.in = input;
this.ac = context;
}
//数据可用时触发执行
@Override
public void onDataAvailable(){
try {
Thread.sleep(5000);//暂停5秒,模拟耗时处理数据
//读取in里的数据省略...
ac.getRequest().setAttribute("username", "peter");//耗时处理后返回的数据
ac.dispatch("/index.jsp");
} catch (Exception e) {
// TODO: handle exception
}
}
//数据读完时触发调用
@Override
public void onAllDataRead(){
System.out.println("数据读完了");
}
//数据出错触发调用
@Override
public void onError(Throwable t){
System.out.println("数据 出错");
t.printStackTrace();
}
}
值得注意的是,Servlet依然是异步Servlet(asyncSupported=true),这说明非阻式IO实际上主要利的就是Servlet3.0时的异步Servlet。
还有要说明一下的是,ReadListener的实现类即没有在web.xml中配置,也没在类上标上@WebListener注解。
---------------------
作者:zcl_love_wx
来源:CSDN
原文:https://blog.csdn.net/zcl_love_wx/article/details/52108104
版权声明:本文为博主原创文章,转载请附上博文链接!
servlet3.1的更多相关文章
- Servlet3.0的动态
动态的创建是为了简化配置文件的.对于我们创建的servlet,filter和listener后可以使用.这也是注解的另外一种替代方式. 动态的添加有两种,一种是基于ContextListener的,另 ...
- Servlet3.0的异步
servlet之前的操作同时同步的,就是按照这样的一个流程来走的: 1.请求根据一个路径路由到一个servlet中, 2.servlet获取一系列的参数 3.执行一系列的逻辑(花费时间所占的比重也更大 ...
- java web学习总结(二十一) -------------------模拟Servlet3.0使用注解的方式配置Servlet
一.Servlet的传统配置方式 在JavaWeb开发中, 每次编写一个Servlet都需要在web.xml文件中进行配置,如下所示: 1 <servlet> 2 <servlet- ...
- 【1】springmvc4 + servlet3 零配置全注解入门项目helloword
自从servlet3.0支持注解,使得javaweb项目使用全注解成为可能. 注解化将成为javaweb的发展方向.包括spring去年推出的spring-boot也是全部使用注解. 代码:https ...
- 利用servlet3.0上传,纯原生上传,不依赖任何第三方包
tomcat7里面自带的servlet3.0.jar,支持很多新特性,例如,annotation配置servlet,上传,异步等等.... 如果你的tomcat版本低于7的话,单独在项目中引入serv ...
- cookie工具类,解决servlet3.0以前不能添加httpOnly属性的问题
最近在解决XSS注入的问题,由于使用的servlet版本是2.5,不支持httpOnly的属性,故做了个工具类来实现cookie的httpOnly的功能.全类如下: /** * cookie工具类,解 ...
- Servlet3.0中Servlet的使用
目录 1.注解配置 2.异步调用 3.文件上传 相对于之前的版本,Servlet3.0中的Servlet有以下改进: l 支持注解配置. l 支持异步调用. l 直接有对文件上传的支持. 在这篇 ...
- Servlet3.0新特性
1 Servlet3.0新特性概述 使用要求:MyEclipse10.0或以上版本,发布到Tomcat7.0或以上版本,创建JavaEE6.0应用! Servlete3.0的主要新特性如下三部分: 使 ...
- 转载 Servlet3.0中使用注解配置Servle
转载地址:http://www.108js.com/article/article10/a0021.html?id=1496 开发Servlet3的程序需要一定的环境支持.Servlet3是Java ...
- web.xml在Servlet3.0中的新增元素
metadata-complete: 当属性为true时,该Web应用将不会加载注解配置的Web组件(如Servlet.Filter.Listener) 当属性为false时,将加载注解配置的Web组 ...
随机推荐
- vue.js--遇到的一些错误
1. <sapn> - did you register the component correctly? For recursive components, make sure to p ...
- [ 随手记 1 ] C/C++宏,普通函数,内联函数
函数定义 C 语言中的函数定义的一般形式如下: return_type function_name( parameter list ) { body of the function } 在 C 语言中 ...
- 初窥async,await
首先是一道今日头条的面试题:(听说是今日头条的并且已经烂大街了) async function async1() { console.log( 'async1 start' ) await async ...
- 渲染标签 - v-text
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title ...
- maven整合ssh框架笔记
具体工程会上传文件sshpro <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:x ...
- container and Injection
1.容器的历史 容器概念始于 1979 年提出的 UNIX chroot,它是一个 UNIX 操作系统的系统调用,将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到这个新的 ...
- 查看linux系统CPU及内存配置
总核数 = 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 查看物理CPU个数 cat /proc/cpuinfo| grep & ...
- PS 给照片换背景
1. 打开一张照片,导入证件照 2. 点击选择 => 选择并遮住 (快捷键 command + option + r) 3. 点击快速选择工具,将属性设置里面的视图模式选择为洋葱皮,鼠标点击需要 ...
- Android中是否推荐使用枚举Enum
一.Enum的产生 Java1.5中引入了枚举的语法,包括Enum,EnumSet,EnumMap等.其中Enum就是我们在C或C++中见过的枚举类型,但是Java中的枚举又比C或C++中的枚举更成熟 ...
- python if not
判断是否为None的情况 if not x if x is None if not x is None if x is not None`是最好的写法,清晰,不会出现错误,以后坚持使用这种写法. 使用 ...