时间:2016-11-11 15:07
——Servlet体系
Servlet(interface):
实现类:GenericServlet、HttpServlet
ServletConfig(interface):
实现子类:GenericServlet
GenericServlet(abstract):
实现接口:Servlet、ServletConfig
直接子类:HttpServlet
HttpServlet(abstract):
实现接口:Servlet、ServletConfig
继承自:GenericServlet
复写了service(ServletRequest res, ServletResponse resp)方法。
ServletRequest(interface):
子接口:HttpServletRequest
HttpServletRequest(interface)
继承接口:ServletRequest
ServletResponse(interface):
子接口:HttpServletResponse
HttpServletResponse(interface)
继承接口:ServletResponse
ServletContext(interface)
===========================================================================
Servlet(interface)
实现类:GenericServlet、HttpServlet
方法概要:
void destory()
由 servlet 容器调用,指示将从服务中取出该 servlet。此方法仅在 servlet 的 service 方法已退出或者在过了超时期之后调用一次。在调用此方法之后,servlet 容器不会再对此 servlet 调用 service 方法。
void init(ServletConfig config)
ServletConfig getServletConfig()
String getServletInfo()
void service(ServletRequest request, ServletResponse response)
由 servlet 容器调用,以允许 servlet 响应某个请求。
===========================================================================
ServletConfig(interface)
实现类:GenericServlet、HttpServlet
方法概要:
String getInitParameter(String name)
返回包含指定初始化参数的值的 String
,如果参数不存在,则返回 null
。
Enumeration getInitParameterNames()
以 String 对象的 Enumeration 的形式返回 servlet 的初始化参数的名称,如果 servlet 没有初始化参数,则返回一个空的Enumeration。
ServletContext getServletContext()
返回对调用者在其中执行操作的 ServletContext 的引用。
String getServletName()
返回此 servlet 实例的名称。该名称可能是通过服务器管理提供的,在 Web 应用程序部署描述符中分配,或者对于未注册(和未命名)的 servlet 实例,该名称将是该 servlet 的类名称。
===========================================================================
GenericServlet(abstract)
实现接口:Servlet、ServletConfig
直接子类:HttpServlet
构造方法:
public GenericServlet()
不执行任何操作。所有 servlet 初始化都由 init 方法中的一个方法来完成。
方法概要:
void init()
可重写的便捷方法,这样就不必调用 super.init(config)。
void log(String msg)
将前置有 servlet 名称的指定消息写入 servlet 日志文件。请参见 log(String)。
void log(String message, Throwable t)
将前置有 servlet 名称的给定 Throwable 异常的解释性消息和堆栈跟踪写入 servlet 日志文件。
abstract void service(ServletRequest request, ServletResponse response)
该方法为抽象方法,表示子类必须复写该service方法。
===========================================================================
HttpServlet(abstract)
实现接口:Servlet、ServletConfig
继承自:GenericServlet
方法概要:
protected void doDelete(HttpServletRequest request, HttpServletResponse response)
由服务器调用(通过 service 方法),以允许 servlet 处理 DELETE 请求。 DELETE 操作允许客户端从服务器中移除文档或 Web 页面。
protected void doGet(HttpServletRequest request, HttpServletResponse response)
protected void doHead(HttpServletRequest request, HttpServletResponse response)
接收来自受保护 service 方法的 HTTP HEAD 请求并处理该请求。当客户端只想看到响应的头(比如 Content-Type 或 Content-Length)时,它可以发送一个 HEAD 请求。HTTP HEAD 方法计算响应中的输出字节数,以便准确设置 Content-Length 头。
protected void doOptions(HttpServletRequest request, HttpServletResponse response)
由服务器调用(通过 service 方法),以允许 servlet 处理 OPTIONS 请求。 OPTIONS 请求可确定服务器支持哪些 HTTP 方法,并返回相应的头。例如,如果 servlet 重写 doGet,则此方法返回以下头:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
由服务器调用(通过 service 方法),以允许 servlet 处理 POST 请求。 HTTP POST 方法允许客户端一次将不限长度的数据发送到 Web 服务器,这在发送诸如信用卡号之类的信息时很有用。
protected void doPut(HttpservletRequest request, HttpServletResponse response)
由服务器调用(通过 service 方法),以允许 servlet 处理 PUT 请求。 PUT 操作允许客户端将文件放在服务器上,类似于通过 FTP 发送文件。
protected void doTrace(HttpServletRequest request, HttpServletResponse response)
由服务器调用(通过 service 方法),以允许 servlet 处理 TRACE 请求。 TRACE 将随 TRACE 请求一起发送的头返回给客户端,以便在调试中使用它们。无需重写此方法。
protected long getLastModified(HttpServletRequest request)
protected void service(HttpServletRequest request, HttpServletResponse response)
接收来自 public service 方法的标准 HTTP 请求,并将它们分发给此类中定义的 doXXX 方法。此方法是 javax.servlet.Servlet#service 方法的特定于 HTTP 的版本。无需重写此方法。
void service(ServletRequest request, ServletResponse response)
将客户端请求分发给受保护的 service 方法。无需重写此方法。
===========================================================================
ServletRequest(interface)
子接口:HttpServletRequest
定义将客户端请求信息提供给某个 servlet 的对象。servlet 容器创建 ServletRequest 对象,并将该对象作为参数传递给该 servlet 的 service 方法。
方法概要:
public void removeAttribute(String name)
从此请求中移除属性。此方法不是普遍需要的,因为属性只在处理请求期间保留。
name:指定要移除属性的名称。
public void setAttribute(String name, Object o)
存储此请求中的属性。使用的是key、value格式。
public Object getAttribute(String name)
通过name获取属性,如果不存在给定名称的属性,则返回null。
Enumeration<E> getAttributeNames()
返回包含此请求可用属性的名称的 Enumeration。如果该请求没有可用的属性,则此方法返回一个空的 Enumeration。
Enumeration底层是哈希表,是无序的。
public void setCharacterEncoding(String charset)
重写此请求正文中使用的字符编码的名称。必须在使用 getReader() 读取请求参数或读取输入之前调用此方法。否则,此方法没有任何效果。
参数:utf8、iso-8859-1、gbk
假设浏览器编码是:
request.setCharacterEncoding("gbk");
public String getCharacterEncoding()
返回此请求正文中使用的字符编码的名称。如果该请求未指定字符编码,则此方法返回 null
默认请求不指定编码,输出为null。
public int getContentLength()
返回请求正文的长度(以字节为单位),并使输入流可以使用它,如果长度未知,则返回 -1。对于 HTTP servlet,返回的值与 CGI 变量 CONTENT_LENGTH 的值相同。
汉字会通过URL进行编码,例如:%D7,此时%D7占3个字节长度。
public String getContentType()
返回请求正文的 MIME 类型,如果该类型未知,则返回 null。对于 HTTP servlet,返回的值与 CGI 变量 CONTENT_TYPE 的值相同。
public ServletInputStream getInputStream()
使用 ServletInputStream 以二进制数据形式获取请求正文。可调用此方法或 #getReader 读取正文,而不是两种方法都调用。
请求数据相当于文档,使用IO流来操作。
public String getLocalAddr()
返回本地的IP地址。
public Locale getLocale()
基于 Accept-Language 头,返回客户端将用来接受内容的首选 Locale。如果客户端请求没有提供 Accept-Language 头,则此方法返回服务器的默认语言环境。
return:客户端首选的Locale。
中文环境会返回:zh_CN, zh
public Enumeration<E> getLocales()
返回 Locale 对象的 Enumeration,这些对象以首选语言环境开头,按递减顺序排列,指示基于 Accept-Language 头客户端可接受的语言环境。如果客户端请求没有提供 Accept-Language 头,则此方法返回包含一个 Locale 的 Enumeration,即服务器的默认语言环境。
public String getLocalName()
返回接收请求的 Internet Protocol (IP) 接口的主机名。
public int getLocalPort()
public String getParameter(String name)
以 String 形式返回请求参数的值,如果该参数不存在,则返回 null。请求参数是与请求一起发送的额外信息。对于 HTTP servlet,参数包含在查询字符串或发送的表单数据中。
当参数name重名时,后者会覆盖前者,用法与Map集合相同。
public Map<K, V[ ]> getParameterMap()
返回此请求的参数的 java.util.Map。请求参数是与请求一起发送的额外信息。对于 HTTP servlet,参数包含在查询字符串或发送的表单数据中。
需要注意的是,value返回的是一个String数组,如果想要获取其中的值,需要脚标String[index]。
public Enumeration<E> getParameterNames()
返回包含此请求中所包含参数的名称的 String 对象的 Enumeration。如果该请求没有参数,则此方法返回一个空的 Enumeration。
public String[] getParameterValues(String name)
返回包含给定请求参数拥有的所有值的 String 对象数组,如果该参数不存在,则返回 null。
public String getProtocol()
以 protocol/majorVersion.minorVersion 的形式(例如 HTTP/1.1)返回请求使用的协议的名称和版本。对于 HTTP servlet,返回的值与 CGI 变量 SERVER_PROTOCOL 的值相同。
public BufferedReader getReader()
使用 BufferedReader 以字符数据形式获取请求正文。读取器根据正文上使用的字符编码转换字符数据。可调用此方法或 #getInputStream 读取正文,而不是两种方法都调用。
public String getRemoteAddr()
返回发送请求的客户端或最后一个代理的 Internet Protocol (IP) 地址。对于 HTTP servlet,返回的值与 CGI 变量 REMOTE_ADDR 的值相同。
获取客户端的IP地址。
public String getRemoteHost()
返回发送请求的客户端或最后一个代理的完全限定名称。如果引擎无法或没有选择解析主机名(为了提高性能),则此方法返回以点分隔的字符串形式的 IP 地址。对于 HTTP servlet,返回的值与 CGI 变量 REMOTE_HOST 的值相同。
public int getRemotePort()
返回发送请求的客户端或最后一个代理的 Internet Protocol (IP) 源端口。
public RequestDispatcher getRequestDispatcher(String path)
返回一个 RequestDispatcher 对象,它充当位于给定路径上的资源的包装器。可以使用 RequestDispatcher 对象将请求转发给资源,或者在响应中包含资源。资源可以是动态的,也可以是静态的。
String
。如果该路径名是相对的,那么它必须是相对于当前 servlet 的。return:充当位于给定路径上的资源的包装器的
RequestDispatcher
对象,如果 servlet 容器无法返回 RequestDispatcher
,则返回 null。
获得请求转发的对象。
public String getScheme()
返回用于发出此请求的方案的名称,例如 http、https 或 ftp。不同方案具有不同的构造 URL 的规则,这一点已在 RFC 1738 中注明。
public boolean isSecure()
返回一个 boolean 值,指示此请求是否是使用安全通道(比如 HTTPS)发出的。
public String getServerName()
返回请求被发送到的服务器的主机名。它是 Host
头值 ":"(如果有)之前的那部分的值,或者解析的服务器名称或服务器 IP 地址。
public int getServerPort()
返回请求被发送到的端口号。它是 Host
头值 ":"(如果有)之后的那部分的值,或者接受客户端连接的服务器端口。
===========================================================================
HttpServletRequest(Class)
实现接口:ServletRequest
方法概要:
public String getAuthType()
返回用于保护 servlet 的验证方案的名称。所有 servlet 容器都支持 basic、form 和 client certificate 验证,并且可能还支持 digest 验证。如果没有验证 servlet,则返回 null。
public String getContextPath()
返回请求 URI 指示请求上下文的那一部分(返回当前项目名称)。请求 URI 中首先出现的总是上下文路径。路径以 "/" 字符开头但不以 "/" 字符结束。对于默认(根)上下文中的 servlet,此方法返回 ""。容器不会解码此字符串。
例如:http://localhost/ServletDemo/index.html,返回/ServletDemo
public Cookie[] getCookies()
返回包含客户端随此请求一起发送的所有 Cookie 对象的数组。如果没有发送任何 cookie,则此方法返回 null。
打印Cookie值:c1.getName() + " " + c1.getValue()
public long getDateHeader(String name)
以表示 Date 对象的 long 值的形式返回指定请求头的值。与包含日期的头(比如 If-Modified-Since)一起使用此方法。
return:表示头中指定的日期的 long 值,该日期被表示为自格林威治标准时间 1970 年 1 月 1 日起经过的毫秒数,如果请求中不包含指定的头,则返回 -1。
public String getHeader(String name)
以
String
的形式返回指定请求头的值。如果该请求不包含指定名称的头,则此方法返回 null
。如果有多个具有相同名称的头,则此方法返回请求中的第一个头。头名称是不区分大小写的。可以将此方法与任何请求头一起使用。name:表示指定头名称的String。
public Enumeration<E> getHeaderNames()
返回此请求包含的所有头名称的枚举。如果该请求没有头,则此方法返回一个空枚举。
一些 servlet 容器不允许 servlet 使用此方法访问头,在这种情况下,此方法返回
null
。 public Enumeration<E> getHeaders(String name)
以
String
对象的 Enumeration
的形式返回指定请求头的所有值。 一些头(比如 Accept-Language
)能够以具有不同值的几个头的形式由客户端发送,而不采用以逗号分隔的列表的形式发送该头。
如果该请求不包含任何指定名称的头,则此方法返回一个空的 Enumeration
。头名称是不区分大小写的。可以将此方法与任何请求头一起使用。
public int getIntHeader(String name)
以 int 的形式返回指定请求头的值。如果该请求没有指定名称的头,则此方法返回 -1。如果无法将头转换为整数,则此方法抛出 NumberFormatException。
头名称是不区分大小写的。
public String getMethod()
返回用于发出此请求的 HTTP 方法的名称,例如 GET、POST 或 PUT。返回的值与 CGI 变量 REQUEST_METHOD 的值相同。
主要是HttpServlet调用,然后判断调用doGet()还是doPost()方法。
public String getPathInfo()
返回与客户端发出此请求时发送的 URL 相关联的额外路径信息。额外路径信息位于 servlet 路径之后但在查询字符串之前,并且将以 "/" 字符开头。
如果没有额外路径信息,则此方法返回 null
。
public String getPathTranslated()
返回在 servlet 名称之后但在查询字符串之前的额外路径信息,并将它转换为实际路径。返回的值与 CGI 变量 PATH_TRANSLATED 的值相同。
如果 URL 没有任何额外路径信息,则此方法返回 null
,或者 servlet 容器因为某种原因(比如当从归档文件执行 Web 应用程序时)无法将虚拟路径转换为实际路径。 Web 容器不会解码此字符串。
public String getQueryString()
返回包含在请求 URL 中路径后面的查询字符串。如果 URL 没有查询字符串,则此方法返回 null
。返回的值与 CGI 变量 QUERY_STRING 的值相同。
该值不由容器解码。
仅支持GET请求中的参数列表。
public String getRemoteUser()
如果用户已经过验证,则返回发出此请求的用户的登录信息,如果用户未经过验证,则返回 null
。用户名是否随每个后续请求发送取决于浏览器和验证类型。返回的值与 CGI 变量 REMOTE_USER 的值相同。
public String getRequestedSessionId()
返回客户端指定的会话 ID。此值可能不同于此请求的当前有效会话的 ID。如果客户端没有指定会话 ID,则此方法返回 null
。
public boolean isRequestedSessionIdFromCookie()
检查请求的会话 ID 是否是作为 cookie 进入的。
如果会话 ID 是作为 cookie 进入的,则返回 true
;否则返回 false。
public boolean isRequestedSessionIdFromURL()
检查请求的会话 ID 是否是作为请求 URL 的一部分进入的。
如果会话 ID 是作为 URL 的一部分进入的,则返回 true
;否则返回 false。
public isRequestedSessionIdValid()
检查请求的会话ID是否仍然有效,如果客户端没有指定任何会话ID,则此方法返回false。
public String getRequestURI()
返回此请求的 URL 的一部分,从协议名称一直到 HTTP 请求的第一行中的查询字符串。Web 容器不会解码此 String。例如:
POST /some/path.html HTTP/1.1 返回:/some/path.html
GET http://foo.bar/a.html HTTP/1.0 返回:/a.html
HEAD /xyz?a=b HTTP/1.1 返回:/xyz
要使用某个方案和主机重新构造 URL,可使用 HttpUtils#getRequestURL。
不包含IP(主机)和GET请求的参数,只包含项目根目录到请求地址。
public StringBuffer getRequestURL()
重新构造客户端用于发出请求的 URL。返回的 URL 包含一个协议、服务器名称、端口号、服务器路径,但是不包含查询字符串参数。
如果已经使用 javax.servlet.RequestDispatcher#forward 转发了此请求,则重新构造的 URL 中的服务器路径必须反映用于获取 RequestDispatcher 的路径,而不是客户端指定的服务器路径。
因为此方法返回 StringBuffer
而不是字符串,所以可以轻松地修改 URL,例如,可以追加查询参数。
此方法对于创建重定向消息和报告错误很有用。
包含IP(主机),不包含GET请求的参数。
public String getServletPath()
返回此请求调用 servlet 的 URL 部分。此路径以 "/" 字符开头,包括 servlet 名称或到 servlet 的路径,但不包括任何额外路径信息或查询字符串。返回的值与 CGI 变量 SCRIPT_NAME 的值相同。
如果用于处理此请求的 servlet 使用 "/*" 模式实现匹配,则此方法将返回一个空字符串 ("")。
不包含IP(主机)和项目名,不包含GET请求的参数,只包含项目名到Servlet的路径。
public HttpSession getSession(boolean create)
返回与此请求关联的当前 HttpSession
,如果没有当前会话并且 create
为 true,则返回一个新会话。
如果 create
为 false
并且该请求没有有效的 HttpSession
,则此方法返回 null
。
要确保会话得到适当维护,必须在提交响应之前调用此方法。如果容器正使用 cookie 维护会话完整性,并被要求在提交响应时创建新会话,则抛出 IllegalStateException。
public HttpSession getSession()
返回与此请求关联的当前会话,如果该请求没有会话,则创建一个会话。
public boolean isUserInRole(String role)
返回一个 boolean 值,指示指定的逻辑“角色”中是否包含经过验证的用户。角色和角色成员关系可使用部署描述符定义。如果用户没有经过验证,则该方法返回 false
。
name:指定角色名称的String。
public java.security.Principal getUserPrincipal()
返回包含当前已经过验证的用户的名称的 java.security.Principal
对象。如果用户没有经过验证,则该方法返回 null
。
===========================================================================
ServletResponse(interface)
子接口:HttpServletResponse
可使用 #setCharacterEncoding 和 #setContentType 显式指定 MIME 正文响应的 charset,或使用 #setLocale 方法隐式指定它。显式指定优先于隐式指定。如果未指定 charset,则将使用 ISO-8859-1。setCharacterEncoding、setContentType 或 setLocale 方法必须在调用 getWriter 之前,并且必须在提交采用要使用的字符编码的响应之前调用。
方法概要:
public void flushBuffer()
强行将缓冲区中的所有内容写入客户端。调用此方法会自动提交响应,这意味着将编写状态代码和头。
public void reset()
清除缓冲区中存在的所有数据以及状态代码和头。如果已提交响应,则此方法将抛出 IllegalStateException。
public void resetBuffer()
清除响应中底层缓冲区的内容,而不清除头或状态代码。如果已提交响应,则此方法将抛出 IllegalStateException。
设置响应正文的首选缓冲区大小。servlet 容器将使用至少与所请求大小一样大的缓冲区。可使用 getBufferSize 获得使用的实际缓冲区大小。
public void setBufferSize(int size)
较大的缓冲区允许在实际发送任何东西之前编写更多的内容,这为 servlet 提供了更多时间来设置适当的状态代码和头。较小的缓冲区会减少服务器内存负载,并允许客户端更快地开始接收数据。
必须在编写任何响应正文内容之前调用此方法;如果已经编写了内容或者已经提交了响应对象,则此方法将抛出 IllegalStateException。
public int getBufferSize()
返回用于该响应的实际缓冲区大小,如果未使用任何缓冲,则返回值为0。
public void setCharacterEncoding(String charset)
设置将发送到客户端的响应的字符编码 (MIME charset),例如,将它设置为 UTF-8。如果已通过 #setContentType 或 #setLocale 设置了字符编码,则此方法将重写该字符编码。用 text/html 的 String 调用 #setContentType 并用 UTF-8 的 String 调用此方法等效于用 text/html; charset=UTF-8 的 String 调用 setContentType。
可重复调用此方法来更改字符编码。如果在已调用 getWriter 之后或者在已提交响应之后调用此方法,则此方法没有任何效果。
容器必须让客户端了解将用于 servlet 响应的 writer 的字符编码,如果协议提供了实现上述操作的方法。在使用 HTTP 的情况下,字符编码是作为文本媒体类型的 Content-Type 头的一部分传送的。注意,如果 servlet 未指定内容类型,则字符编码不能通过 HTTP 头传送;但是,它仍然用于编码通过 servlet 响应的 writer 编写的文本。
public String getCharacterEncoding()
返回用于此响应中发送的正文的字符编码 (MIME charset) 名称。可能已使用 #setCharacterEncoding 或 #setContentType 方法显式指定字符编码,或使用 #setLocale 方法隐式指定它。显式指定优先于隐式指定。在已调用 getWriter 之后或者在已提交响应之后调用这些方法不会对字符编码产生任何影响。如果未指定字符编码,则返回 ISO-8859-1。
public boolean isCommitted()
返回指示响应是否已提交的 boolean 值。已提交的响应已将其状态代码和头编写好。
public void setContentLength(int len)
设置 HTTP servlet 中响应的内容正文的长度,此方法设置 HTTP Content-Length 头。
public void setContentType(String type)
设置将发送到客户端的响应的内容类型,如果该响应尚未提交。给定内容类型可能包含字符编码规范,例如 text/html;charset=UTF-8。如果在调用 getWriter 之前调用此方法,则只根据给定内容类型设置响应的字符编码。
可重复调用此方法来更改内容类型和字符编码。如果在已提交响应之后调用此方法,则此方法没有任何效果。如果在已调用 getWriter 之后或者在已提交响应之后调用此方法,则该方法不会设置响应的字符编码。
容器必须让客户端了解用于 servlet 响应的 writer 的内容类型和字符编码,如果协议提供了实现上述操作的方法。在使用 HTTP 的情况下,使用 Content-Type 头。
public String getContentType()
返回用于此响应中发送的 MIME 正文的内容类型。必须在提交响应之前已使用 #setContentType 指定适当的内容类型。如果未指定内容类型,则此方法返回 null。如果已指定内容类型,并且已经如 #getCharacterEncoding 中所述显式或隐式指定了字符编码或者已调用 #getWriter,则返回的字符串中将包含 charset 参数。如果未指定字符编码,则省略 charset 参数。
public void setLocale(java.util.Locale loc)
设置响应的语言环境,如果该响应尚未提交。如果尚未使用 #setContentType 或 #setCharacterEncoding 显式设置字符编码、尚未调用 getWriter,并且响应尚未提交,则此方法还将设置适合该语言环境的响应的字符编码。如果部署描述符包含 locale-encoding-mapping-list 元素,并且该可重复调用此方法来更改语言环境和字符编码。如果在已提交响应之后调用该方法,则此方法没有任何效果。如果在已使用 charset 规范调用 #setContentType 之后、在已调用 #setCharacterEncoding 之后、在已调用 getWriter 之后,或者在已提交响应之后调用此方法,则此方法不会设置响应的字符编码。元素提供了给定语言环境的映射,则使用该映射。否则,从语言环境到字符编码的映射是与容器相关的。
容器必须让客户端了解用于 servlet 响应的 writer 的语言环境和字符编码,如果协议提供了实现上述操作的方法。在使用 HTTP 的情况下,语言环境是通过 Content-Language 头传送的,字符编码是作为文本媒体类型的 Content-Type 头的一部分传送的。注意,如果 servlet 未指定内容类型,则字符编码不能通过 HTTP 头传送;但是,它仍然用于编码通过 servlet 响应的 writer 编写的文本。
loc:响应的语言环境
public java.util.Locale getLocale()
返回使用 #setLocale 方法指定的此响应的语言环境。在已提交响应后调用 setLocale 没有任何效果。如果未指定任何语言环境,则返回容器的默认语言环境。
public ServletOutputStream getOutputStream()
返回适用于在响应中编写二进制数据的 ServletOutputStream。servlet 容器不会编码二进制数据。
public PrintWriter getWriter()
返回可将字符文本发送到客户端的 PrintWriter 对象。PrintWriter 使用 #getCharacterEncoding 返回的字符编码。如果未如 getCharacterEncoding 中所述指定响应的字符编码(即该方法只返回默认值 ISO-8859-1),则 getWriter 会将字符编码更新到 ISO-8859-1。
===========================================================================
HttpServletResponse(interface)
继承接口:ServletResponse
扩展 ServletResponse 接口以提供特定于 HTTP 的发送响应功能。例如,该接口拥有访问 HTTP 头和 cookie 的方法。
方法概要:
public void addCookie(Cookie cookie)
将指定 cookie 添加到响应。可多次调用此方法设置一个以上的 cookie。
public void addDateHeader(String name, long date)
用给定名称和日期值添加响应头。该日期根据距历元时间的毫秒数指定。此方法允许响应头有多个值。
public void addHeader(String name, String value)
用给定名称和值添加响应头。此方法允许响应头有多个值。
public void addIntHeader(String name, int value)
用给定名称和整数值添加响应头。此方法允许响应头有多个值。
public boolean containsHeader(String name)
返回一个 boolean 值,指示是否已经设置指定的响应头。
public String encodeRedirectURL(String url)
对指定 URL 进行编码,以便在 sendRedirect
方法中使用它,如果不需要编码,则返回未更改的 URL。此方法的实现包含可以确定会话 ID 是否需要在 URL 中编码的逻辑。因为进行此确定的规则可能不同于用来确定是否对普通链接进行编码的规则,所以此方法与 encodeURL
方法是分开的。
发送到 HttpServletResponse.sendRedirect
方法的所有 URL 都应该通过此方法运行。否则,URL 重写不能用于不支持 cookie 的浏览器。
public String encodeURL(String url)
通过将会话 ID 包含在指定 URL 中对该 URL 进行编码,如果不需要编码,则返回未更改的 URL。此方法的实现包含可以确定会话 ID 是否需要在 URL 中编码的逻辑。例如,如果浏览器支持 cookie,或者关闭了会话跟踪,则 URL 编码就不是必需的。
对于健壮的会话跟踪,servlet 发出的所有 URL 都应该通过此方法运行。否则,URL 重写不能用于不支持 cookie 的浏览器。
public void sendError(int status, String msg)
使用指定状态代码并清除缓冲区将错误响应发送到客户端。
如果已经提交了响应,则此方法抛出 IllegalStateException。使用此方法后,响应应该被视为已经被提交,不能再写入。
public void sendRedirect(String location)
使用指定重定向位置 URL 将临时重定向响应发送到客户端。此方法可以接受相对 URL;servlet 容器必须在将响应发送到客户端之前将相对 URL 转换为绝对 URL。如果位置是相对的,没有前导 '/',则容器将相对于当前请求 URI 对其进行解释。如果位置是相对的,有一个前导 '/',则容器将相对于 servlet 容器根对其进行解释。
如果已经提交了响应,则此方法抛出 IllegalStateException。使用此方法后,响应应该被视为已经被提交,不能再写入。
public void setDateHeader(String name, long date)
用给定名称和日期值设置响应头。该日期根据距历元时间的毫秒数指定。如果已经设置了头,则新值将重写以前的值。containsHeader 方法可用于测试在设置其值之前头是否存在。
public void setHeader(String name, String value)
用给定名称和值设置响应头。如果已经设置了头,则新值将重写以前的值。containsHeader 方法可用于测试在设置其值之前头是否存在。
public void setIntHeader(String name, int value)
用给定名称和整数值设置响应头。如果已经设置了头,则新值将重写以前的值。containsHeader 方法可用于测试在设置其值之前头是否存在。
public void setStatus(int status)
设置此响应的状态代码。此方法用于设置没有错误时的返回状态代码(例如状态代码 SC_OK 或 SC_MOVED_TEMPORARILY)。如果有错误,并且调用者希望调用 Web 应用程序中定义的错误页面,则应改用 sendError 方法。
容器清除缓冲区,设置 Location 头,并保留 cookie 和其他头。
===========================================================================
ServletContext(interface)
定义一组方法,servlet 使用这些方法与其 servlet 容器进行通信,例如,获取文件的 MIME 类型、分发请求或写入日志文件。
每个 Java 虚拟机的每个“Web 应用程序”都有一个上下文。(“Web 应用程序”是 servlet 和内容的 Collection,这些 servlet 和内容安装在服务器的 URL 名称空间(比如 /catalog
)的特定子集下,并且可能通过 .war
文件安装。)
方法概要:
public void log(String msg)
将指定消息写入 servlet 日志文件(通常是一个事件日志)。servlet 日志文件的名称和类型是特定于 servlet 容器的。
public void log(String message, Thrpwable throwable)
将给定 Throwable
异常的解释性消息和堆栈跟踪写入 servlet 日志文件。servlet 日志文件的名称和类型是特定于 servlet 容器的(通常是一个事件日志)。
public void removeAttribute(String name)
从 servlet 上下文中移除具有给定名称的属性。完成移除操作后,为获取属性值而对 #getAttribute 进行的后续调用将返回 null。
如果在ServletContext中配置了监听器,则容器应相应的通知它们。
public void setAttribute(String name, Object obj)
将对象绑定到此 servlet 上下文中的给定属性名称。如果已将指定名称用于某个属性,则此方法将使用新属性替换具有该名称的属性。
如果在 ServletContext 上配置了侦听器,则容器将相应地通知它们。
如果传递了 null 值,则效果将与调用 removeAttribute() 相同。
public Object getAttribute(String name)
返回具有给定名称的 servlet 容器属性,如果不具有该名称的属性,则返回 null。属性允许 servlet 容器将此接口还没有提供的额外信息提供给 servlet。
public Enumeration<E> getAttributeNames()
返回包含此 servlet 上下文中可用属性的名称的 Enumeration。使用带有一个属性名称的 #getAttribute 方法获取属性值。
public ServletContext getContext(String uripath)
返回与服务器上的指定 URL 相对应的 ServletContext
对象。
此方法允许 servlet 获得对服务器各个部分的上下文的访问,并根据需要从上下文中获得 RequestDispatcher 对象。给定路径必须以 "/" 开头,相对于服务器的文档根进行解释,并与宿主在此容器上的其他 Web 应用程序的上下文根匹配。
在安全意识较强的环境中,servlet 容器可能对给定 URL 返回 null。
uripath:指定容器中另一个Web应用程序的上下文路径。
public String getContextPath()
返回Web应用程序的上下文路径。
上下文路径是用来选择请求上下文的请求 URI 的一部分。请求 URI 中首先出现的总是上下文路径。路径以 "/" 字符开头但不以 "/" 字符结束。对于默认(根)上下文中的 servlet,此方法返回 ""。
servlet 容器可能通过多个上下文路径匹配一个上下文。在这种情况下,getContextPath() 将返回该请求使用的实际上下文路径,它可能不同于此方法返回的路径。此方法返回的上下文路径应该被认为是应用程序的主要或首选上下文路径。
public String getIntParameter(String name)
返回包含指定上下文范围初始化参数值的 String,如果参数不存在,则返回 null。
此方法可使可用的配置信息用于整个“Web 应用程序”。例如,它可以提供 webmaster 的电子邮件地址,或者提供包含关键数据的系统的名称。
public Enumeratrion<E> getIntParameterNames()
以 String 对象的 Enumeration 的形式返回上下文初始化参数的名称,如果该上下文没有初始化参数,则返回一个空的 Enumeration。
public int getMajorVersion()
返回此 servlet 容器支持的 Java Servlet API 的主版本。所有遵守 Version 2.5 的实现必须让此方法返回整数 2。
public String getMimeType(String file)
返回指定文件的 MIME 类型,如果 MIME 类型未知,则返回 null。MIME 类型由 servlet 容器的配置确定,可以在 Web 应用程序部署描述符中指定。常见 MIME 类型是 "text/html" 和 "image/gif"。
public int getMinorVersion()
返回此 servlet 容器支持的 Servlet API 的次版本。所有遵守 Version 2.5 的实现必须让此方法返回整数 5。
public RequestDispatcher getNamedDispatcher(String name)
返回充当指定 servlet 的包装器的 RequestDispatcher 对象。
servlet(以及 JSP 页面)可通过服务器管理或通过 Web 应用程序部署描述符给定名称。servlet 实例可使用 ServletConfig#getServletName 确定其名称。
如果 ServletContext 由于某种原因无法返回 RequestDispatcher,则此方法返回 null。
public String getRealPath(String path)
为给定虚拟路径返回包含实际路径的 String。例如,可以通过对 "http://host/contextPath/index.html" 的请求使路径 "/index.html" 返回服务器文件系统上的绝对文件路径,其中 contextPath 是此 ServletContext 的上下文路径。
将采用与正在其上运行 servlet 容器的计算机和操作系统相适应的形式返回实际路径(包括采用适当的路径分隔符)。如果 servlet 容器由于某种原因无法将虚拟路径转换为实际路径(例如正从 .war 归档文件中获得内容时),则此方法返回 null。
可以获得带盘符的真实路径。
public RequestDispatcher getRequestDispatcher(String path)
返回一个 RequestDispatcher 对象,它充当位于给定路径上的资源的包装器。可以使用 RequestDispatcher 对象将请求转发到资源,或者在响应中包含资源。资源可以是动态的,也可以是静态的。
该路径名必须以 "/" 开头,并相对于当前上下文根进行解释。使用 getContext 获得用于外部上下文中资源的 RequestDispatcher。如果 ServletContext 无法返回 RequestDispatcher,则此方法返回 null。
public java.net.URL getResource(String path)
返回指向映射到指定路径的资源的 URL。该路径必须以 "/" 开头,并相对于当前上下文根进行解释。
此方法允许 servlet 容器使某一资源可用于来自任意源的 servlet。资源可位于本地或远程文件系统上、数据库中或 .war 文件中。
servlet 容器必须实现访问资源所需的 URL 处理程序和 URLConnection
对象。
如果没有资源映射到路径名,则此方法返回 null
。
某些容器可能允许使用 URL 类的方法写入此方法返回的 URL。
资源内容是直接返回的,所以应该知道请求一个 .jsp 页面将返回 JSP 源代码。请改用 RequestDispatcher 以包含执行的结果。
此方法有一个与 java.lang.Class.getResource 不同的用途,后者基于类加载器查找资源。此方法不使用类加载器。
public InputStream getResourceAsStream(String path)
以 InputStream 对象的形式返回位于指定路径上的资源。
InputStream 中的数据可以是任意类型或长度。该路径必须根据 getResource 中给出的规则指定。如果指定路径上没有资源,则此方法返回 null。
使用此方法时,可通过 getResource 方法获得的元信息(比如内容长度和内容类型)将丢失。
servlet 容器必须实现访问资源所需的 URL 处理程序和 URLConnection 对象。
此方法不同于 java.lang.Class.getResourceAsStream,后者使用类加载器。此方法允许 servlet 容器使某一资源可用于来自任意位置的 servlet,而不必使用类加载器。
public Set<E> getResourcePaths(String path)
返回指向 Web 应用程序中资源的所有路径的类似目录的清单,这些路径中最长的子路径与提供的 path 参数匹配。指示以 '/' 结尾的子目录路径的路径。返回的路径都是相对于 Web 应用程序根目录的并有一个前导 '/'。例如,对于包含以下内容的 Web 应用程序
/welcome.html
/catalog/index.html
/catalog/products.html
/catalog/offers/books.html
/catalog/offers/music.html
/customer/login.jsp
/WEB-INF/web.xml
/WEB-INF/classes/com.acme.OrderServlet.class,
getResourcePaths("/") 返回 {"/welcome.html", "/catalog/", "/customer/", "/WEB-INF/"}
getResourcePaths("/catalog/") 返回 {"/catalog/index.html", "/catalog/products.html", "/catalog/offers/"}。
path:用于匹配资源的部分路径,必须以 / 开头。
public String getServerInfo()
返回正在其上运行 servlet 的 servlet 容器的名称和版本。
所返回字符串的形式是 servername/versionnumber。例如,JavaServer Web Development Kit 可能返回字符串 JavaServer Web Dev Kit/1.0。
servlet 容器可以在主字符串之后在括号中返回其他可选信息,例如 JavaServer Web Dev Kit/1.0 (JDK 1.1.6; Windows NT 4.0 x86)。
public String getServletContextName()
返回与此 ServletContext 相对应的 Web 应用程序的名称,该名称是通过 display-name 元素在部署描述符中为此 Web 应用程序指定的。
如果尚未在部署描述符中声明该名称,则返回 null。
===========================================================================
HttpSession(interface)
提供一种方式,跨多个页面请求或对 Web 站点的多次访问标识用户并存储有关该用户的信息。
servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,跨多个连接或来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。服务器能够以多种方式维护会话,比如使用 cookie 或重写 URL。
此接口允许 servlet:
查看和操作有关某个会话的信息,比如会话标识符、创建时间和最后一次访问。
将对象绑定到会话,允许跨多个用户连接保留用户信息。
当容器使用分布式容器设置在 VM 之间迁移会话时,所有实现 HttpSessionActivationListener 接口的会话属性都会得到通知。
servlet 应该能够处理客户端选择不加入会话的情况,比如故意关闭 cookie 时。在客户端加入会话前,isNew 一直返回 true。如果客户端选择不加入会话,则 getSession 将对每个请求返回一个不同的会话,并且 isNew 将总是返回 true。
会话信息的范围仅限于当前 Web 应用程序 (ServletContext),因此存储在一个上下文中的信息在另一个上下文中不是直接可见的。
方法概要:
public void invalidate()
使此会话无效,然后取消对任何绑定到它的对象的绑定。
public void removeAttribute(String name)
从此会话中移除与指定名称绑定在一起的对象。如果会话没有与指定名称绑定在一起的对象,则此方法不执行任何操作。
在执行此方法后,如果对象实现了 HttpSessionBindingListener,则容器将调用 HttpSessionBindingListener.valueUnbound。然后,容器通知 Web 应用程序中的任何 HttpSessionAttributeListener。
public void setAttribute(String name, Object value)
使用指定名称将对象绑定到此会话。如果具有同样名称的对象已经绑定到该会话,则替换该对象。
在执行此方法后,如果新对象实现了 HttpSessionBindingListener,则容器将调用 HttpSessionBindingListener.valueBound。然后,容器通知 Web 应用程序中的任何 HttpSessionAttributeListener。
如果某个对象已经使用此名称绑定到了此会话且该对象实现了 HttpSessionBindingListener,则调用它的 HttpSessionBindingListener.valueUnbound 方法。
如果传入的值为 null,则调用此方法将与调用 removeAttribute() 产生的效果相同。
public Object getAttribute(String name)
返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回 null。
public Enumeration<E> getAttributeNames()
返回包含绑定到此会话的所有对象的名称的 String
对象的 Enumeration
。
public long getCreationTime()
返回创建此会话的时间,该时间是用自格林威治标准时间 1970 年 1 月 1 日午夜起经过的毫秒数来测量的。
public String getId()
返回包含分配给此会话的唯一标识符的字符串。标识符是由 servlet 容器分配的,并且是与实现相关的。
public long getLastAccessedTime()
返回客户端上一次发送与此会话关联的请求时间(该时间是自格林威治标准时间 1970 年 1 月 1 日午夜起经过的毫秒数),并用容器接收该请求的时间标记它。
应用程序采取的操作(比如获取或设置与会话关联的值)不会影响访问时间。
public void setMaxInactiveInterval(int interval)
指定在 servlet 容器使此会话失效之前客户端请求之间的时间间隔,以秒为单位。负数时间指示会话永远不会超时。
public int getMaxInactiveInterval()
返回 servlet 容器在客户端访问之间将使此会话保持打开状态的最大时间间隔,以秒为单位。在此间隔之后,servlet 容器将使会话无效。可使用 setMaxInactiveInterval
方法设置最大时间间隔。负数时间指示会话永远不会超时。
public boolean isNew()
如果客户端还不知道该会话,或者客户端选择不加入该会话,则返回 true
。例如,如果服务器仅使用基于 cookie 的会话,而客户端已经禁止了 cookie 的使用,则每个请求上的会话都将是新会话。
public ServletContext getServletContext()
返回此会话所属的 ServletContext。
===========================================================================
Cookie(Class)
实现接口:Cloneable
创建一个 cookie,cookie 是 servlet 发送到 Web 浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器。cookie 的值可以唯一地标识客户端,因此 cookie 常用于会话管理。
一个 cookie 拥有一个名称、一个值和一些可选属性,比如注释、路径和域限定符、最大生存时间和版本号。一些 Web 浏览器在处理可选属性方面存在 bug,因此有节制地使用这些属性可提高 servlet 的互操作性。
servlet 通过使用 HttpServletResponse#addCookie 方法将 cookie 发送到浏览器,该方法将字段添加到 HTTP 响应头,以便一次一个地将 cookie 发送到浏览器。浏览器应该支持每台 Web 服务器有 20 个 cookie,总共有 300 个 cookie,并且可能将每个 cookie 的大小限定为 4 KB。
浏览器通过向 HTTP 请求头添加字段将 cookie 返回给 servlet。可使用 HttpServletRequest#getCookies 方法从请求中获取 cookie。一些 cookie 可能有相同的名称,但却有不同的路径属性。
cookie 影响使用它们的 Web 页面的缓存。HTTP 1.0 不会缓存那些使用通过此类创建的 cookie 的页面。此类不支持 HTTP 1.1 中定义的缓存控件。
此类支持版本 0(遵守 Netscape 协议)和版本 1(遵守 RFC 2109 协议)cookie 规范。默认情况下,cookie 是使用版本 0 创建的,以确保最佳互操作性。
构造方法:
public Cookie(String name, String value)
构造带指定名称和值的 cookie。
该值可以是服务器选择发送的任何值。可能只有该服务器需要其值。cookie 的值在使用 setValue
方法创建后可以更改。
默认情况下,根据 Netscape cookie 规范创建 cookie。可以使用 setVersion
方法更改版本。
方法概要:
public void setComment(String purpose)
指定一个描述 cookie 用途的注释。如果浏览器向用户显示 cookie,则注释很有用。Netscape Version 0 cookie 不支持注释。
public String getComment()
返回描述此 cookie 用途的注释;如果该 cookie 没有注释,则返回 null
。
public void setDomain(String pattern)
指定应在其中显示此 cookie 的域。
RFC 2109 指定了域名的形式。域名以点 (.foo.com
) 开头,意味着在指定域名系统(Domain Name System,DNS)区域中(例如,www.foo.com
,但不是 a.b.foo.com
)cookie 对于服务器是可见的。默认情况下,cookie 只返回给发送它们的服务器。
public void getDomain()
返回为此 cookie 设置的域名。域名形式是根据 RFC 2109 设置的。
public void setMaxAge(int expiry)
设置 cookie 的最大生存时间,以秒为单位。
正值表示 cookie 将在经过该值表示的秒数后过期。注意,该值是 cookie 过期的最大 生存时间,不是 cookie 的当前生存时间。
负值意味着 cookie 不会被持久存储,将在 Web 浏览器退出时删除。0 值会导致删除 cookie。
public int getMaxAge()
返回以秒为单位指定的 cookie 的最大生存时间,默认情况下,-1 指示该 cookie 将保留到浏览器关闭为止。
public String getName()
返回cookie的名称,名称在创建后不得更改。
public void setPath(String uri)
指定客户端应该返回 cookie 的路径。
cookie 对于指定目录中的所有页面及该目录子目录中的所有页面都是可见的。cookie 的路径必须包括设置 cookie 的 servlet,例如 /catalog,它使 cookie 对于服务器上 /catalog 下的所有目录都是可见的。
public String getPath()
返回浏览器将此 cookie 返回到的服务器上的路径。cookie 对于服务器上的所有子路径都是可见的。
public void setSecure(boolean flag)
指示浏览器是否只能使用安全协议(如 HTTPS 或 SSL)发送 cookie。
默认值为false。
public boolean getSecure()
如果浏览器仅通过安全协议发送 cookie,则返回 true
;如果浏览器可以使用任何协议发送 cookie,则返回 false
。
public void setValue(String newValue)
在创建 cookie 之后将新值分配给 cookie。如果使用二进制值,则可能需要使用 BASE64 编码。
对于 Version 0 cookie,值不应包含空格、方括号、圆括号、等号、逗号、双引号、斜杠、问号、at 符号、冒号和分号。空值在所有浏览器上的行为不一定相同。
public String getValue()
返回cookie的值。
public void setVersion(int v)
设置此 cookie 遵守的 cookie 协议版本。版本 0 遵守原始 Netscape cookie 规范。版本 1 遵守 RFC 2109。
因为 RFC 2109 仍然有点新,所以根据经验可考虑使用版本 1;但在生产网站上不要使用它。
v:如果 cookie 应该遵守原始 Netscape 规范,则该参数为 0;如果 cookie 应该遵守 RFC 2109,则该参数为 1。
public int getVersion()
返回此 cookie 遵守的协议版本。版本 1 遵守 RFC 2109,版本 0 遵守根据 Netscape 起草的原始 cookie 规范。浏览器提供的 cookie 使用并标识该浏览器的 cookie 版本。
如果 cookie 遵守原始 Netscape 规范,则返回 0;如果 cookie 遵守 RFC 2109,则返回 1。