全套Servlet培训教程课件_第1页
全套Servlet培训教程课件_第2页
全套Servlet培训教程课件_第3页
全套Servlet培训教程课件_第4页
全套Servlet培训教程课件_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于Java的Web编程技术第六章Servlet基于Java的Web编程技术第六章Servlet1上章回顾了解代理事件模型在JavaBean中访问数据库上章回顾了解代理事件模型2我们的目标了解Servlet体系结构掌握请求和响应我们的目标了解Servlet体系结构3简介-1Java编程中一个最激动人心的最新趋势是服务器端Java应用程序的兴起。Java这种面向对象的通用编程语言最初旨在用于小型嵌入设备,而后被认为是一种用于以Applet形式开发客户端Web内容的语言,如今Java已是一种非常适合服务器端开发的语言,商家迅速认识到Java在服务器上的潜力。简介-1Java编程中一个最激动人心的最新趋势是服务器端Ja4简介-2Applet是以Java语言开发的程序,它运行在客户端机器的浏览器上,这些Applet不连接到服务器。在很多情况下需要访问服务器上的数据,而这无法通过Applet实现。为了访问数据和执行服务器端的请求处理,必须使用另一个称为Servlet的应用程序。Servlet是以Java编程语言开发的服务器端程序,它运行在Web服务器中,由于Servlet在服务器内运行,所以这些程序可用于扩展Web服务器的功能。简介-2Applet是以Java语言开发的程序,它运行在客户5简介-3客户端Servlet数据库HTTP服务器Servlet体系结构简介-3客户端Servlet数据库HTTPServlet体系6简介-4使用Servlet的优点是:Servlet是持久性的。Servlet只须由Web服务器加载一次即可维护请求之间的服务。相比之下,每次向Web服务器发出请求时,Web服务器都必须加载和执行CGI脚本。Servlet运行速度快。由于只须加载一次,所以提供更佳的性能。由于是用Java编写,所以Servlet可跨平台。Servlet可扩展。Java的所有优点都可以在Servlet中体现。Servlet很安全。访问Servlet的唯一途径是通过服务器。Servlet可以与各种客户端一起使用。简介-4使用Servlet的优点是:76.1Servlet体系结构-1Servlet是服务器端程序,运行在Web服务器上对客户端的请求做出响应。Web服务器向Servlet发送请求,Servlet的输出结果返回至Web服务器,然后Web服务器将结果返回至Web浏览器,最后Web浏览器在屏幕上显示结果。该过程称为“请求-响应”模型。Web浏览器ServletWeb服务器HTTP请求HTTP响应6.1Servlet体系结构-1Servlet是服务器端程86.1Servlet体系结构-2Servlet使用以下两个包中的类和接口:javax.servletjavax.servlet.http包名以javax开头而不是java,表示ServletAPI是一个标准扩展。javax.servlet包包含了可以支持通用、跨协议的Servlet的类。javax.servlet.http包中的类增加了特定于HTTP的功能。每个Servlet都必须实现javax.servlet.Servlet接口。大部分Servlet通过扩展以下其中一个特殊类来实现这一接口:javax.servlet.GenericServlet或javax.servlet.http.HttpServlet。6.1Servlet体系结构-2Servlet使用以下两个96.1Servlet体系结构-3跨协议Servlet应该继承GenericServlet。HTTPServlet应继承HttpServlet,而HttpServlet本身是GenericServlet的子类,但添加了特定于HTTP的功能。Servlet接口只声明而不实现用于管理Servlet及其与客户端通信的方法。6.1Servlet体系结构-3跨协议Servlet应该继106.1Servlet体系结构-4ServletGenericServletHttpServlet自定义Servlet6.1Servlet体系结构-4ServletGeneri116.1.1常用接口和类-javax.servlet包其中最常用的接口如下:ServletRequest此接口用于将请求信息传送给Servlet。在收到请求时,Servlet引擎会将关键的请求信息封装在实现ServletRequest接口的对象中,传递至Servlet的service()方法。ServletResponse此接口提供服务器对客户端请求的响应的对象表示。Servlet引擎会将实现ServletResponse接口的对象传递给Servlet的service()方法。接着Servlet就可以使用此对象对客户端请求做出响应。RequestDispatcher此接口定义一个用于接收客户端的请求并将其发送至任何资源的对象。此接口还可用于封装Servlet。RequestDispatcher对象用作资源的封装器,通过路径或名称指定。资源可以是服务器上的Servlet、HTML文件或JSP文件。6.1.1常用接口和类-javax.servlet包其中126.1.1常用接口和类-javax.servlet包其中最常用的接口如下:Servlet这是每个Servlet都必须实现的接口,它定义必须由Servlet实现的方法。ServletConfig此接口定义Servlet配置对象。此对象由Servlet引擎用于将任何信息传递给Servlet,以便可初始化Servlet。ServletConfig接口的其他详情将在本章后面讨论。ServletContext此接口定义了一组方法,Servlet使用这些方法与Servlet引擎进行通信。SingleThreadModel此接口确保每次Servlet只能处理一个请求。6.1.1常用接口和类-javax.servlet包其中136.1.1常用接口和类-javax.servlet包其中最常用的类如下:GenericServlet这是大部分非HTTPServlet扩展的类。此类定义通知、跨协议的Servlet。ServletInputStream这是提供输入流用于读取来自客户端请求的二进制数据的类。此类包括方法readLine(),以此有效实现每次读取一行数据。ServletOutputStream此类的运行方式与ServletInputStream相同,但此类提供输出流用于将二进制数据发送给客户端。6.1.1常用接口和类-javax.servlet包其中146.1.1常用接口和类-javax.servlet包javax.servlet包还具有某些异常,它们是:ServletException此异常是常规异常,由Servlet在执行过程中遇到困难时抛出。UnavailableException此异常定义的是由Servlet抛出以表示Servlet永久或临时不可用的异常。6.1.1常用接口和类-javax.servlet包ja156.1.1常用接口和类-javax.servlet.http包javax.servlet.http包中可用的接口包括:HttpServletRequest此接口扩展ServletRequest接口并支持ServletResult接口的所有方法。HttpServletRequest定义用于描述HTTP请求的方法。实现HttpServletRequest接口的对象被传递给Servlet的service方法或任何do()方法。HttpServletResponse此接口扩展ServletResponse并支持ServletResponse接口的所有方法。HttpServletResponse接口提供服务器对客户端请求的响应的对象表示。Servlet可以使用实现Servlet引擎传递的HttpServletResponse接口的对象。此对象将被传递至Servlet的service()方法。HttpSession此接口提供一种方法,用于在对Web站点的请求或访问超过一个页面时标识用户。HttpSessionBindingListener在对象绑定至会话上或解除会话绑定时,此接口将通知对象。6.1.1常用接口和类-javax.servlet.ht166.1.1常用接口和类-javax.servlet.http包javax.servlet.http包中常用的类包括:CookieCookie类可以创建Cookie,Cookie存储了少量由Servlet发送至客户端的信息。客户端可在稍后要访问以前访问过的网页时使用已存储的信息。HttpServletHttpServlet类是最常用于扩展Servlet的类,这是因为很多Servlet应用程序都按HTTP协议运行。此类支持HTTP功能以及Servlet类的方法,它是个抽象类。它接收客户端的请求,并向客户端发送响应。HttpSessionBindingEvent在对象绑定至会话上或解除会话绑定时,此类会将对象传递给实现HttpSessionBindingListener接口的会话。6.1.1常用接口和类-javax.servlet.ht176.1.2Servlet生命周期-1Servlet是普通Java类,在需要时被创建,在不用时被破坏。Servlet的创建和破坏均由Servlet容器自动处理,这是因为Servlet是在Servlet容器内运行。Servlet容器可以在单个Java虚拟机中执行所有Servlet。Servlet容器必须遵循下列生命周期:创建和初始化Servlet(加载)处理客户端的服务调用破坏Servlet并对其进行垃圾收集这三个步骤对所有Servlet都通用。Servlet容器创建Servlet实例时使用的是init()方法,而在破坏实例时使用的是destroy()方法。6.1.2Servlet生命周期-1Servlet是普通J186.1.2Servlet生命周期-2服务器加载Servlet服务器创建Servlet类的实例调用Servlet实例的init()方法收到请求调用service()方法service()方法处理请求并将输出结果返回客户端Servlet等待下一个请求或由服务器卸载Servlet在服务器调用destroy()方法后被卸载6.1.2Servlet生命周期-2服务器加载Servle196.1.2Servlet生命周期-3初始化Servlet任何时候将Servlet加载至服务器,服务器都会调用Servlet的init()方法。即使大部分Servlet在多线程服务器上运行,Servlet在初始化过程中也不会碰到并发问题。init()方法在Servlet处理第一个请求之前调用,此方法用于执行Servlet初始化–创建或加载Servlet在处理请求时使用的对象。服务器调用Servlet的init()方法,向新Servlet提供任何有关其本身及其环境的信息。覆盖init()方法是为了在Servlet中添加初始化的内容,覆盖init()方法时必须遵循下列规则:如果发生初始化错误,致使Servlet不能处理客户端请求,则抛出UnavailableException请勿调用System.exit()方法ServletConfig对象向Servlet提供其初始化参数信息,这些参数与其他任何请求都不关联。ServletConfig对象还有对ServletContext对象的引用,Servlet可以使用此对象调查其环境。6.1.2Servlet生命周期-3初始化Servlet206.1.2Servlet生命周期-4处理客户端的请求Servlet接受客户端的调用时,它将收到两个对象:ServletRequest,用于封装客户端至服务器的通信。ServletResponse,用于封装Servlet返回至客户端的通信。HttpServlet接受客户端的调用时,与普通Servlet相似,它们是:HttpServletRequestHttpServletResponseHttpServlet能够并发地为多个客户端服务。在Servlet初始化之后,在调用init()方法时,Servlet容器收到的任何请求都将被转发至Servlet的service()方法。根据正在接收的HTTP请求类型,HttpServlet类的service()方法可在细分为doGet()、doPost()、doDelete()、doOptions()、doPut()和doTrace()方法。其中,doGet()和doPost()是两个常用于处理服务器的请求并生成响应的方法。6.1.2Servlet生命周期-4处理客户端的请求216.1.2Servlet生命周期-5破坏Servlet要卸载Servlet时,服务器将调用Servlet的destroy()方法。在destroy()方法中,Servlet应该释放任何已获得的资源。destroy()方法还使Servlet有机会写出其未保存的高速缓存信息或任何在下次调用init()时应该读取的持久性信息。6.1.2Servlet生命周期-5破坏Servlet226.2请求和响应-1下面讨论表示客户端请求和Servlet响应的对象。Servlet的两个包都具有请求和响应的接口和类。javax.servlet包具有ServletRequest和ServletResponse接口,javax.servlet.http包具有HttpServletRequest和HttpServletResponse接口。6.2请求和响应-1下面讨论表示客户端请求和Servlet236.2请求和响应-2HttpServlet类HttpServlet类扩展了GenericServlet,提供Servlet接口的HTTP协议的特定实现。如果Servlet必须遵循HTTP协议,则只能扩展HttpServlet类并覆盖所需的方法。HttpServlet最常用的两个接口是:HttpServletRequestHttpServletResponse6.2请求和响应-2HttpServlet类246.2请求和响应-3HttpServletRequestHttpServletRequest对象提供对HTTP头数据的访问,获得客户端作为请求一部分进行发送的参数。通过扩展HttpServlet类并覆盖相应方法可以处理HTTP请求,这些请求的方法包括doGet()和doPost()。客户端数据可以通过下列方式访问:getParameter()方法,用于返回指定参数的值getParameterValues()方法,在参数具有多个值时使用,此方法返回指定参数的值数组。如果所需数据是文本格式,则getReader()方法返回BufferedReader对象用于读取数据,如果所需数据是二进制格式,则getInputStream()方法返回ServletInputStream对象用于读取数据。6.2请求和响应-3HttpServletRequest256.2请求和响应-4HttpServletResponseHttpServletResponse对象提供两个将数据返回给用户的方法。getWriter()方法,返回Writer对象,用于将文本数据返回给用户getOutputStream()方法,返回ServletOutputStream对象,用于返回二进制数据在发送响应后关闭Writer或ServletOutputStream可让服务器知道何时完成响应。6.2请求和响应-4HttpServletResponse266.2请求和响应-5HttpServlet类中的常用方法voidinit()在初始化Servlet时调用一次voiddestroy()在要破坏Servlet实例时调用一次voidservice(HttpServletRequestreq,HttpServletResponseresp)请勿覆盖此方法doGet()、doPost()、doPut()、doDelete()、doOptions()、doTrace()这些方法根据收到的HTTP请求的类型来调用。必须覆盖以便生成响应。voidlog(Stringmsg)将消息写入Servlet的日志文件longgetLastModified(HttpServletreq)返回Servlet的最后修改日期StringgetServletInfo()提供Servlet的一般信息字符串,例如作者、版本、版权等StringgetServletName()返回Servlet的名称StringgetInitParameter(Stringname)返回给定初始化参数的值EnumerationgetInitParameterNames()返回一个包含了所有提供的初始化参数名称的Enumeration对象6.2请求和响应-5HttpServlet类中的常用方法v276.3会话和环境-1HTTP没有为服务器提供识别请求序列是否来自同一客户端的方法,这就引起一个问题,因为许多Web应用程序都是有状态的。HTTP服务器不能通过连接机器的IP地址来标识客户端,这是因为报告的IP地址可能是代理服务器的地址或者是有多个用户的服务器的地址。此问题的解决方案是客户端任何时候做出新请求都必须进行自我介绍。每个客户端都必须提供一个唯一标识以便服务器可识别它,或者客户端必须提供某些信息以便服务器可用于正确处理请求。6.3会话和环境-1HTTP没有为服务器提供识别请求序列是286.3会话和环境-2用户在站点上浏览时,会话跟踪使Servlet和其他服务器端应用程序可以跟踪用户。服务器端应用程序可以使用此功能跟踪客户端在站点上的操作。Web服务器通过为站点上的每个用户创建Session对象来维护用户状态,这些Session对象存储在服务器中,并在服务器中进行维护。在用户向站点做出请求时,用户就分配有一个新的Session对象和唯一的会话ID。此会话ID在后续的请求中会将用户与Session对象进行匹配然后Session对象就作为请求的一部分被传递至处理请求的Servlet。Servlet可以在Session对象中添加信息或读取其中的信息。会话对于由多个Servlet组成的应用程序来说很方便。6.3会话和环境-2用户在站点上浏览时,会话跟踪使Serv296.3会话和环境-3下面讨论不同的会话跟踪技术用户认证隐藏表单字段URL重写持久Cookie会话交换和持久6.3会话和环境-3下面讨论不同的会话跟踪技术306.3.1用户认证在Web服务器只允许那些使用用户名和口令进行登录的客户端访问某些资源时,就需要使用用户认证。在客户端登录后,用户名即通过getRemoteUser()提供给Servlet。用户名可用于跟踪客户端会话。一旦用户登录,浏览器即记住用户名,并在用户查看站点的新页面时返回用户名和口令。Servlet可以通过用户名标识用户,并以此跟踪用户。使用用户认证的优点是:容易实现。可让服务器保护一组页面,并使用getRemoteUser()标识每个客户端。此技术即使在用户从不同机器访问站点时也有效。即使用户离开站点或在返回站点前退出浏览器,此技术同样有效。使用用户认证的缺点是:要求每个用户都注册一个帐户,然后在每次访问站点时登录。用户在同一站点上不能同时维护多个会话。6.3.1用户认证在Web服务器只允许那些使用用户名和口令316.3.2隐藏表单字段隐藏表单字段是指添加到HTML表单中,但不在客户端的浏览器中显示的字段。在提交包含字段的表单时,字段将被发送至服务器。隐藏表单字段定义表单的常变量,但对于接收提交的表单的Servlet,隐藏字段和可见字段没有区别。使用隐藏表单字段的优点是其功能强大并支持匿名。所有常用浏览器都支持隐藏字段,而且它们可用于未登录或注册的客户端。隐藏表单字段的缺点是只适用于动态生成的表单序列。在遇到静态文档、以电子邮件发送的文档、设计为书签的文档和浏览器关闭时,该技术即束手无策。6.3.2隐藏表单字段隐藏表单字段是指添加到HTML表单中326.3.3URL重写使用URL重写技术,用户单击的每个URL都可被动态修改或重写,以包括附加信息。附加信息的形式可为附加路径信息、添加的参数或某些特定于服务器的自定义URL修改。重写URL的可用空间是有限的,因此附加信息通常只限于唯一的会话ID。每种重写技术都有其优点和缺点。附加路径信息适用于所有服务器,并作为使用GET和POST方法的表单的目标,但是,如果Servlet必须使用附加路径信息作为实际路径信息时,它就不适用。添加的参数适用于所有服务器,但在作为使用POST方法的表单的目标时将失效,并可能引起参数命名冲突。特定于服务器的自定义修改在任何情况下都适用于支持此类修改的服务器。6.3.3URL重写使用URL重写技术,用户单击的每个UR336.3.4持久CookieCookie是Web服务器发送至浏览器,以后可从该浏览器上读回的少量信息。浏览器收到Cookie后,在每次访问服务器上的页面时都会将其发送回服务器。由于Cookie的值可以方便地标识客户端,因此Cookie通常用于会话跟踪。6.3.4持久CookieCookie是Web服务器发送至346.3.5会话交换和持久-1因为访问一个站点的用户可有许多个,所以就会有许多会话访问同一站点。Internet站点必须支持许多有效会话,例如,大型站点可能同时有几百甚至几千个有效会话。由于每个会话都可以包含应用程序Servlet放置的任意数据对象,所以整个系统的内存要求就很高。内存中可以存在的会话数受到会话跟踪系统的限制。session.maxresidents属性设置此限制,当同时进行的会话的数量超过session.maxresidents设置的限制时,会话跟踪器会将最近最不常用的会话交换到磁盘。被交换的会话没有丢失,它们可以重载入内存。如果收到请求,会话将被重载。会话交换使得系统中的有效会话比内存所能容纳的会话要多。6.3.5会话交换和持久-1因为访问一个站点的用户可有许多356.3.5会话交换和持久-2会话交换绝不会影响会话的无效性。如果会话的未使用时间超过正常失效时间,它就会无效,不管会话是在内存还是在磁盘。session.invalidationinterval属性设置会话无效时间。串行化用于将会话写入磁盘和从磁盘读取会话。所以,可以串行化并置于会话中的对象将被写入磁盘,而不能串行化的对象将保留在内存中(即使会话的一部分已被写入磁盘),会话跟踪操作不会受串行化的影响。因此,Servlet开发者只保存会话中的可串行化对象。实现java.io.Serializable或java.io.Externalizable接口的对象都可串行化。在启用了会话持久功能时,会话跟踪器将使用会话交换机制实现会话持久。服务器关闭时,内存中的会话即被写入session.swapdirectory属性中指定的磁盘。一旦启动服务器,写入磁盘的会话就变得有效。这就使服务器在重启时不会丢失任何现有会话。会话中的可串行化数据元素在关闭/重启操作时可以继续运行。6.3.5会话交换和持久-2会话交换绝不会影响会话的无效性366.4HttpSession接口-1HttpSession接口定义一个对象,用于在客户端和服务器之间提供关联,此关联在经过多次连接后仍然持久。它还可以维护事务处理之间的状态。ServletAPI提供HttpSession接口以实现存储功能。Servlet引擎可以创建一个对象,用于实现此接口,自动创建唯一的密钥和将此密钥附加至响应。Servlet引擎负责存储会话、跟踪会话持久时间以及根据Servlet需要检索会话。Session对象必须具有生命周期,这样引擎才能将其抛弃。6.4HttpSession接口-1HttpSession376.4HttpSession接口-2为了创建HTTP客户端和HTTP服务器之间的会话,Servlet引擎使用HttpSession接口。对于用户的多个连接或页面请求,会话可持久的时间比实际指定的更长。正常情况下,会话对应一个建立至站点的连接并多次访问站点的用户。服务器通过使用Cookie或重写URL来维护会话。Servlet可通过HttpSession接口来查看和操纵会话的相关信息,如会话标识符、创建时间和环境。此接口允许Servlet将对象绑定至会话,并允许Servlet访问标准会话属性,例如会话标识符或会话环境。HttpSession接口允许Servlet从会话获得数据和修改此数据,然后将其返回给会话。6.4HttpSession接口-2为了创建HTTP客户端386.4HttpSession接口-3会话跟踪器检查对象是否实现HttpSessionBindingListener接口。任何时候应用程序存储对象或将其从会话中删除,如果对象实现HttpSessionBindingListener接口,则Servlet都会通知此对象它已被绑定至会话或已解除会话绑定。在下列任何一种情况下,服务器都会将会话视为新的会话:客户端首次进入页面或站点时会话还未启动时客户端选择不参与会话时6.4HttpSession接口-3会话跟踪器检查对象是否396.5ServletConfig接口ServletConfig接口定义Servlet配置对象,Servlet引擎使用此对象将信息传递给Servlet以初始化Servlet。它包含Servlet初始化参数的名称/值对,还包含对ServletContext对象的引用。此接口定义了三个访问此信息的方法。StringgetInitParameter(Stringname)返回包含了指定初始化参数值的字符串,如果参数不存在则返回nullEnumerationgetInitParameterNames()将Servlet初始化参数的名称作为字符串对象的枚举返回,如果Servlet没有初始化参数则返回空枚举ServletCntextgetServletContext()返回服务器传递至此Servlet的ServletContext对象6.5ServletConfig接口ServletConf406.6ServletContext-1使用此接口的对象让Servlet查找有关Servlet引擎及其环境的信息。从ServletConfig对象可以获得ServletContext。ServletContext类中常用的方法如下:ObjectgetAttribute(Stringname)返回给定名称的Servlet引擎属性,若无则返回nullEnumerationgetAttributeNames()返回包含了此Servlet环境中可用属性名称的枚举ServletContextgetContext(Stringuripath)返回对应于服务器上指定URL的ServletContext对象intgetMajorVersion()返回此Web服务器支持的JavaServletAPI的主要版本6.6ServletContext-1使用此接口的对象让S416.6ServletContext-2StringgetMimeType(Stringfile)返回指定文件的MIME类型,如果MIME类型未知则返回nullintgetMinorVersion()返回此Web服务器支持的JavaServletAPI的次要版本StringgetRealPath(Stringpath)返回包含了对应于虚拟路径的实际路径的字符串RequestDispatchergetRequestDispatcher(Stringurlpath)返回一个可用作位于指定路径的资源的封装器的RequestDispatcher对象URLgetResource(Stringpath)返回映射至指定路径的资源InputStreamgetResourceAsStream(Stringpath)将位于指定路径的资源作为InputStream对象返回StringgetServerInfo()返回Servlet正在其上运行的Servlet引擎的名称和版本voidlog(Stringmsg)将指定消息写入Servlet日志文件(通常为事件日志)6.6ServletContext-2Stringget426.6ServletContext-3voidlog(Stringmessage,Throwablethrowable)将有关给定Throwable异常的堆栈跟踪和说明性消息写入Servlet日志文件voidremoveAttribute(Stringname)将具有给定名称的属性从Servlet环境中删除voidsetAttribute(Stringname,Objectobject)在此Servlet环境中给属性命名6.6ServletContext-3voidlog(S43本章小结(一)Servlet是服务器端程序,由Web服务器加载和执行。由于只需加载一次,因此Servlet性能更佳,而且因为是用Java编写的,所以可跨平台。Servlet的init()方法在服务器构造了Servlet实例后即被服务器调用。要卸载Servlet时,服务器将调用Servlet的destroy()方法。用户在站点上浏览时,会话跟踪使Servlet和其他服务器端应用程序可以跟踪用户。会话跟踪技术包括:用户认证、隐藏表单字段、URL重写和持久Cookie。本章小结(一)Servlet是服务器端程序,由Web服务器加44本章小结(二)在Web服务器只允许那些使用用户名和口令进行登录的客户端访问某些资源时,需要使用用户认证。隐藏表单字段是指添加到HTML表单中,但不在客户端的浏览器中显示的字段。在提交包含字段的表单时,字段将被发送回服务器。使用URL重写技术,用户单击的每个URL都可被动态修改或重写,以包括附加信息。附加信息的形式可为附加路径信息、添加的参数或某些特定于服务器的自定义URL修改。会话跟踪系统对内存中可以存在的会话数量具有限制,这一限制在session.maxresidents属性中设置。本章小结(二)在Web服务器只允许那些使用用户名和口令进行登45演讲完毕,谢谢观看!演讲完毕,谢谢观看!46基于Java的Web编程技术第六章Servlet基于Java的Web编程技术第六章Servlet47上章回顾了解代理事件模型在JavaBean中访问数据库上章回顾了解代理事件模型48我们的目标了解Servlet体系结构掌握请求和响应我们的目标了解Servlet体系结构49简介-1Java编程中一个最激动人心的最新趋势是服务器端Java应用程序的兴起。Java这种面向对象的通用编程语言最初旨在用于小型嵌入设备,而后被认为是一种用于以Applet形式开发客户端Web内容的语言,如今Java已是一种非常适合服务器端开发的语言,商家迅速认识到Java在服务器上的潜力。简介-1Java编程中一个最激动人心的最新趋势是服务器端Ja50简介-2Applet是以Java语言开发的程序,它运行在客户端机器的浏览器上,这些Applet不连接到服务器。在很多情况下需要访问服务器上的数据,而这无法通过Applet实现。为了访问数据和执行服务器端的请求处理,必须使用另一个称为Servlet的应用程序。Servlet是以Java编程语言开发的服务器端程序,它运行在Web服务器中,由于Servlet在服务器内运行,所以这些程序可用于扩展Web服务器的功能。简介-2Applet是以Java语言开发的程序,它运行在客户51简介-3客户端Servlet数据库HTTP服务器Servlet体系结构简介-3客户端Servlet数据库HTTPServlet体系52简介-4使用Servlet的优点是:Servlet是持久性的。Servlet只须由Web服务器加载一次即可维护请求之间的服务。相比之下,每次向Web服务器发出请求时,Web服务器都必须加载和执行CGI脚本。Servlet运行速度快。由于只须加载一次,所以提供更佳的性能。由于是用Java编写,所以Servlet可跨平台。Servlet可扩展。Java的所有优点都可以在Servlet中体现。Servlet很安全。访问Servlet的唯一途径是通过服务器。Servlet可以与各种客户端一起使用。简介-4使用Servlet的优点是:536.1Servlet体系结构-1Servlet是服务器端程序,运行在Web服务器上对客户端的请求做出响应。Web服务器向Servlet发送请求,Servlet的输出结果返回至Web服务器,然后Web服务器将结果返回至Web浏览器,最后Web浏览器在屏幕上显示结果。该过程称为“请求-响应”模型。Web浏览器ServletWeb服务器HTTP请求HTTP响应6.1Servlet体系结构-1Servlet是服务器端程546.1Servlet体系结构-2Servlet使用以下两个包中的类和接口:javax.servletjavax.servlet.http包名以javax开头而不是java,表示ServletAPI是一个标准扩展。javax.servlet包包含了可以支持通用、跨协议的Servlet的类。javax.servlet.http包中的类增加了特定于HTTP的功能。每个Servlet都必须实现javax.servlet.Servlet接口。大部分Servlet通过扩展以下其中一个特殊类来实现这一接口:javax.servlet.GenericServlet或javax.servlet.http.HttpServlet。6.1Servlet体系结构-2Servlet使用以下两个556.1Servlet体系结构-3跨协议Servlet应该继承GenericServlet。HTTPServlet应继承HttpServlet,而HttpServlet本身是GenericServlet的子类,但添加了特定于HTTP的功能。Servlet接口只声明而不实现用于管理Servlet及其与客户端通信的方法。6.1Servlet体系结构-3跨协议Servlet应该继566.1Servlet体系结构-4ServletGenericServletHttpServlet自定义Servlet6.1Servlet体系结构-4ServletGeneri576.1.1常用接口和类-javax.servlet包其中最常用的接口如下:ServletRequest此接口用于将请求信息传送给Servlet。在收到请求时,Servlet引擎会将关键的请求信息封装在实现ServletRequest接口的对象中,传递至Servlet的service()方法。ServletResponse此接口提供服务器对客户端请求的响应的对象表示。Servlet引擎会将实现ServletResponse接口的对象传递给Servlet的service()方法。接着Servlet就可以使用此对象对客户端请求做出响应。RequestDispatcher此接口定义一个用于接收客户端的请求并将其发送至任何资源的对象。此接口还可用于封装Servlet。RequestDispatcher对象用作资源的封装器,通过路径或名称指定。资源可以是服务器上的Servlet、HTML文件或JSP文件。6.1.1常用接口和类-javax.servlet包其中586.1.1常用接口和类-javax.servlet包其中最常用的接口如下:Servlet这是每个Servlet都必须实现的接口,它定义必须由Servlet实现的方法。ServletConfig此接口定义Servlet配置对象。此对象由Servlet引擎用于将任何信息传递给Servlet,以便可初始化Servlet。ServletConfig接口的其他详情将在本章后面讨论。ServletContext此接口定义了一组方法,Servlet使用这些方法与Servlet引擎进行通信。SingleThreadModel此接口确保每次Servlet只能处理一个请求。6.1.1常用接口和类-javax.servlet包其中596.1.1常用接口和类-javax.servlet包其中最常用的类如下:GenericServlet这是大部分非HTTPServlet扩展的类。此类定义通知、跨协议的Servlet。ServletInputStream这是提供输入流用于读取来自客户端请求的二进制数据的类。此类包括方法readLine(),以此有效实现每次读取一行数据。ServletOutputStream此类的运行方式与ServletInputStream相同,但此类提供输出流用于将二进制数据发送给客户端。6.1.1常用接口和类-javax.servlet包其中606.1.1常用接口和类-javax.servlet包javax.servlet包还具有某些异常,它们是:ServletException此异常是常规异常,由Servlet在执行过程中遇到困难时抛出。UnavailableException此异常定义的是由Servlet抛出以表示Servlet永久或临时不可用的异常。6.1.1常用接口和类-javax.servlet包ja616.1.1常用接口和类-javax.servlet.http包javax.servlet.http包中可用的接口包括:HttpServletRequest此接口扩展ServletRequest接口并支持ServletResult接口的所有方法。HttpServletRequest定义用于描述HTTP请求的方法。实现HttpServletRequest接口的对象被传递给Servlet的service方法或任何do()方法。HttpServletResponse此接口扩展ServletResponse并支持ServletResponse接口的所有方法。HttpServletResponse接口提供服务器对客户端请求的响应的对象表示。Servlet可以使用实现Servlet引擎传递的HttpServletResponse接口的对象。此对象将被传递至Servlet的service()方法。HttpSession此接口提供一种方法,用于在对Web站点的请求或访问超过一个页面时标识用户。HttpSessionBindingListener在对象绑定至会话上或解除会话绑定时,此接口将通知对象。6.1.1常用接口和类-javax.servlet.ht626.1.1常用接口和类-javax.servlet.http包javax.servlet.http包中常用的类包括:CookieCookie类可以创建Cookie,Cookie存储了少量由Servlet发送至客户端的信息。客户端可在稍后要访问以前访问过的网页时使用已存储的信息。HttpServletHttpServlet类是最常用于扩展Servlet的类,这是因为很多Servlet应用程序都按HTTP协议运行。此类支持HTTP功能以及Servlet类的方法,它是个抽象类。它接收客户端的请求,并向客户端发送响应。HttpSessionBindingEvent在对象绑定至会话上或解除会话绑定时,此类会将对象传递给实现HttpSessionBindingListener接口的会话。6.1.1常用接口和类-javax.servlet.ht636.1.2Servlet生命周期-1Servlet是普通Java类,在需要时被创建,在不用时被破坏。Servlet的创建和破坏均由Servlet容器自动处理,这是因为Servlet是在Servlet容器内运行。Servlet容器可以在单个Java虚拟机中执行所有Servlet。Servlet容器必须遵循下列生命周期:创建和初始化Servlet(加载)处理客户端的服务调用破坏Servlet并对其进行垃圾收集这三个步骤对所有Servlet都通用。Servlet容器创建Servlet实例时使用的是init()方法,而在破坏实例时使用的是destroy()方法。6.1.2Servlet生命周期-1Servlet是普通J646.1.2Servlet生命周期-2服务器加载Servlet服务器创建Servlet类的实例调用Servlet实例的init()方法收到请求调用service()方法service()方法处理请求并将输出结果返回客户端Servlet等待下一个请求或由服务器卸载Servlet在服务器调用destroy()方法后被卸载6.1.2Servlet生命周期-2服务器加载Servle656.1.2Servlet生命周期-3初始化Servlet任何时候将Servlet加载至服务器,服务器都会调用Servlet的init()方法。即使大部分Servlet在多线程服务器上运行,Servlet在初始化过程中也不会碰到并发问题。init()方法在Servlet处理第一个请求之前调用,此方法用于执行Servlet初始化–创建或加载Servlet在处理请求时使用的对象。服务器调用Servlet的init()方法,向新Servlet提供任何有关其本身及其环境的信息。覆盖init()方法是为了在Servlet中添加初始化的内容,覆盖init()方法时必须遵循下列规则:如果发生初始化错误,致使Servlet不能处理客户端请求,则抛出UnavailableException请勿调用System.exit()方法ServletConfig对象向Servlet提供其初始化参数信息,这些参数与其他任何请求都不关联。ServletConfig对象还有对ServletContext对象的引用,Servlet可以使用此对象调查其环境。6.1.2Servlet生命周期-3初始化Servlet666.1.2Servlet生命周期-4处理客户端的请求Servlet接受客户端的调用时,它将收到两个对象:ServletRequest,用于封装客户端至服务器的通信。ServletResponse,用于封装Servlet返回至客户端的通信。HttpServlet接受客户端的调用时,与普通Servlet相似,它们是:HttpServletRequestHttpServletResponseHttpServlet能够并发地为多个客户端服务。在Servlet初始化之后,在调用init()方法时,Servlet容器收到的任何请求都将被转发至Servlet的service()方法。根据正在接收的HTTP请求类型,HttpServlet类的service()方法可在细分为doGet()、doPost()、doDelete()、doOptions()、doPut()和doTrace()方法。其中,doGet()和doPost()是两个常用于处理服务器的请求并生成响应的方法。6.1.2Servlet生命周期-4处理客户端的请求676.1.2Servlet生命周期-5破坏Servlet要卸载Servlet时,服务器将调用Servlet的destroy()方法。在destroy()方法中,Servlet应该释放任何已获得的资源。destroy()方法还使Servlet有机会写出其未保存的高速缓存信息或任何在下次调用init()时应该读取的持久性信息。6.1.2Servlet生命周期-5破坏Servlet686.2请求和响应-1下面讨论表示客户端请求和Servlet响应的对象。Servlet的两个包都具有请求和响应的接口和类。javax.servlet包具有ServletRequest和ServletResponse接口,javax.servlet.http包具有HttpServletRequest和HttpServletResponse接口。6.2请求和响应-1下面讨论表示客户端请求和Servlet696.2请求和响应-2HttpServlet类HttpServlet类扩展了GenericServlet,提供Servlet接口的HTTP协议的特定实现。如果Servlet必须遵循HTTP协议,则只能扩展HttpServlet类并覆盖所需的方法。HttpServlet最常用的两个接口是:HttpServletRequestHttpServletResponse6.2请求和响应-2HttpServlet类706.2请求和响应-3HttpServletRequestHttpServletRequest对象提供对HTTP头数据的访问,获得客户端作为请求一部分进行发送的参数。通过扩展HttpServlet类并覆盖相应方法可以处理HTTP请求,这些请求的方法包括doGet()和doPost()。客户端数据可以通过下列方式访问:getParameter()方法,用于返回指定参数的值getParameterValues()方法,在参数具有多个值时使用,此方法返回指定参数的值数组。如果所需数据是文本格式,则getReader()方法返回BufferedReader对象用于读取数据,如果所需数据是二进制格式,则getInputStream()方法返回ServletInputStream对象用于读取数据。6.2请求和响应-3HttpServletRequest716.2请求和响应-4HttpServletResponseHttpServletResponse对象提供两个将数据返回给用户的方法。getWriter()方法,返回Writer对象,用于将文本数据返回给用户getOutputStream()方法,返回ServletOutputStream对象,用于返回二进制数据在发送响应后关闭Writer或ServletOutputStream可让服务器知道何时完成响应。6.2请求和响应-4HttpServletResponse726.2请求和响应-5HttpServlet类中的常用方法voidinit()在初始化Servlet时调用一次voiddestroy()在要破坏Servlet实例时调用一次voidservice(HttpServletRequestreq,HttpServletResponseresp)请勿覆盖此方法doGet()、doPost()、doPut()、doDelete()、doOptions()、doTrace()这些方法根据收到的HTTP请求的类型来调用。必须覆盖以便生成响应。voidlog(Stringmsg)将消息写入Servlet的日志文件longgetLastModified(HttpServletreq)返回Servlet的最后修改日期StringgetServletInfo()提供Servlet的一般信息字符串,例如作者、版本、版权等StringgetServletName()返回Servlet的名称StringgetInitParameter(Stringname)返回给定初始化参数的值EnumerationgetInitParameterNames()返回一个包含了所有提供的初始化参数名称的Enumeration对象6.2请求和响应-5HttpServlet类中的常用方法v736.3会话和环境-1HTTP没有为服务器提供识别请求序列是否来自同一客户端的方法,这就引起一个问题,因为许多Web应用程序都是有状态的。HTTP服务器不能通过连接机器的IP地址来标识客户端,这是因为报告的IP地址可能是代理服务器的地址或者是有多个用户的服务器的地址。此问题的解决方案是客户端任何时候做出新请求都必须进行自我介绍。每个客户端都必须提供一个唯一标识以便服务器可识别它,或者客户端必须提供某些信息以便服务器可用于正确处理请求。6.3会话和环境-1HTTP没有为服务器提供识别请求序列是746.3会话和环境-2用户在站点上浏览时,会话跟踪使Servlet和其他服务器端应用程序可以跟踪用户。服务器端应用程序可以使用此功能跟踪客户端在站点上的操作。Web服务器通过为站点上的每个用户创建Session对象来维护用户状态,这些Session对象存储在服务器中,并在服务器中进行维护。在用户向站点做出请求时,用户就分配有一个新的Session对象和唯一的会话ID。此会话ID在后续的请求中会将用户与Session对象进行匹配然后Session对象就作为请求的一部分被传递至处理请求的Servlet。Servlet可以在Session对象中添加信息或读取其中的信息。会话对于由多个Servlet组成的应用程序来说很方便。6.3会话和环境-2用户在站点上浏览时,会话跟踪使Serv756.3会话和环境-3下面讨论不同的会话跟踪技术用户认证隐藏表单字段URL重写持久Cookie会话交换和持久6.3会话和环境-3下面讨论不同的会话跟踪技术766.3.1用户认证在Web服务器只允许那些使用用户名和口令进行登录的客户端访问某些资源时,就需要使用用户认证。在客户端登录后,用户名即通过getRemoteUser()提供给Servlet。用户名可用于跟踪客户端会话。一旦用户登录,浏览器即记住用户名,并在用户查看站点的新页面时返回用户名和口令。Servlet可以通过用户名标识用户,并以此跟踪用户。使用用户认证的优点是:容易实现。可让服务器保护一组页面,并使用getRemoteUser()标识每个客户端。此技术即使在用户从不同机器访问站点时也有效。即使用户离开站点或在返回站点前退出浏览器,此技术同样有效。使用用户认证的缺点是:要求每个用户都注册一个帐户,然后在每次访问站点时登录。用户在同一站点上不能同时维护多个会话。6.3.1用户认证在Web服务器只允许那些使用用户名和口令776.3.2隐藏表单字段隐藏表单字段是指添加到HTML表单中,但不在客户端的浏览器中显示的字段。在提交包含字段的表单时,字段将被发送至服务器。隐藏表单字段定义表单的常变量,但对于接收提交的表单的Servlet,隐藏字段和可见字段没有区别。使用隐藏表单字段的优点是其功能强大并支持匿名。所有常用浏览器都支持隐藏字段,而且它们可用于未登录或注册的客户端。隐藏表单字段的缺点是只适用于动态生成的表单序列。在遇到静态文档、以电子邮件发送的文档、设计为书签的文档和浏览器关闭时,该技术即束手无策。6.3.2隐藏表单字段隐藏表单字段是指添加到HTML表单中786.3.3URL重写使用URL重写技术,用户单击的每个URL都可被动态修改或重写,以包括附加信息。附加信息的形式可为附加路径信息、添加的参数或某些特定于服务器的自定义URL修改。重写URL的可用空间是有限的,因此附加信息通常只限于唯一的会话ID。每种重写技术都有其优点和缺点。附加路径信息适用于所有服务器,并作为使用GET和POST方法的表单的目标,但是,如果Servlet必须使用附加路径信息作为实际路径信息时,它就不适用。添加的参数适用于所有服务器,但在作为使用POST方法的表单的目标时将失效,并可能引起参数命名冲突。特定于服务器的自定义修改在任何情况下都适用于支持此类修改的服务器。6.3.3URL重写使用URL重写技术,用户单击的每个UR796.3.4持久CookieCookie是Web服务器发送至浏览器,以后可从该浏览器上读回的少量信息。浏览器收到Cookie后,在每次访问服务器上的页面时都会将其发送回服务器。由于Cookie的值可以方便地标识客户端,因此Cookie通常用于会话跟踪。6.3.4持久CookieCookie是Web服务器发送至806.3.5会话交换和持久-1因为访问一个站点的用户可有许多个,所以就会有许多会话访问同一站点。Internet站点必须支持许多有效会话,例如,大型站点可能同时有几百甚至几千个有效会话。由于每个会话都可以包含应用程序Servlet放置的任意数据对象,所以整个系统的内存要求就很高。内存中可以存在的会话数受到会话跟踪系统的限制。session.maxresidents属性设置此限制,当同时进行的会话的数量超过session.maxresidents设置的限制时,会话跟踪器会将最近最不常用的会话交换到磁盘。被交换的会话没有丢失,它们可以重载入内存。如果收到请求,会话将被重载。会话交换使得系统中的有效会话比内存所能容纳的会话要多。6.3.5会话交换和持久-1因为访问一个站点的用户可有许多816.3.5会话交换和持久-2会话交换绝不会影响会话的无效性。如果会话的未使用时间超过正常失效时间,它就会无效,不管会话是在内存还是在磁盘。session.invalidationinterval属性设置会话无效时间。串行化用于将会话写入磁盘和从磁盘读取会话。所以,可以串行化并置于会话中的对象将被写入磁盘,而不能串行化的对象将保留在内存中(即使会话的一部分已被写入磁盘),会话跟踪操作不会受串行化的影响。因此,Servlet开发者只保存会话中的可串行化对象。实现java.io.Serializable或java.io.Externalizable接口的对象都可串行化。在启用了会话持久功能时,会话跟踪器将使用会话交换机制实现会话持久。服务器关闭时,内存中的会话即被写入session.swapdirectory属性中指定的磁盘。一旦启动服务器,写入磁盘的会话就变得有效。这就使服务器在重启时不会丢失任何现有会话。会话中的可串行化数据元素在关闭/重启操作时可以继续运行。6.3.5会话交换和持久-2会话交换绝不会影响会话的无效性826.4HttpSession接口-1HttpSession接口定义一个对象,用于在客户端和服务器之间提供关联,此关联在经过多次连接后仍然持久。它还可以维护事务处理之间的状态。ServletAPI提供HttpSession接口以实现存储功能。Servlet引擎可以创建一个对象,用于实现此接口,自动创建唯一的密钥和将此密钥附加至响应。Servlet引擎负责存储会话、跟踪会话持久时间以及根据Servlet需要检索会话。Session对象必须具有生命周期,这样引擎才能将其抛弃。6.4HttpSession接口-1HttpSession836.4HttpSession接口-2为了创建HTTP客户端和HTTP服务器之间的会话,Servlet引擎使用HttpSession接口。对于用户的多个连接或页面请求,会话可持久的时间比实际指定的更长。正常情况下,会话对应一个建立至站点的连接并多次访问站点的用户。服务器通过使用Cookie或重写URL来维护会话。Servlet可通过HttpSessio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论