在 JSP 頁面中,out 隱含對象提供 print() 與 write() 兩種輸出方法,二者行為差異常導致困惑。本文通過 JSP 編譯後的 Servlet 代碼對比,釐清核心區別。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
<body>
<h1>目前時間:</h1>
<%= new java.util.Date() %>
</body>
</html>
out.write("<h1>目前時間:</h1>\n");
out.print(new java.util.Date());
| 方法 | 簽名 | 參數類型 | 行為 |
|---|---|---|---|
print() | print(Object obj) | 接受任意 Java 物件 | 自動調用 String.valueOf(obj) 轉字符串輸出,null 輸出 "null" |
write() | write(String s) | 僅接受字符串 | 直接寫入字符流,傳入非字符串需強制轉型,null 會拋異常 |
JspWriter 繼承 java.io.Writer,提供 write(String)、write(char[]) 等。print(Object) 是 JspWriter 獨有的便利方法,內部實現:write(String.valueOf(obj))。out.write(),效率最高。<%= ... %>):編譯為 out.print(),支援任意物件。write();需輸出物件或拼接字符串用 print()。out.print() 是面向物件的多態輸出,out.write() 是面向字符流的基礎寫入。理解此差異有助於優化 JSP 輸出性能與避免類型轉換錯誤。