解决方案 »
- 求一个java+jsp的例子,在线等
- lucene针对多个索引文件采用不同查询条件查询
- 弱弱的问个有关<jsp:useBean scope="session"...的问题
- 限制多用户使用相同ID登陆
- 求助-struts2后台运行的问题
- 哪位大哥给个解压缩的现成程序?
- 为什么我的分组SQL语句会出错呢??还有,如何得到分组后的数据?
- 有谁知道哪里有介绍javabeans原理的详细电子书下载网址,送分!!
- 【websocket】求websocet能连接的完整小例子,急!!!!
- 怎么获取a的连接
- PreparedStatement中update语句更新问题。
- 获取项目中Hibernatesession个数
那么不需要对out进行flush()也不需要做close(),容器自己会搞定这些操作的。另外,如果你返回的数据是XML,你缺少了<?XML 这个头信息。
当然未必能消除你所面临的问题。不过我认为不应是flush()本身的问题,我觉得还是检查下 msg.toString() 输出的是啥。
返回的是XML数据,没有带xml头信息!返回的数据都是在<data>下!
<?xml version="1.0" encoding="UTF-8"?>
<data>
...
</data>
msg.toString() 也就是StringBuffer()的toString()方法,这里面它new了个String,这是它的源码!public synchronized String toString() {
return new String(value, 0, count);
}
System.out.println(msg.toString());这个肯定是正常的,因为写日志里面的时候是正常的,所以往控制台打印也是一样的!
HttpServletRequest request, HttpServletResponse response) throws Exception {
BufferedReader reader=null;
String uid = null, sortid = null;
int page = 0;
StringBuffer msg=new StringBuffer("");
StringBuffer sbf = new StringBuffer("");
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/get";//获取跟目录
SAXReader sr = new SAXReader();
Document doc;
try {
System.out.println(basePath);
reader = request.getReader();
doc = sr.read(reader);
Element elm = doc.getRootElement(); uid = elm.elementTextTrim("uid");
sortid = elm.elementTextTrim("sortid");
page = "".equals(elm.elementTextTrim("page"))?0:Integer.parseInt(elm.elementTextTrim("page")); } catch (DocumentException e) {
e.printStackTrace();
} finally{
if(null != reader) reader.close();
}
int list = page*20;
String sql = "select app_name,app_packname,app_id,app_vscode,app_vsname,app_score,app_icon,app_apk,app_size from joye_et_app where app_sort="+sortid+" order by app_priority asc,app_regtime desc limit "+list+",20";
Statement st = null;
ResultSet rs = null;
Connection conn = null;
try {
conn = DBConn.getConnection();
st = conn.createStatement();
rs = st.executeQuery(sql);
while(rs.next()){
sbf.append("<gtab>");
sbf.append("<name>"+rs.getString("app_name").trim().replace("&", "&")+"</name>");
sbf.append("<pack>"+rs.getString("app_packname").replace("&", "&")+"</pack>");
sbf.append("<appid>"+rs.getString("app_id")+"</appid>");
sbf.append("<vscode>"+rs.getString("app_vscode")+"</vscode>");
sbf.append("<vsname>"+rs.getString("app_vsname")+"</vsname>");
sbf.append("<score>"+rs.getString("app_score")+"</score>");
String icon_url=rs.getString("app_icon");
if(!icon_url.startsWith("http://"))
icon_url=basePath+icon_url;
sbf.append("<url>"+icon_url.replace("&", "&")+"</url>");
String apk_url=rs.getString("app_apk");
if(!apk_url.startsWith("http://"))
apk_url=basePath+apk_url;
sbf.append("<apk>"+apk_url.replace("&", "&")+"</apk>");
sbf.append("<size>"+rs.getString("app_size")+"</size>");
sbf.append("</gtab>");
}
HH:mm:ss").format(new Date()));
}catch(SQLException ex){
ex.printStackTrace();
} finally{
try {
if(null != rs) rs.close();
if(null != st) st.close();
DBConn.close(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
response.setContentType("text/xml");
response.setCharacterEncoding("utf-8");
PrintWriter out=null;
try {
out=response.getWriter();
msg.append("<data>");
msg.append(sbf.toString());
msg.append("</data>");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.print(msg.toString());
//out.flush();
out.close();
return null;
}
干净点的测试就是:
response.setContentType("text/xml");
response.setCharacterEncoding("utf-8");
PrintWriter out=null;
try {
out=response.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
out.flush();
out.close();然后再把out的flush()和close()都删掉,看看又有啥不一样的。
之前的代码确实没有close();
前面测试出问题,客户端那边就说检查一下有没有关闭流
然后我就加上了close();后来想出还有个flush()清空缓存区的
这样,二个方法我就同时加上了,可是还是不行!最后通过
httpdebug工具查看到了,返回的数据前加上了:以16进制表示的数据大小,以及最后面加个0
通过查找问题,发现是由于加上了flush()方法所导致
我也不知道这是为什么,如果你不是flush()导致的,好像又没别的了啊!
LZ的java文件是什么编码?客户端用的是什么编码?