Servlet3.0 笔记

在这里把我学习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();

        }

    }

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

猜你喜欢

转载自happy90.iteye.com/blog/1169560