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