欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Servlet3.0 笔记 servlet3

程序员文章站 2022-04-18 10:58:36
...

在这里把我学习servlet3.0遇到的一些问题记录下来,希望大虾们给点意见,呵呵

 

1. Servlet3.0中的AsyncContext对象设置监听器后,如果新来的长连接把之前的那个顶掉了,应该调用之前那个AsyncContext的complete()方法,这样之前那个监听器的onTimeout()方法才不会执行,否则会多次执行onTimeout()方法。

 

2.Servlet3.0中,给AsyncContext对象设置监听器后超时,超时时间没到,然后用AsyncContext.getResponse().getOutputStream()这个流往客户端写数据,那么之前设置的那个监听器对应的超时时间过了之后,还是会会执行的??

 

3.Servlet3.0中服务器会保存客户端请求的Context对象,需要返回数据会调用getResponse()方法,从response对象获得往客户端写数据的通道,此时客户端和服务器相当于建立了一个通道,代码如下:

 

服务器:

ServletResponse response1 = ccc1.getResponse();

 

  PrintWriter pw1 = response1.getWriter();

        System.out.println(pw1.checkError());

        pw1.println("aaaaa");

        pw1.flush();

 

注意服务器调用的是flush方法,不是close方法。

 

客户端:

 

public static void main(String[] args)

    {

        // 构造HttpClient的实例

        HttpClient httpClient = new HttpClient();

        // 创建GET方法的实例

        GetMethod getMethod = new GetMethod(

                "http://127.0.0.1:8888/moliao/servletTest");

        // 使用系统提供的默认的恢复策略

        getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,

                new DefaultHttpMethodRetryHandler());

        try

        {

            // 执行getMethod

            int statusCode = httpClient.executeMethod(getMethod);

 

            if (statusCode != HttpStatus.SC_OK)

            {

                System.err.println("Method failed: "

                        + getMethod.getStatusLine());

            }

            // //读取内容

            // byte[] responseBody = getMethod.getResponseBody();

            InputStream is = getMethod.getResponseBodyAsStream();

 

            InputStreamReader isr = new InputStreamReader(is, "utf-8");

 

            BufferedReader br = new BufferedReader(isr);

 

            String line = br.readLine();

 

            while (line != null)

            {

                System.out.println(line);

                line = br.readLine();

            }

            System.out.println("line == null");

        }

        catch (HttpException e)

        {

            // 发生致命的异常,可能是协议不对或者返回的内容有问题

            System.out.println("Please check your provided http address!");

            e.printStackTrace();

        }

        catch (IOException e)

        {

            // 发生网络异常

            e.printStackTrace();

        }

        finally

        {

            // 释放连接

            getMethod.releaseConnection();

        }

    }

 

虽然这样的话,服务器和客户端的交流用一个通道就搞定了,避免了多次请求的麻烦。但是我还没搞明白,如果由于网络的原因,这个通道断了,该肿么办?

相关标签: servlet3