java System.out.println() 在多次请求时候出错 问题

张--小涛涛 2016-08-31 11:02:21
首先我写了一个servlet,请求后进入如下代码

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置request和response编码格式为UTF-8
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");

//获取素材数量
WeixinRequestService.getMaterialCount();

//获取永久图文素材
GetMaterial getMaterial = new GetMaterial("news", "0", "20");
WeixinRequestService.getPermanentMaterialList(getMaterial);
}

在此servlet中
按照顺序分别调用WeixinRequestService.getMaterialCount();和WeixinRequestService.getPermanentMaterialList(getMaterial);
在上述调用的两个函数均为静态函数,无需实例化类,直接调用即可,代码分别如下:

/**
* 获取永久素材列表
* @return JSONObject
* @author ZhangJintao
*/
public static JSONObject getPermanentMaterialList(GetMaterial getMaterial) {
String url = WeixinRequstURL.GETPERMANENTMATERIALLIST;
url = url.replaceAll("ACCESS_TOKEN", WeiXinConfig.AccessTOKEN);
JSONObject result = RequestUtils.doPostStr(url,JsonHelper.toJSON(getMaterial).toString());
System.out.println("获取永久素材列表返回结果 = " + result.toString());
return result;
}

/**
* 获取素材数量
* @return JSONObject
* @author ZhangJintao
*/
public static JSONObject getMaterialCount() {
System.out.println("WeixinRequestService.getMaterialCount()");
String url = WeixinRequstURL.GETMATERIALCOUNT;
url = url.replaceAll("ACCESS_TOKEN", WeiXinConfig.AccessTOKEN);
JSONObject result = RequestUtils.doPostStr(url,"");
System.out.println("获取素材数量返回结果 = " + result);
return result;
}

可以看到getPermanentMaterialList和getMaterialCount中都调用了工具类 RequestUtils的doPostStr();方法。
RequestUtils的doPostStr()方法代码如下:

public static JSONObject doPostStr(String url , String outStr){
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
JSONObject jsonObject = null;
try {
httpPost.setEntity(new StringEntity(outStr, "utf-8"));
HttpResponse response = httpClient.execute(httpPost); //编号:1
String result = EntityUtils.toString(response.getEntity(),"utf-8"); //编号:2
// String result = "{\"success\":\"true\"}"; //编号:3
jsonObject = JSONObject.fromObject(result);
} catch (Exception e) {
e.printStackTrace();
}
return jsonObject;
}

ok,现在问题出在WeixinRequestService.getMaterialCount();和WeixinRequestService.getPermanentMaterialList(getMaterial)两个函数中的两个System.out.println()中。
当我部署项目,请求servlet时候,通过断点调试,首先代码确实是一步步全部执行正确且获取到了正确的返回结果。
但是,,控制台打印出的数据就出现了问题:
打印结果如下

更奇怪的是点击clearn Console按钮后(上图中红圈所示按钮),控制台中第一行先消失,过上两秒左右第二行才回消失。
这与预期的打印结果完全不同:
预期中打印结果应该如下:


经过我的调试:现在已经将问题聚焦到了RequestUtils的doPostStr()方法中编号为1/2/3三行,
当我将编号1和2的行注销,将编号为3的行放开后。打印结果如下:

这是正确的,所以我觉得问题应该出现在编号1 2 行的http请求中,我猜测是不是两次请求破坏了程序的输出流或者别的,小弟实在没办法了,求大神指教。
...全文
210 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧