您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > Servlet技术(上)
Tips第4章Servlet技术(上)Servlet是JavaWeb应用中的最核心的组件。本书第2章的2.2节(Tomcat作为Servlet容器的基本功能)已经介绍了Servlet容器与Servlet之间的基本关系。Servlet运行在Servlet容器中,能够为各种各样的客户请求提供相应服务。Servlet可以轻而易举地完成以下任务:l动态生成HTML文档,参见本章。l把请求转发给同一个Web应用中的其他Servlet组件,参见第5章。l把请求转发给其他Web应用中的Servlet组件,参见第5章。l读取客户端的Cookie,以及向客户端写入Cookie,参见第5章。l访问其他服务器资源(如数据库或基于Java的应用程序),参见第8章。Servlet之所以本领如此高强,主要有两个原因:lServlet是用Java语言编写出来的类,只要开发人员有深厚的Java编程功底,就可以编写出能完成各种复杂任务的Servlet类。lServlet对象由Servlet容器创建,它是Servlet容器重点关照的宠儿。Servlet在容器中能呼风唤雨,驾轻就熟地动用容器为它提供的各种资源。古人云:“君子生非异也,善假于物也。”Servlet也是借助容器为它提供的十八般武器,才能成为容器中神通广大的头号干将。Java是面向对象的编程语言。面向对象编程中的最基本的思想之一就是:万物皆对象;最基本的思想之二就是:在一个软件系统中,每个对象都不是孤立的,对象与对象之间需要相互协作,才能齐心合力地完成特定任务。Servlet规范为JavaWeb应用制定了对象模型,在这个对象模型中,不仅Servlet是Java对象,而且容器为它提供的十八般武器也都是Java对象。为了叙述的方便,本书把Servlet规范为JavaWeb应用制定的对象模型命名为Servlet对象模型。要想精通Servlet编程,不仅要了解Servlet自身的用法,还要了解容器为它提供的十八般武器的用法。本章及后面章节会陆续介绍各种武器的用法,本章主要展示了以下Servlet最常用的武器:l请求对象(ServletRequest和HttpServletRequest):Servlet从该对象中获取来自客户端的请求信息。l响应对象(ServletResponse和HttpServletResponse):Servlet通过该对象来生成响应结果。lServlet配置对象(ServletConfig):当容器初始化一个Servlet对象时,会向Servlet提供一个ServletConfig对象,Servlet通过该对象来获取初始化参数信息及ServletContext对象。Tomcat与JavaWeb开发技术详解(第2版)90Tomcat&JavaWebDevelopmentlServlet上下文对象(ServletContext):Servlet通过该对象来访问容器为当前Web应用提供的各种资源。本章内容主要依据以下两条线索展开:l展示Servlet对象模型的静态结构,即介绍ServletAPI中的各种接口之间的关系(如关联、依赖、继承和实现关系),以及接口的常用方法。l展示Servlet对象模型的动态结构,即介绍各种对象在运行时的协作过程,以及各种对象的生命周期。4.1ServletAPIServletAPI的JavaDoc文档可以到Servlet规范的官方网站上下载:此外,本书附赠光盘中的software/servlet-2.5-javadoc.zip文件为该JavaDoc文档的压缩文件,Tomcat的CATALINA_HOME/lib/servlet-api.jar文件为ServletAPI的类库文件。ServletAPI主要由两个Java包组成:javax.servlet和javax.servlet.http。在javax.servlet包中定义了Servlet接口及相关的通用接口和类;在javax.servlet.http包中主要定义了与HTTP协议相关的HttpServlet类、HttpServletRequest接口和HttpServletResponse接口。图4-1显示了ServletAPI中的主要接口与类的类框图。图4-1ServletAPI的类框图4.1.1Servlet接口ServletAPI的核心是javax.servlet.Servlet接口,所有的Servlet类都必须实现这一接口。在Servlet接口中定义了5个方法,其中有3个方法都由Servlet容器来调用,容第4章Servlet技术(上)Tomcat&JavaWebDevelopment91器会在Servlet的生命周期的不同阶段调用特定的方法。linit(ServletConfigconfig)方法:负责初始化Servlet对象。容器在创建好Servlet对象后,就会调用该方法。lservice(ServletRequestreq,ServletResponseres)方法:负责响应客户的请求,为客户提供相应服务。当容器接收到客户端要求访问特定Servlet对象的请求时,就会调用该Servlet对象的service()方法。ldestroy()方法:负责释放Servlet对象占用的资源。当Servlet对象结束生命周期时,容器会调用此方法。Servlet接口还定义了以下两个返回Servlet的相关信息的方法。JavaWeb应用中的程序代码可以访问Servlet的这两个方法,从而获得Servlet的配置信息及其他相关信息。lgetServletConfig():返回一个ServletConfig对象,在该对象中包含了Servlet的初始化参数信息。lgetServletInfo():返回一个字符串,在该字符串中包含了Servlet的创建者、版本和版权等信息。在ServletAPI中,javax.servlet.GenericServlet抽象类实现了Servlet接口,而javax.servlet.http.HttpServlet抽象类是GenericServlet类的子类。当用户开发自己的Servlet类时,可以选择扩展GenericServlet类或者HttpServlet类。图4-2显示了Servlet接口及其实现类的类框图。图4-2Servlet接口及其实现类的类框图4.1.2GenericServlet抽象类GenericServlet抽象类为Servlet接口提供了通用实现,它与任何网络应用层协议无关。GenericServlet类除了实现Servlet接口,还实现了ServletConfig接口和Serializable接口。例程4-1为GenericServlet类的源代码。Tomcat与JavaWeb开发技术详解(第2版)92Tomcat&JavaWebDevelopment例程4-1GenericServlet.javapublicabstractclassGenericServletimplementsServlet,ServletConfig,java.io.Serializable{privatetransientServletConfigconfig;publicGenericServlet(){}publicvoiddestroy(){}publicStringgetInitParameter(Stringname){returngetServletConfig().getInitParameter(name);}publicEnumerationgetInitParameterNames(){returngetServletConfig().getInitParameterNames();}publicServletConfiggetServletConfig(){returnconfig;}publicServletContextgetServletContext(){returngetServletConfig().getServletContext();}publicStringgetServletInfo(){return;}publicvoidinit(ServletConfigconfig)throwsServletException{this.config=config;//使当前Servlet对象与Servlet容器传入的ServletConfig对象关联this.init();}publicvoidinit()throwsServletException{}//子类可以重新实现该方法publicvoidlog(Stringmsg){getServletContext().log(getServletName()+:+msg);}publicvoidlog(Stringmessage,Throwablet){getServletContext().log(getServletName()+:+message,t);}publicabstractvoidservice(ServletRequestreq,ServletResponseres)throwsServletException,IOException;publicStringgetServletName(){returnconfig.getServletName();}}从GenericServlet类的源代码可以看出,GenericServlet类实现了Servlet接口中的第4章Servlet技术(上)Tomcat&JavaWebDevelopment93Tipsinit(ServletConfigconfig)初始化方法。GenericServlet类有一个ServletConfig类型的私有实例变量config,当Servlet容器调用GenericServlet的init(ServletConfigconfig)方法时,该方法使得私有实例变量config引用由容器传入的ServletConfig对象,即使得GenericServlet对象与一个ServletConfig对象关联。GenericServlet类还自定义了一个不带参数的init()方法,init(ServletConfigconfig)方法会调用此方法。对于GenericServlet类的子类,如果希望覆盖父类的初始化行为,有以下两种办法。(1)覆盖父类的不带参数的init()方法:publicvoidinit(){//子类具体的初始化行为…}(2)覆盖父类的带参数的init(ServletConfigconfig)方法。如果希望当前Servlet对象与ServletConfig对象关联,应该先在该方法中调用super.init(config)方法:publicvoidinit(ServletConfigconfig){super.init(config);//调用父类的init(config)方法//子类具体的初始化行为…}GenericServlet类没有实现Servlet接口中的service()方法。service()方法是GenericServlet类中唯一的抽象方法,GenericServlet类的具体子类必须实现该方法,从而为特定的客户请求提供具体的服务。GenericServlet类尽管实现了Servlet接口中的destroy()方法,但实际上什么也没做。GenericServlet类的具体子类可以覆盖该方法,从而为待销毁的当前Servlet对象释放所占用的各种资源(例如关闭文件输入流和输出流,关闭与数据库的连接等)。此外,GenericServlet类实现了ServletConfig接口中的所有方法。因此,GenericServlet类的子类可以直接调用在ServletConfig接口中定义的get
本文标题:Servlet技术(上)
链接地址:https://www.777doc.com/doc-3326582 .html