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