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