servlet概述以及API中文版及学习笔记综合.docx
《servlet概述以及API中文版及学习笔记综合.docx》由会员分享,可在线阅读,更多相关《servlet概述以及API中文版及学习笔记综合.docx(35页珍藏版)》请在冰豆网上搜索。
servlet概述以及API中文版及学习笔记综合
servlet概述
Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面。
它担当Web浏览器或其他HTTP客户程序发出请求,与HTTP服务器上的数据库或应用程序之间的中间层。
Servlet是位于Web服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。
servlet由来
servlet是在服务器上运行的小程序。
这个词是在Javaapplet的环境中创造的,Javaapplet是一种当作单独文件跟网页一起发送的小程序,它通常用于在客户端运行,结果得到为用户进行运算或者根据用户互作用定位图形等服务。
服务器上需要一些程序,常常是根据用户输入访问数据库的程序。
这些通常是使用公共网关接口(CGI)应用程序完成的。
然而,在服务器上运行Java,这种程序可使用Java编程语言实现。
在通信量大的服务器上,Javaservlet的优点在于它们的执行速度更快于CGI程序。
各个用户请求被激活成单个程序中的一个线程,而创建单独的程序,这意味着各个请求的系统开销比较小。
JavaServlet与Applet的比较
相似之处:
*它们不是独立的应用程序,没有main()方法。
*它们不是由用户或程序员调用,而是由另外一个应用程序(容器)调用。
*它们都有一个生存周期,包含init()和destroy()方法。
不同之处:
*Applet具有很好的图形界面(AWT),与浏览器一起,在客户端运行。
*Servlet则没有图形界面,运行在服务器端。
与传统CGI的比较
JavaServlet与CGI(CommonGatewayInterface)的比较:
与传统的CGI和许多其他类似CGI的技术相比,JavaServlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资。
在未来的技术发展过程中,Servlet有可能彻底取代CGI。
在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间。
而在Servlet中,每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程)。
在传统CGI中,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中重复装载了N次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码。
在性能优化方面,Servlet也比CGI有着更多的选择。
*方便
Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。
*功能强大
在Servlet中,许多使用传统CGI程序很难完成的任务都可以轻松地完成。
例如,Servlet能够直接和Web服务器交互,而普通的CGI程序不能。
Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。
*可移植性好
Servlet用Java编写,ServletAPI具有完善的标准。
因此,为IPlanetEnterpriseServer写的Servlet无需任何实质上的改动即可移植到Apache、MicrosoftIIS或者WebStar。
几乎所有的主流服务器都直接或通过插件支持Servlet。
*节省投资
不仅有许多廉价甚至免费的Web服务器可供个人或小规模网站使用,而且对于现有的服务器,如果它不支持Servlet的话,要加上这部分功能也往往是免费的(或只需要极少的投资)。
JavaServlet与JSP的比较
JavaServerPages(JSP)是一种实现普通静态HTML和动态HTML混合编码的技术,JSP并没有增加任何本质上不能用Servlet实现的功能。
但是,在JSP中编写静态HTML更加方便,不必再用println语句来输出每一行HTML代码。
更重要的是,借助内容和外观的分离,页面制作中不同性质的任务可以方便地分开:
比如,由页面设计者进行HTML设计,同时留出供Servlet程序员插入动态内容的空间。
HTTPServlet应用编程接口
HTTPServlet使用一个HTML表格来发送和接收数据。
要创建一个HTTPServlet,请扩展HttpServlet类,该类是用专门的方法来处理HTML表格的GenericServlet的一个子类。
HTML表单是由
标记定义的。
表单中典型地包含输入字段(如文本输入字段、复选框、单选按钮和选择列表)和用于提交数据的按钮。
当提交信息时,它们还指定服务器应执行哪一个Servlet(或其它的程序)。
HttpServlet类包含init()、destroy()、service()等方法。
其中init()和destroy()方法是继承的。
(1)init()方法
在Servlet的生命期中,仅执行一次init()方法。
它是在服务器装入Servlet时执行的。
可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。
无论有多少客户机访问Servlet,都不会重复执行init()。
缺省的init()方法通常是符合要求的,但也可以用定制init()方法来覆盖它,典型的是管理服务器端资源。
例如,可能编写一个定制init()来只用于一次装入GIF图像,改进Servlet返回GIF图像和含有多个客户机请求的性能。
另一个示例是初始化数据库连接。
缺省的init()方法设置了Servlet的初始化参数,并用它的ServletConfig对象参数来启动配置,因此所有覆盖init()方法的Servlet应调用super.init()以确保仍然执行这些任务。
在调用service()方法之前,应确保已完成了init()方法。
(2)service()方法
service()方法是Servlet的核心。
每当一个客户请求一个HttpServlet对象,该对象的service()方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。
在HttpServlet中已存在service()方法。
缺省的服务功能是调用与HTTP请求的方法相应的do功能。
例如,如果HTTP请求方法为GET,则缺省情况下就调用doGet()。
Servlet应该为Servlet支持的HTTP方法覆盖do功能。
因为HttpServlet.service()方法会检查请求方法是否调用了适当的处理方法,不必要覆盖service()方法。
只需覆盖相应的do方法就可以了。
Servlet的响应可以是下列几种类型:
一个输出流,浏览器根据它的内容类型(如text/HTML)进行解释。
一个HTTP错误响应,重定向到另一个URL、servlet、JSP。
(3)doGet()方法
当一个客户通过HTML表单发出一个HTTPGET请求或直接请求一个URL时,doGet()方法被调用。
与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。
当不会修改服务器端的数据时,应该使用doGet()方法。
(4)doPost()方法
当一个客户通过HTML表单发出一个HTTPPOST请求时,doPost()方法被调用。
与POST请求相关的参数作为一个单独的HTTP请求从浏览器发送到服务器。
当需要修改服务器端的数据时,应该使用doPost()方法。
(5)destroy()方法
destroy()方法仅执行一次,即在服务器停止且卸装Servlet时执行该方法。
典型的,将Servlet作为服务器进程的一部分来关闭。
缺省的destroy()方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。
例如,如果Servlet在运行时会累计统计数据,则可以编写一个destroy()方法,该方法用于在未装入Servlet时将统计数字保存在文件中。
另一个示例是关闭数据库连接。
当服务器卸装Servlet时,将在所有service()方法调用完成后,或在指定的时间间隔过后调用destroy()方法。
一个Servlet在运行service()方法时可能会产生其它的线程,因此请确认在调用destroy()方法时,这些线程已终止或完成。
(6)GetServletConfig()方法
GetServletConfig()方法返回一个ServletConfig对象,该对象用来返回初始化参数和ServletContext。
ServletContext接口提供有关servlet的环境信息。
(7)GetServletInfo()方法
GetServletInfo()方法是一个可选的方法,它提供有关servlet的信息,如作者、版本、版权。
当服务器调用sevlet的Service()、doGet()和doPost()这三个方法时,均需要"请求"和"响应"对象作为参数。
"请求"对象提供有关请求的信息,而"响应"对象提供了一个将响应信息返回给浏览器的一个通信途径。
javax.servlet软件包中的相关类为ServletResponse和ServletRequest,而javax.servlet.http软件包中的相关类为HttpServletRequest和HttpServletResponse。
Servlet通过这些对象与服务器通信并最终与客户机通信。
Servlet能通过调用"请求"对象的方法获知客户机环境,服务器环境的信息和所有由客户机提供的信息。
Servlet可以调用"响应"对象的方法发送响应,该响应是准备发回客户机的。
ServletAPI中文版
基本类和接口
一、javax.servlet.Servlet接口
servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理的方法集。
Servlet接口的基本目标是提供生命期方法init()、service()和destroy()方法。
servlet接口中的方法
voidinit(ServletConfitconfig)throwsServletException在servlet被载入后和实施服务前由servlet引擎进行?
次性调用。
如果init()产生溢出UnavailableException,则servle退出服务。
ServletConfiggetServletConfig()返回传递到servlet的init()方法的ServletConfig对象
voidservice(ServletRequestrequest,ServletResponseresponse)throwsServletException,IOException处理request对象中描述的请求,使用response对象返回请求结果
StringgetServletInfo()返回描述servlet的一个字符串
voiddestory()当servlet将要卸载时由servlet引擎调用
二、javax.servlet.GenericServlet类(协议无关版本)
GenericServlet是一种与协议无关的servlet,是一种跟本不对请求提供服务的servlet,而是简单地从init()方法启动后台线程并在destory()中杀死。
它可以用于模拟操作系统的端口监控进程。
servletAPI提供了Servlet接口的直接实现,称为GenericServlet。
此类提供除了service()方法外所有接口中方法的缺省实现。
这意味着通过简单地扩展GenericServlte可以编写一个基本的servlet。
除了Servlet接口外,GenericServlet也实现了ServletConfig接口,处理初始化参数和servlet上下文,提供对授权传递到init()方法中的ServletConfig对象的方法。
GenericServlet类中的方法
voiddestory()编飞组成单词“destory”的一个注册入口
StringgetInitParameter(Stringname)返回具有指定名称的初始化参数值。
通过凋用config.getInitParameter(name)实现。
EnumerationgetInitParameterNames()返回此serv]et已编码的所有初始化参数的?
个枚举类型值。
调用config.getInitParameterNames()获得列表。
如果未提供初始化参数,则返回?
个空的枚举类型值(但不是null)
ServletConfiggetServletConfig()返回传递到init()方法的ServletConfig对象
ServletContextgetServletContext()返回在config对象中引用的ServletContext
StringgetServletInfo()返回空字符串
voidinit(ServletConfigconfig)throwsServletException在一实例变量中保存config对象。
编写组成单词“init”的注册入口,然后调用方法init()
voidinit()throwsServletException可以被跳过以处理servlet初始化.在config对象被保存后init(ServletConfigconfig)的结尾处自动被调用.servlet作者经常会忘记调用super.init(config)
voidlog(Stringmsg)编写注册servlet的入口.为此调用servlet上下文的log()方法.servlet的名字被加到消息文本的开头。
voidlog(Stringmsg,Throwablet)编写一个入口和servlet注册的栈轨迹。
此方法也是ServletContext中相应方法的一个副本。
abstractvoidservice(Requestrequest,Responseresponse)throwsServletException,IOException由servlet引擎调用为请求对象描述的请求提供服务。
这是GenericServlet中唯一的抽象方法。
因此它也是唯一必须被子类所覆盖的方法。
StringgetServletName()返回在Web应用发布描述器(web.xml)中指定的servlet的名字。
三、javax.servlet.http.HttpServlet类(HTTP版本)
虽然servletAPI允许扩展到其它协议,但最终所有的servlet均在Web环境下实施操作,只有几种servlet直接扩展了GenericServlet。
对servlet更一般的是扩展其HTTP子类HttpServlet。
HttpServlet类通过调用指定到HTTP请求方法的方法实现service(),亦即对DELETE、HEAD、GET、OPTIONS、POST、PUT和TRACE,分别调用doDelete()、doHead()、doGet()、doOptions()、doPost()、doPut()和doTrace()方法,将请求和响应对象置入其HTTP指定子类。
HttpServlet类中的方法
VoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException由servlet引擎调用用处理一个HTTPGET请求。
输入参数、HTTP头标和输入流可从request对象、response头标和response对象的输出流中获得。
VoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException由servlet引擎调用用处理一个HTTPPOST请求。
输入参数、HTTP头标和输入流可从request对象、response头标和response对象的输出流中获得。
VoiddoPut(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException由servlet引擎调用用处理一个HTTPPUT请求。
本方法中请求URI指出被载入的文件位置。
VoiddoDelete(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException由servlet引擎调用用处理一个HTTPDELETE请求。
请求URI指出资源被删除。
VoiddoOptions(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException由servlet引擎调用用处理一个HTTPOPTIONS请求。
返回一个Allow响应头标表明此servlet支持的HTTP方法。
一个servlet不需要覆盖此方法,因为HttpServlet方法已经实现规范所需的功能。
VoiddoTrace(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException由servlet引擎调用用处理一个HTTPTRACE请求。
使得请求头标被反馈成响应关标。
一个servlet不需要覆盖此方法,因为HttpServlet方法已经实现HTTP规范所需的功能。
Voidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOExceptionService(Requestrequest,Responseresponse)调用的一个立即方法,带有指定HTTP请求和响应。
此方法实际上将请求导向doGet()、doPost()等等。
不应该覆盖此方法。
Voidservice(Requestrequest,Responseresponse)throwsServletException,IOException将请求和响应对象置入其指定的HTTP子类,并调用指定HTTP的service()方法。
四、javax.servlet.ServletRequest类(协议无关版本)
ServletRequest接口封装了客户端请求的细节。
它与协议无关,并有一个指定HTTP的子接口。
ServletRequest主要处理:
1.找到客户端的主机名和IP地址
2.检索请求参数
3.取得和设置属性
4.取得输入和输出流
ServletRequest类中的方法
ObjectgetAttribute(Stringname)返回具有指定名字的请求属性,如果不存在则返回null。
属性可由servlet引擎设置或使用setAttribute()显式加入。
EnumerationgetAttributeName()返回请求中所有属性名的枚举。
如果不存在属性,则返回一个空的枚举。
StringgetCharacteEncoding()返回请求所用的字符编码。
IntgetContentLength()指定输入流的长度,如果未知则返回-1。
ServletInputStreamgetInputStream()throwsIOException返回与请求相关的(二进制)输入流。
可以调用getInputStream()或getReader()方法之一。
StringgetParameter(Stringname)返回指定输入参数,如果不存在,返回null。
EnumerationgetParameterName()返回请求中所有参数名的一个可能为空的枚举。
String[]getParameterValues(Stringname)返回指定输入参数名的取值数组,如果取值不存在则返回null。
它在参数具有多个取值的情况下十分有用。
StringgetProtocol()返回请求使用协议的名称和版本。
StringgetScheme()返回请求URI的子串,但不包含第一个冒号前的内容。
StringgetServerName()返回处理请求的服务器的主机名。
StringgetServerPort()返回接收主机正在侦听的端口号。
BufferedReadergetReader()throwsIOException返回与请求相关输入数据的一个字符解读器。
此方法与getInputStream()只可分别调用,不能同时使用。
StringgetRemoteAddr()返回客户端主机的数字型IP地址。
StringgetRemoteHost()如果知道,返回客户端主机名。
voidsetAttribute(Stringname,Objectobj)以指定名称保存请求中指定对象的引用。
voidremoveAttribute(Stringname)从请求中删除指定属性
LocalegetLocale()如果已知,返回客户端的第一现场或者为null。
EnumerationgetLocales()如果已知,返回客户端的第一现场的一个枚举,否则返回服务器第一现场。
booleanisSecure()如果请求使用了如HTTPS安全隧道,返回true
RequestDispatchergetRequestDispatcher(Stringname)返回指定源名称的RequsetDispatcher对象。
五、javax.servlet.http.HttpServletRequest接口(HTTP版本)
HttpServletRequest类主要处理:
1.读取和写入HTTP头标
2.取得和设置cookies
3.取得路径信息
4.标识HTTP会话。
HttpServletRequest接口中