最近刚学习了Ajax,其中有通过$.getJSON的实现方式
由于前后端传递值的时候会通过流的方式进行传递,这就不得不涉及到这方面的知识了
PrintWrite out=response.getWrite;
而流输出的时候有两种方法
out.write()和out.print()
out.write()是字节输出流的方法
out.print()是字符输出流的方法
一、区别
1.
print方法是子类JspWriter,write是Writer类中定义的方法;
2.
write():仅支持输出字符类型数据,字符、字符数组、字符串等
print():可以将各种类型(包括Object)的数据通过默认编码转换成bytes字节形式,这些字节都通过write(int c)方法被输出
3.
JspWriter类型的out对象使用print方法和write方法都可以输出字符串,但是,如果字符串对象的值为null时,print方法将输出内容为“null”的字符串,而write方法则是抛出NullPointerException异常。
二、用法
详见https://blog.csdn.net/workinghardboy/article/details/80556735(为防止对方突然删除了....所以下方copy一份)
因此传输数据时,write,print都可以使用
1.PrintWriter可以直接调用write()或print()方法,把字符串作为参数写入,这样就可以写入json格式的数据了。如:
PrintWriter out = response.getWriter(); String info = gson.toJson(arraylistUsers); out.write(info);
通过这种方式,客户端就可以接受到数据了。客户端读取数据有多种方式,可以通过ajax读,也可以通过GetPostUtil来读取返回的数据。
package com.example.newsweb.activity; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; import java.util.List; import java.util.Map; public class GetPostUtil { public static String sendGet(String url, String params) { String result = ""; BufferedReader in = null; try { String urlName = url + "?" + params; URL realUrl = new URL(urlName); // 打开和URL之间的连接 URLConnection conn = realUrl.openConnection(); // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); // 建立实际的连接 conn.connect(); // 获取所有响应头字段 Map<String, List<String>> map = conn.getHeaderFields(); // 遍历所有的响应头字段 for (String key : map.keySet()) { // System.out.println(key + "--->" + map.get(key)); } // 定义BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("发送GET请求出现异常!" + e); e.printStackTrace(); } // 使用finally块来关闭输入流 finally { try { if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; } /** * 向指定URL发送POST方法的请求 * * @param url * 发送请求的URL * @param params * 请求参数,请求参数应该是name1=value1&name2=value2的形式。 * @return URL所代表远程资源的响应 */ public static String sendPost(String url, String params) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); // 打开和URL之间的连接 URLConnection conn = realUrl.openConnection(); // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // 获取URLConnection对象对应的输出流 out = new PrintWriter(conn.getOutputStream()); // 发送请求参数 out.print(params); // flush输出流的缓冲 out.flush(); // 定义BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += " " + line; } } catch (Exception e) { System.out.println("发送POST请求出现异常!" + e); e.printStackTrace(); } // 使用finally块来关闭输出流、输入流 finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; } }
2.print方法和write方法是有区别的,最大的区别就是上述提到的,print可以写入对象,而write不行。
3.print和write都可以写入html代码,来进行页面的跳转,并在一段时间后跳回到原来的页面,以此来达到提醒的作用。如:
PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>登录出错</TITLE>"); out.println("<meta http-equiv="refresh" charset='utf-8' content="3;url=" + truePath + "">"); out.println("</HEAD>"); out.println(" <BODY>"); out.print("<div align="center">"); out.print("您输入的书名不存在或书名有错误,请重试"); out.print("</div>"); out.println(" </BODY>"); out.println("</HTML>"); // flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满 out.flush(); out.close();
效果如图:
4.PrintWriter不能PrintWriter out = new PrintWriter(),因为这样,out不能找到输出的对象,导致输出失败。
5.out.flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满。所以一般先flush()再close(),否则容易导致数据丢失