Servlet 中,out.print()與out.write()的區別


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM