最近剛學習了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 += "\n" + 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(),否則容易導致數據丟失