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文档中进行查找,用的次数多了,这些方法自然也就记住了。
本文详细介绍了Servlet接口中的关键方法,包括init、service、destroy等,并解释了它们在Servlet生命周期中的作用。此外,还深入探讨了ServletRequest和ServletResponse接口,阐述了如何通过这两个接口处理客户端请求和响应。

1139

被折叠的 条评论
为什么被折叠?



