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

  • 相关阅读:
    <转>c#调用C++DLL类型转换
    <转>CB2010使用一段时间总结。(Ansi>Unicode)
    Sql的自定义聚合函数,挺费劲。
    关于 MSDN 说 Lock 应该用private 对象锁定的测试。
    热门JQuery插件
    偶然发现 RouteDebuge 的作者是一个超牛的家伙。
    jquery.query 插件的设计问题。
    JQuery UI 调整笔记
    JQuery tr:visible IE8 失效.
    CS0016 一个解决方案:
  • 原文地址:https://www.cnblogs.com/dzhou/p/10504747.html
Copyright © 2011-2022 走看看