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

  • 相关阅读:
    〖Linux〗zigbee实验之cc2430移植tinyos2.x的步骤(Ubuntu13.10)
    〖Linux〗clang3.4的编译与安装
    〖Linux〗打开qtcreater出现错误的解决方法
    〖Linux〗gvim使用alt+1,2,3..进行标签页切换
    〖Linux〗Ubuntu13.10 安装qt开发环境
    c#, 输出二进制
    unity shader在小米2s上的问题
    unity, animtion倒放
    反射矩阵(reflection matrix)推导
    unity, 用unity profiler进行真机profile,需要退出360
  • 原文地址:https://www.cnblogs.com/dzhou/p/10504747.html
Copyright © 2020-2023  润新知