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
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/dzhou/p/10504747.html