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

  • 相关阅读:
    angularjs1.6.4中使用ng-table出现data.slice is not a function的问题
    使用sql语句获取数据库表的信息
    IIS部署web,字体404的问题
    SQL中partition关键字的使用
    asp.net 配置二级域名的共享session,并实现sso单点登录
    同一浏览器中同一JavaWeb程序不共享session方法
    Liquibase的使用
    对象并不一定都是在堆上分配内存的
    阿里面试题,为什么wait()方法要放在同步块中?
    粗浅看 Tomcat系统架构分析
  • 原文地址:https://www.cnblogs.com/dzhou/p/10504747.html
Copyright © 2011-2022 走看看