ServletAPI 2.5的源代码
1.ServletResponse类的源代码如下:
package javax.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.Locale; public abstract interface ServletResponse { public abstract String getCharacterEncoding(); public abstract String getContentType(); public abstract ServletOutputStream getOutputStream() throws IOException; public abstract PrintWriter getWriter() throws IOException; public abstract void setCharacterEncoding(String paramString); public abstract void setContentLength(int paramInt); public abstract void setContentType(String paramString); public abstract void setBufferSize(int paramInt); public abstract int getBufferSize(); public abstract void flushBuffer() throws IOException; public abstract void resetBuffer(); public abstract boolean isCommitted(); public abstract void reset(); public abstract void setLocale(Locale paramLocale); public abstract Locale getLocale(); }
2.HttpServletResponse 类的源代码如下:
package javax.servlet.http; import java.io.IOException; import javax.servlet.ServletResponse; public abstract interface HttpServletResponse extends ServletResponse { public static final int SC_CONTINUE = 100;//SC是 status code的简写 public static final int SC_SWITCHING_PROTOCOLS = 101; public static final int SC_OK = 200; public static final int SC_CREATED = 201; public static final int SC_ACCEPTED = 202; public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203; public static final int SC_NO_CONTENT = 204; public static final int SC_RESET_CONTENT = 205; public static final int SC_PARTIAL_CONTENT = 206; public static final int SC_MULTIPLE_CHOICES = 300; public static final int SC_MOVED_PERMANENTLY = 301; public static final int SC_MOVED_TEMPORARILY = 302; public static final int SC_FOUND = 302; public static final int SC_SEE_OTHER = 303; public static final int SC_NOT_MODIFIED = 304; public static final int SC_USE_PROXY = 305; public static final int SC_TEMPORARY_REDIRECT = 307; public static final int SC_BAD_REQUEST = 400; public static final int SC_UNAUTHORIZED = 401; public static final int SC_PAYMENT_REQUIRED = 402; public static final int SC_FORBIDDEN = 403; public static final int SC_NOT_FOUND = 404; public static final int SC_METHOD_NOT_ALLOWED = 405; public static final int SC_NOT_ACCEPTABLE = 406; public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407; public static final int SC_REQUEST_TIMEOUT = 408; public static final int SC_CONFLICT = 409; public static final int SC_GONE = 410; public static final int SC_LENGTH_REQUIRED = 411; public static final int SC_PRECONDITION_FAILED = 412; public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413; public static final int SC_REQUEST_URI_TOO_LONG = 414; public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415; public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416; public static final int SC_EXPECTATION_FAILED = 417; public static final int SC_INTERNAL_SERVER_ERROR = 500; public static final int SC_NOT_IMPLEMENTED = 501; public static final int SC_BAD_GATEWAY = 502; public static final int SC_SERVICE_UNAVAILABLE = 503; public static final int SC_GATEWAY_TIMEOUT = 504; public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505; public abstract void addCookie(Cookie paramCookie); public abstract boolean containsHeader(String paramString); public abstract String encodeURL(String paramString); public abstract String encodeRedirectURL(String paramString); /** * @deprecated */ public abstract String encodeUrl(String paramString); /** * @deprecated */ public abstract String encodeRedirectUrl(String paramString); public abstract void sendError(int paramInt, String paramString) throws IOException; public abstract void sendError(int paramInt) throws IOException; public abstract void sendRedirect(String paramString) throws IOException; public abstract void setDateHeader(String paramString, long paramLong); public abstract void addDateHeader(String paramString, long paramLong); public abstract void setHeader(String paramString1, String paramString2); public abstract void addHeader(String paramString1, String paramString2); public abstract void setIntHeader(String paramString, int paramInt); public abstract void addIntHeader(String paramString, int paramInt); public abstract void setStatus(int paramInt); /** * @deprecated */ public abstract void setStatus(int paramInt, String paramString); }
2.1HttpServletResponse 对象所想描述的结构如下(http响应格式图):
其中,消息头,可以通过“meta ”标签equiv属性来模拟,如下
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ……
但是其优先级没有相应头高。
另外,如果页面本身编码为utf-8,浏览器将会识别出来,并强制设置为utf-8编码。"Content-Type""将不起作用。
3.ServletOutputStream和PrintWriter
ServletResponse类提供了如下两个方法:
public abstract ServletOutputStream getOutputStream() throws IOException; public abstract PrintWriter getWriter() throws IOException;
Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎获取,Servlet引擎,将这些数据当作响应消息的正文,然后再与响应状态行,响应头组合输出到客户端(通常为IE,Chrome等浏览器)。
ServletOutputStream主要针对字节,而PrintWriter针对字符串。另外getOutputStream和getWriter在一个service方法中不能同时调用。
参考:《深入体验Java_Web开发内幕-核心基础\》