Servlet
技术
1
、Servlet
简介
Java Servlet
是与平台无关的服务器端组件,它可以运行在
Servlet
容器中.
Servlet
容器负责
Servlet
和客户的通信以及调用
Servlet
的方法,
Servlet
和客户的通信采用"请求/响应"的模式
2
、
Servlet API
Servlet
的框架是由两个
Java
包组成的:
javax.servlet
和
javax.servlet.http
。在
javax.servlet
包中定义了所有的
Servlet
类都必须实现或扩展的通用接口和类。在
javax.servlet.http
包中定义了采用
HTTP
协议通信的
HttpServlet
类
Servlet
的框架的核心是
javax.servlet.Servlet
接口,所有的
Servlet
都必须实现这一接口。在
Servlet
接口中定义了
5
个方法,其中有
3
个方法代表了
Servlet
的生命周期
init
方法,负责初始化
Servlet
对象
service
方法,负责响应客户的请求
destroy
方法,当
Servlet
对象退出生命周期时,负责释放占用的资源
当用户开发自己的Servlet类时,Servlet类必须扩展以下两个类中的一个
1
、扩展
GenericServlet
类:
如果
Servlet
扩展了
GenericServlet
类,则必须实现
service
方法,因为
GenericServlet
类中的
service
方法被声明为抽象方法,该方法的声明形式如下:
public abstract void service(ServletRequest request,ServletResponse response)
throws ServletException,IOException
service
方法有两个参数:
ServletRequest
和
ServletResponse
。
Servlet
容器将客户的请求信息封装在
ServletRequest
对象中,传给
service
方法;
service
方法将响应客户的结果通过
ServletResponse
传给客户
2
、扩展
HttpServlet
类:
如果
Servlet
类扩展了
HttpServlet
类,通常不必实现
service
方法,因为
HttpServlet
类已经实现了
service
方法,该方法的声明形式如下:
protected void service(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
在
HttpServlet
的
service
方法中,首先从
HttpServletRequest
对象中获取
HTTP
请求方式的信息,然后再根据请求方式调用相应的方法。
HTTP
的请求放式包括
DELETE
、
GET
、
OPTIONS
、
POST
、
PUT
和
TRACE
,在
HttpServlet
类中分别提供了相应的方法,它们是
doDelelte(),doGet(),doOptions(),doPost(),doPut()
和
doTrace()
在HttpServlet的service方法中,也有两个参数:HttpServletRequest和HttpServletResponse,这两个类分别扩展了
ServletRequest
和
ServletResponse
接口
ServletRequest
接口:
ServletRequest
接口封装了客户请求信息,如客户请求方式、参数名和参数值、客户端正在使用的协议,以及发出客户请求的远程主机信息等。
ServletRequest
接口还为
Servlet
提供了直接以二进制数方式读取客户请求数据流的
ServletInputStream
。
ServletRequest
的子类可以为
Servlet
提供更多的与特定协议相关的数据
ServletRequest
接口:
ServletRequest
接口为
Servlet
提供了返回响应结果的方法。它允许
Servlet
设置返回数据的长度和
MIME
类型,并且提供了输出流
ServletOutputStream
。
ServletResponse
子类可以提供更多和特定协议相关的方法
3
、
Servlet
的生命周期
Servlet
的生命周期开始于被装载到
Servlet
容器中,结束于被终止或重新装入时。
Servlet
的生命周期可以分为
3
个阶段:初始化阶段、响应客户请求阶段和终止阶段。在
javax.servlet.Servlet
接口中定义了
3
个方法
init()
、
service()
和
destroy()
,它们将分别在
Servlet
的不同阶段被调用
1
、初始化阶段
在下列情形下
Servlet
容器自动装载
Servlet
:
Servlet
容器启动时自动装载某些
Servlet
在
Servlet
容器启动后,客户首次向
Servlet
发出请求
Servlet
的类文件被更新后,重新装载
Servlet
Servlet
被装载后,
Servlet
容器创建一个
Servlet
实例并且调用
Servlet
的
init()
方法进行初始化。在
Servlet
的整个生命周期中,
init
方法只会被调用一次。
init
方法有两种重载形式:
public void init(ServletConfig config) throws ServletException;
public void init() throws ServletException;
在Servlet的初始化阶段,Servlet容器会为Servlet创建一个ServletConfig对象,用来存放Servlet的初始化配置信息,如Servlet的初始参数。如果Servlet类覆盖了第一种带参数的init方法,应该先调用super.init(config)方法确保参数config引用ServletConfig对象;如果覆盖的是第二种不带参数的init方法,可以不调用super.init()方法,如果要在init方法中访问ServletConfig对象,可以调用Servlet类的getServletConfig()方法
2
、响应客户请求阶段
对于到达
Servlet
容器的客户请求,
Servlet
容器创建特定于这个请求的
ServletRequest
对象和
ServletResponse
对象,然后调用
Servlet
的
service
方法。
service
方法从
ServletRequest
对象获得客户请求信息并处理该请求,通过
ServletResponse
对象向客户返回响应结果
3
、终止阶段
当
Web
应用被终止,或
Servlet
容器终止运行,或
Servlet
容器重新装载
Servlet
的新实例时,
Servlet
容器会先调用
Servlet
的
destroy
方法。在destroy方法中,可以释放Servlet所占用的资源
4
、
HTTP
与
HttpServlet
HTTP是一种基于请求/响应模式的协议。客户端发送一个请求,服务器返回对该请求的响应。HTTP使用可靠的TCP连接,默认端口是80
在HTTP中,客户端/服务器之间的会话总是由客户端通过建立连接和发送HTTP请求的方式初始化,服务器不会主动联系客户端或要求与客户端建立连接。在会话开始后,浏览器或服务器都可以随时中断连接,例如,在浏览网页时可以随时点击“停止”按钮中断当前的文件下载过程,关闭与Web服务器的HTTP连接
4.1
、
HTTP
请求
HTTP请求由3个部分构成,分别是:
请求方法URI协议/版本
请求头
请求正文
例如:
GET /sample.jsp HTTP/1.1
Accept:image/gif.image,image/jpeg.*.*
Accept-Lauguage:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozilla/4.0
Accept-Encoding:gzip,deflate
username=weiqin&password=1234
1、请求方法URI协议/版本
GET /sample.jsp HTTP/1.1
根据HTTP标准,HTTP请求可以使用多种请求方法。例如,HTTP 1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TRACE
URI完整的指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头
协议版本声明了通信过程中使用的HTTP的版本
2、请求头
请求头包含许多有关客户端环境和请求正文的有用信息
3、请求正文
请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来是请求的正文。请求正文中可以包含客户提交的查询字符串信息
4.2
、
HTTP
响应
与HTTP请求类似,HTTP响应也由3个部分构成,分别是:
协议 状态代码 描述
响应头
响应正文
HTTP/1.1 200 OK
Server:ApacheTomcat/5.0
Date:Mon,6 Oct 2003 13:13:13 GMT
Content-Type:text/html
Last-Modified: Mon,6 Oct 2003 13:03:13 GMT
Content-Length:112
<html>
<head>
<title>HTTP响应示例</title>
</head>
<body>
Hello HTTP!
</body>
</html>
1、协议 状态代码 描述
HTTP响应的第一行类似于HTTP请求的第一行,它表示通信所使用的协议是HTTP 1.1,服务器已经成功地处理了客户端发出的请求
2、响应头
响应头也和请求头一样包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等
3、响应正文
响应正文就是服务器返回的HTML页面,响应头和正文之间也必须用空行分隔
4.3
、
HttpServlet
的功能
在了解了具体的HTTP协议规范后,可以更好地理解HttpServlet的作用。
它能够根据客户发出的
HTTP
请求,生成相应的
HTTP
响应结果。
HttpServlet
首先必须读取
HTTP
请求的内容。
Servlet
容器负责创建
HttpServletRequest
对象,并把
HTTP
请求信息封装到
HttpServletRequest
对象中,这大大简化了
HttpServlet
解析请求数据的工作量。如果没有
HttpServletRequest
,
HttpServlet
只能直接处理
Web
客户发出的原始的字符串数据,有了
HttpServletRequest
后,只要调用
HttpServletRequest
的相关方法,就可以方便地读取
HTTP
请求中任何一部分信息
HttpServletRequest中读取HTTP请求信息的常用方法:
getCookies():返回HTTP请求的Cookies
getRequestURI():返回HTTP请求URI
getQueryString():返回HTTP请求数据中的查询字符串
getMethod():返回HTTP请求方法
Servlet
容器还向
HttpServlet
提供了
HttpServletResponse
对象,
HttpServlet
可以通过它来生成
HTTP
响应的每一部分内容
HttpServletResponse提供的生成响应数据Header的方法:
addCookie(Coolie cookie):向HTTP响应中加入Cookie
setHeader(String name,String value):设置HTTP响应的Header
4.4
、
Servlet
容器响应
Web
客户请求的步骤:
1:Web客户向Servlet容器发出HTTP请求;
2:Servlet容器解析Web客户的HTTP请求;
3:Servlet容器创建一个HttpRequset对象,在这个对象中封装了HTTP请求信息;
4:Servlet容器创建一个HttpResponse对象;
5:Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象;
6:HttpServlet调用HttpResponse的有关方法,获取HTTP请求信息
7:HttpServlet调用HttpResponse的有关方法,生成响应数据
8:Servlet容器把HttpServlet的响应结果传给Web客户
5
、创建
HttpServlet
的步骤
创建用户自己的HttpServlet类,通常涉及下列4个步骤:
1、扩展HttpServlet抽象类
2、覆盖HttpServlet的部分方法,如覆盖doGet或doPost方法
3、获取HTTP请求信息,例如通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串。无论是HTML表单数据还是URL上的查询字符串,在HttpServletRequest对象中都以参数名/参数值的形式存放
4、生成HTTP响应结果。通过HttpServletResponse对象可以生成响应结果。HttpServletResponse对象有一个getWriter()方法,该方法返回一个PrintWriter对象。使用PrinterWriter的print()或println()方法可以向客户端发送字符串数据流
6
、
ServletContext
和
Web
应用的关系
Servlet容器在启动时会加载Web应用,并为每个Web应用创建惟一的ServletContext对象。可以把ServletContext看成是一个Web应用的服务器端组件的共享内存
在ServletContext中设置的属性,在Web应用运行期间一直存在,当Web应用被关闭时,Servlet容器会销毁ServletContext对象,存储在ServletContext对象中的属性自然也不复存在。不同应用的ServletContext各自独立