您好,欢迎访问三七文档
第7章Servlet详解在本书前面的章节中经常提到Servlet,讲过JSP页面在执行之前会首先预编译为Servlet然后再运行。那么究竟什么是Servlet,Servlet和JSP是什么关系?本章将针对这些问题进行讲解,使读者能够理解JSP的运行原理,从而能够开发出更好更有效的JSP应用程序。7.1Servlet简介7.1.1Java服务器结构本书中所讲的服务器不是指硬件服务器,而是从软件功能上来讲的。则从软件功能上讲,服务器指的就是能够提供服务的运行着的程序,即一个提供服务的进程。“服务(Service)”就是一些相关功能的集合,这些功能响应基于公开的接口和行为规范,并通过封装其实现的接口,来响应特定的请求并产生相应的结果。常见的应用级协议包括HTTP、FTP、SMTP以及TELNET等,这些都是标准化的网络协议。那么从最简单的概念上讲,一个服务器就是这样一个程序:它首先能识别出符合标准协议格式的请求信息,其次再把请求信息进行内部处理,最后再将处理结果按照标准协议的格式发送回去。图7.1就是表达这个概念的简单示意图。图7.1服务器功能示意图建立了服务器的概念,然后就应该考虑Java是如何实现这样的架构的。服务构架(ServiceFramework)是一个实现了服务的类的集合,这些服务使用多个处理线程来完成与客户的交互。服务器通过一个连接点(ConnectionEndpoint)描述符获得一JSP网络应用教程2个基于连接的服务的特定端口(ServerSocket)。ConnectionEndpoint描述符封装了一些特定的信息,例如服务所使用的监听端口号。选项和协议信息等。获得了ServerSocket之后,服务就可以创建其自身的服务处理线程池。在线程处理池中的线程进入循环,等待来自客户端的连接请求。在受到请求后通过该连接链路处理协议。处理线程池的大小是动态变化的,当有需要时临时创建新的处理线程,但一般情况下数量有上下限限制。核心的服务构架通常用来处理某个特定的应用协议。例如,为HTTP服务提供了一个HTTP服务基类,由其创建的处理线程就能够处理HTTP协议。服务器在启动的时候要启动一个服务集合,每个服务都有其自己的线程组。除了处理标准协议的服务之外,服务器还要包含进行内部协调和管理的服务。Servlet就是在Java中为实现以上所述的服务构架所产生的。7.1.2Servlet的功能Servlet可称之为“服务器小程序”,与Javaapplication不同,它没有main方法,而是用一些特定的方法用于启动、执行和退出。通过使用Servlet,可以与运行于客户端的Applet进行交互,也可以直接与HTML页进行交互。与传统的CGI相比,JavaServlets在处理同样的事物时更高效、更强大,并且具有容易使用、容易移植的特点,使用费用也很低。在传统的CGI模式中,对于每一个HTTP请求,服务器都要启动一个进程,如果这个请求只是要求一个很简单的操作,那么所花费的代价就几乎都表现在服务器进程的启动时间上了。而Servlets是建立在Java虚拟机上的,每一个请求对应一个更轻量级的Java线程,这样在处理请求时就更具有灵活性,比如可以在若干个请求中保留对其他资源的控制等。图2.2就是Java服务器通过Servlet完成其功能的内部执行示意图。图2.2Java服务器示意图第7章Servlet详解3Servlet除了具有Java本身的许多优点外,还提供一整套系统的数据结构自动分析功能,可以解析HTM.标单的提交参数,读取和设置HTTP的头部信息,处理Cookie,用户Session追踪以及相关操作。利用Servlets可以较容易的做到一些普通CGI很难做到甚至做不到的事情,比如直接与网络服务器对话等。不同的Servlet之间可以进行一些资源的共享,例如共享对数据库的连接等。通过Servlet的安全模型和“沙箱”机制还可以保护系统不受破坏。此外,由于Java本身的平台无关性,就使得基于Servlet的Java服务器又很强的适应能力,本书中所用到的Tomcat就可以与不同的网络服务器配合使用。Sun公司为Servlet程序提供了一个标准的API(ServletAPI),保证了程序开发的一致性。ServletAPI的最大优点就是它的协议无关性,因此其中并不包含在网络上传输所用的协议、Servlet的加载方式以及服务器环境等内容,这样就使其容易被嵌入到多种类型的服务器中。7.1.3Servlet开发包要进行Servlet开发首先要有开发工具,在前面讲解Java开发时讲了一些JDK的开发包。同样,开发Servlet时我们要用到Servlet开发包。本书中主要讲解随JSWDK一起提供的几个Servlet开发包,对于其他或第三方包请读者查阅相关资料。JSWDK给出的Servlet开发包分别是javax.servlet、javax.servlet.http和javax.servlet.jsp。读者打开JSWDK安装目录下的“\webpages\docs\api\index.html”文件,就可以察看到相关文档。7.2javax.servlet包javax.servlet包中所包含的是编写Servlet所需的最基本的类和接口。它定义的接口有五个:·RequestDispatcher·Servlet·ServletConfig·ServletContext·ServletRequest·ServletResponse·SingleThreadModel定义的类有三个:·GenericServlet·ServletInputStream·ServletOutputStream定义的异常有两个:JSP网络应用教程4·ServletException·UnavilableExceptionjavax.servlet包中的类的派生关系如图7.3所示(图中箭头表示类所实现的接口,下同,不再说明):图7.3javax.servlet类派生结构以下就对其中定义的接口、类以及例外进行说明。7.2.1接口Servlet这个接口用于开发Servlet。一个Servlet就是一个Java类,它能在一个网络服务中被装载和执行。Web服务器从客户端接受请求,并对请求做出反应,然后把响应的结果返回给客户。例如一个客户需要从一个数据库中获取数据或信息,就可以在服务器端写一个Servlet来完成这一任务。该Servlet接收客户的数据或信息请求,从数据库中得到数据或信息,并可能对取得的结果做出相应的处理,最后返回用户所请求的数据或信息。所用的Servlet都要实现这个接口。编写一个Servlet程序通常通过生成GenericServlet(GenericServlet已经实现了此接口)类的子类,或者进一步通过生成GenericServlet类的子类HttpServlet的子类来实现。一般在编程时不需要直接实现这个接口,只有在不能够或者不需要从GenericServlet或者HttpServlet继承时,才需要直接实现此接口。比如要把RMI或CORBA当作一个Servlet,就必须实现此接口。Servlet接口定义了几个方法用于初始化一个Servlet、接收客户的请求、响应客户的请求,以及删除一个Servlet和它所占的资源,这和Applet中的生命周期函数有很多类似的地方。一个Servlet将按照以下步骤被网络服务所调用:第7章Servlet详解5(1)创建并初始化。(2)处理从客户来的一个或多个服务请求。(3)删除Servlet,回收所占用的资源,终止Servlet运行。初始化一个Servlet所作的工作包括许多一次性开销大的处理,比如从一个文件中读出数据或者开始一个辅助线程等等。对于从客户端来的服务请求,Servlet使用接收请求包和发送应答包的工作模式进行处理,其服务质量依赖于下层也就是网络传输层所提供的服务的质量,例如排序、重复、消息的完整性和保密性等等。删除一个Servlet包括撤销它在初始化时所作的所有工作和同步Servlet在内存中的当前持续状态。除了生命周期函数之外,Servlet接口还提供了一个Servlet获取关于启动信息的方法,以及获取自身信息的方法,这些信息包括作者、版本号和版权信息等。以下则是Servlet接口的定义:publicabstractinterfaceServlet{publicvoiddestroy();/*当所有的线程都从此Servlet的service方法中退出或者超出了预定的时间后,调用此方法,从而释放Servlet所占用的全部资源。*/publicServletConfiggetServletConfig()/*返回一个ServletConfig配置对象,该对象包含了这个Servlet的所有初始化参数和启动设置。*/publicjava.lang.StringgetServletInfo()//返回Servlet自身的信息,比如作者、版本号和版权信息等。publicvoidinit(ServletConfigconfig)//初始化Servlet并将其调入到服务中,在受到任何请求之前,必须保证已初始化完毕。publicvoidservice(ServletRequestreq、ServletResponseres)//执行一次从客户来的请求。}Servlet接口中的service方法是完成请求处理的主要方法,因此应格外给予关注。service方法的两个参数一个代表客户请求,另一个代表对客户的响应。只有通过service方法才能使Servlet对请求做出响应,当然前提是此Servlet已经通过init方法进行过初始化。当一个Servlet还没有完成初始化时,Servlet引擎将锁定对此方法的请求直到初始化完毕。同样,一旦Servlet引擎通过调用destory方法将此Servlet从服务中移除后,就不能再调用此Servlet的service方法了。JSP网络应用教程6典型情况下,Servlet运行在能够处理并发请求的多线程Servlet引擎之中。所以必须保证对任何共享资源的访问同步,例如网络连接、实例变量等。关于多线程同步可参考Java语言参考中的相关内容。7.2.2接口ServletConfig当Servlet第一次被装载时,为了向其传递服务设置信息,开发者必须实现此接口。在实现此接口时,要为Servlet写一个方法,Servlet使用该方法来获得Servlet的初始化参数和它运行时的环境。此接口也可以由Servlet来实现(例如GenericServlet就是这样做的,读者可参考相关描述)。当由Servlet实现这一接口时,获取Servlet的设置参数将更加方便。下面是接口ServletConfig的定义:publicabstractinterfaceServletConfig{publicjava.lang.StringgetInitParameter(java.lang.Stringname)//返回指定名称的Servlet初始化参数,无则返回空值。publicjava.util.EnumerationgetInitParameterNames()//返回所有初始化参数的名称,返回值为一枚举对象。publicServletContextgetServletContext()//返回服务器传递给此Servlet的运行环境,返回值为一个ServletContext对象。}配置信息包括初始化参数和一个ServletContext对象。初始化参数是一组“名称/值”对。ServletContext对象则给出服务器的相关信息。实现接口ServletConfig的实例可参考“JSP内置对象”一章中的“config”对象,“config”对象的原型即实现了此接口。7.2.3接口ServletContext接口ServletContext提供给Servlet一些访问它们所运行环境的方法,并允许记录一些重要的事件,能够由Servlet
本文标题:Servlet详解
链接地址:https://www.777doc.com/doc-4545817 .html