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

  • 相关阅读:
    希腊字母写法
    The ASP.NET MVC request processing line
    lambda aggregation
    UVA 10763 Foreign Exchange
    UVA 10624 Super Number
    UVA 10041 Vito's Family
    UVA 10340 All in All
    UVA 10026 Shoemaker's Problem
    HDU 3683 Gomoku
    UVA 11210 Chinese Mahjong
  • 原文地址:https://www.cnblogs.com/dzhou/p/10504747.html
Copyright © 2020-2023  润新知