ServletAPI详解(一)

servletservletservlet

Servlet运行在服务器端Servlet容器中。

Servlet接口详解

要编写一个Servlet,需要实现javax.servlet.Servlet接口,该接口定义了如下5个方法。

public void init(ServletConfig config) throws ServletException

public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException

public void destroy()

public ServletConfig getServletConfig()

public java.lang.String getServletInfo()
 下面介绍一下这5个方法的作用。 
  

init():在Servlet实例化之后,Servlet容器会调用init()方法,来初始化该对象,主要是为了让Servlet对象在处理客户请求前可以完成一些初始化的工作,例如,建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只能被调用一次。init()方法有一个类型为ServletConfig的参数,Servlet容器通过这个参数向Servlet传递配置信息。Servlet使用ServletConfig对象从Web应用程序的配置信息中获取以名/值对形式提供的初始化参数。另外,在Servlet中,还可以通过ServletConfig对象获取描述Servlet运行环境的ServletContext对象,使用该对象,Servlet可以和它的Servlet容器进行通信。

service():容器调用service()方法来处理客户端的请求。要注意的是,在service()方法被容器调用之前,必须确保init()方法正确完成。容器会构造一个表示客户端请求信息的请求对象(类型为ServletRequest)和一个用于对客户端进行响应的响应对象(类型为ServletResponse)作为参数传递给service()方法。在service()方法中,Servlet对象通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。

destroy():当容器检测到一个Servlet对象应该从服务中被移除的时候,容器会调用该对象的destroy()方法,以便让Servlet对象可以释放它所使用的资源,保存数据到持久存储设备中,例如,将内存中的数据保存到数据库中,关闭数据库的连接等。当需要释放内存或者容器关闭时,容器就会调用Servlet对象的destroy()方法。在Servlet容器调用destroy()方法前,如果还有其他的线程正在service()方法中执行,容器会等待这些线程执行完毕或等待服务器设定的超时值到达。一旦Servlet对象的destroy()方法被调用,容器不会再把其他的请求发送给该对象。如果需要该Servlet再次为客户端服务,容器将会重新产生一个Servlet对象来处理客户端的请求。在destroy()方法调用之后,容器会释放这个Servlet对象,在随后的时间内,该对象会被Java的垃圾收集器所回收。

getServletConfig():该方法返回容器调用init()方法时传递给Servlet对象的ServletConfig对象,ServletConfig对象包含了Servlet的初始化参数。

getServletInfo():返回一个String类型的字符串,其中包括了关于Servlet的信息,例如,作者、版本和版权。该方法返回的应该是纯文本字符串,而不是任何类型的标记(HTML、XML等)。

Servlet API包含在J2EE中,如果要查看Servlet API的文档,你需要下载J2EE(从J2EE 1.5开始改名为Java EE 5)SDK,Java EE 5 SDK的下载地址如下:http://java.sun.com/javaee/downloads/?intcmp=1282。

ServletRequest和ServletResponse详解

Servlet由Servlet容器来管理,当客户请求到来时,容器创建一个ServletRequest对象,封装请求数据,同时创建一个ServletResponse对象,封装响应数据。这两个对象将被容器作为service()方法的参数传递给Servlet,Servlet利用ServletRequest对象获取客户端发来的请求数据,利用ServletResponse对象发送响应数据。

ServletRequest和ServletResponse接口都在javax.servlet包中定义,我们首先看一下ServletRequest接口中的常用方法。

public java.lang.Object getAttribute(java.lang.String name)
返回以name为名字的属性的值。如果该属性不存在,这个方法将返回null。
public java.util.Enumeration getAttributeNames()
返回请求中所有可用的属性的名字。如果在请求中没有属性,这个方法将返回一个空的枚举集合。
public void removeAttribute(java.lang.String name)
移除请求中名字为name的属性。
public void setAttribute(java.lang.String name, java.lang.Object o)
在请求中保存名字为name的属性。如果第二个参数o为null,那么相当于调用removeAttribute(name)。
public java.lang.String getCharacterEncoding()
返回请求正文使用的字符编码的名字。如果请求没有指定字符编码,这个方法将返回null。
public int getContentLength()
以字节为单位,返回请求正文的长度。如果长度不可知,这个方法将返回-1。
public java.lang.String getContentType()
返回请求正文的MIME类型。如果类型不可知,这个方法将返回null。
public ServletInputStream getInputStream()
返回一个输入流,使用该输入流以二进制方式读取请求正文的内容。javax.servlet.ServletInputStream是一个抽象类,继承自java.io.InputStream。
public java.lang.String getLocalAddr()
返回接收到请求的网络接口的IP地址,这个方法是在Servlet 2.4规范中新增的方法。
 public java.lang.String getLocalName()
返回接收到请求的IP接口的主机名,这个方法是在Servlet 2.4规范中新增的方法。
public int getLocalPort()
返回接收到请求的网络接口的IP端口号,这个方法是在Servlet 2.4规范中新增的方法。
public java.lang.String getParameter(java.lang.String name)
返回请求中name参数的值。如果name参数有多个值,那么这个方法将返回值列表中的第一个值。如果在请求中没有找到这个参数,这个方法将返回null。
 public java.util.Enumeration getParameterNames()
返回请求中包含的所有的参数的名字。如果请求中没有参数,这个方法将返回一个空的枚举集合。
public java.lang.String[] getParameterValues(java.lang.String name)
返回请求中name参数所有的值。如果这个参数在请求中并不存在,这个方法将返回null。
 public java.lang.String getProtocol()   

返回请求使用的协议的名字和版本,例如:HTTP/1.1。

 public java.io.BufferedReader getReader() throws java.io.IOException
返回BufferedReader对象,以字符数据方式读取请求正文。
 public java.lang.String getRemoteAddr()
返回发送请求的客户端或者最后一个代理服务器的IP地址。
public java.lang.String getRemoteHost()
返回发送请求的客户端或者最后一个代理服务器的完整限定名。
public int getRemotePort()
返回发送请求的客户端或者最后一个代理服务器的IP源端口,这个方法是在Servlet 2.4规范中新增的方法。
public RequestDispatcher getRequestDispatcher(java.lang.String path)
返回RequestDispatcher对象,作为path所定位的资源的封装。
public java.lang.String getServerName()
返回请求发送到的服务器的主机名。
public int getServerPort()  
返回请求发送到的服务器的端口号。
public void setCharacterEncoding (java.lang.String env)
throws java.io.Unsupported EncodingException
覆盖在请求正文中所使用的字符编码的名字。

下面我们看一下ServletResponse接口中的常用方法:

public void flushBuffer() throws java.io.IOException
强制把任何在缓存中的内容发送到客户端。
public int getBufferSize()
返回实际用于响应的缓存的大小。如果没有使用缓存,这个方法将返回0。
public java.lang.String getCharacterEncoding()  
返回在响应中发送的正文所使用的字符编码(MIME字符集)。
public java.lang.String getContentType()
返回在响应中发送的正文所使用的MIME类型。
public ServletOutputStream getOutputStream() 
throws java.io.IOException
返回ServletOutputStream对象,用于在响应中写入二进制数据。javax.servlet. ServletOutputStream是一个抽象类,继承自java.io.OutputStream。
public java.io.PrintWriter getWriter() throws java.io.IOException
返回PrintWriter对象,用于发送字符文本到客户端。PrintWriter对象使用getCharacterEncoding()方法返回的字符编码。如果没有指定响应的字符编码方式,默认将使用ISO-8859-1。
public boolean isCommitted()
返回一个布尔值,指示是否已经提交了响应。
public void reset()
清除在缓存中的任何数据,包括状态代码和消息报头。如果响应已经被提交,这个方法将抛出IllegalStateException异常。
public void resetBuffer()
清除在缓存中的响应内容,保留状态代码和消息报头。如果响应已经被提交,这个方法将抛出IllegalStateException异常。
public void setBufferSize(int size)
设置响应正文的缓存大小。Servlet容器将使用一个缓存,其大小至少是请求的尺寸大小。这个方法必须在响应正文被写入之前调用,如果内容已经被写入或者响应对象已经被提交,这个方法将抛出IllegalStateException异常。
public void setCharacterEncoding(java.lang.String charset)
设置发送到客户端的响应的字符编码,例如,UTF-8。
public void setContentLength(int len)
对于HTTP Servlet,在响应中,设置内容正文的长度,这个方法设置HTTP Content-Length实体报头。
 public void setContentType(java.lang.String type)
设置要发送到客户端的响应的内容类型,此时响应应该还没有提交。给出的内容类型可以包括字符编码说明,例如:text/html;charset=UTF-8。如果这个方法在getWriter()方法被调用之前调用,那么响应的字符编码将仅从给出的内容类型中设置。这个方法如果在getWriter()方法被调用之后或者在响应被提交之后调用,将不会设置响应的字符编码。在使用HTTP协议的情况中,这个方法设置Content-Type实体报头。

细心的读者可能注意到了,在上面所列举的方法中,有的可能会抛出IllegalStateException异常,然而在函数声明时,却没有声明抛出此异常,这是为什么呢?java.lang.IllegalStateException是java.lang.RuntimeException的子类。我们知道对于RuntimeException及其派生的异常是由Java运行系统自动抛出并自动处理,不需要我们去捕获,所以也就不需要在函数声明时声明抛出异常了。

上面所列的方法,读者不需要将它们都记下来,只要大致看一下,有一个初步的印象就可以了。关键是要理解请求和响应对象能够提供哪些方法,读者可以从客户端与服务器端的交互过程来思考,想想哪些信息是需要获取到的。在Servlet中,用请求对象表示的是什么信息,用响应对象来做什么,哪些信息应该是从请求对象中得到,哪些信息应该是用响应对象来设置。只要理解了交互的过程及请求对象和响应对象所起的作用,当我们需要用到某个方法时,就可以在API文档中进行查找,用的次数多了,这些方法自然也就记住了。

你可能感兴趣的:(J2EE)