您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 05 Servlet技术基础知识
第5章Servlet技术基础知识Servlet是JavaWeb开发中一个比较常见的技术,它通常是和JSP搭配使用的,JSP主要负责前台页面的展现,而Servlet主要负责后台的业务处理。它可以使用doGet和doPost以及service方法动态的处理页面的请求。在本章将主要介绍Servlet的使用周期、Servlet中主要类的使用方法以及利用Servlet实现的综合实例。本章重点:介绍Servlet的生命周期流程。doGet方法和doPost方法的区别与使用。Servlet容器处理请求消息的方式。获取请求信息数据的方法。Servlet技术的具体应用实例。5.1Servlet技术简介Servlet是用Java编写的JavaServlet应用程序设计接口及相关的类和方法。Servlet不能像一般的Java程序一样可以在开发环境中直接运行,它必须载入Web服务器例如:Tomcat中并在Web服务器内执行。Servlet可以动态地扩展Server的能力,并采用“请求-响应”的模式提供Web服务。1.Servlet的功能。Servlet的主要功能在于交互式地浏览和修改数据,生成动态Web内容。Servlet可以实现的主要功能有:可以创建一个内容完整的、动态的HTML页面。可以与数据库或其他的Java应用程序互相访问。支持多个客户端的同时访问并且可以接入客户端传递的消息。支持图像转换等特殊MIME类型的过滤。2.Servlet的特点。Servlet看起来像是通常的Java程序。Servlet导入特定的属于JavaServletAPI的包。因为是对象字节码,可动态地从网络加载。与其他的动态网页编程技术相比,Servlet技术有很多自己特有的优点。高效性:主要表现在Servlet在处理客户端的请求响应的效率比CGI高。功能强大:主要表现在Servlet能够直接和Web服务器交互,而普通的CGI却不能。可移植性好:主要表现在Servlet无须任何实质上的改动即可移植到Apache、MicrosoftIIS或其他的Web服务器上。使用方便:主要表现在自动地解析HTML表单数据、读取和设置HTTP响应头、处理Cookie、跟踪会话状态等。3.Servlet的创建。通过上面2个知识点的学习,了解了Servlet的基本功能和特点,那么如何使用Servlet呢?其实,创建一个HttpServlet大致可以分为以下4个步骤:创建一个类并继承抽象类HttpServlet。继承HttpServlet的访问类型为public的方法,并且重写其中的doGet()或doPost()方法。创建HttpServletRequest对象来获取客户端利用Http协议发送的请求信息。创建HttpServletResponse对象获取处理的结果,并将它返回到发出请求的客户端。5.2Servlet的生命周期Servlet是一种可以在Servlet容器中运行的组件,那么理所当然就应该有一个从创建到销毁的过程,这个过程我们可以称之为Servlet生命周期。Servlet的生命周期可以分为加载、创建、初始化、处理客户请求和卸载五个阶段,体现在方法上主要是init()、service()和destroy()3个方法。如图5.1所示。图5.1Servlet生命周期1.加载Servlet在使用Servlet技术之前,首先要创建一个Servlet实例。而Servlet容器主要负责加载和实例化Servlet。只要符合当Servlet容器被启动时,或者接收到需要这个Servlet来响应第一个请求时才会创建Servlet实例。这个操作可以在Servlet容器刚被启动时完成,也可以在容器收到客户请求服务时完成。当Servlet容器启动后,它必须要知道所需的Servlet类在什么位置,Servlet容器可以从本地文件系统、远程文件系统或者其他的网络服务中通过类加载器加载Servlet类,加载成功后,Servlet容器便可以创建一个或多个实例。Servlet加载并实例化后,在处理客户端请求前,容器必须要通过调用它的init方法对其进行初始化。2.利用init方法进行初始化实例创建好了以后,接下就需要对其进行初始化。Servlet的init()方法的主要作用是完成初始化工作,该方法由Servlet容器调用完成。对Servlet实例进行初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库的连接,获取配置信息等。对于每一个Servlet实例,该方法只允许被调用一次。在初始化的过程中,Servlet实例可以通过使用ServletConfig对象从Web应用程序的配置信息(在web.xml中配置)中获取初始化的参数信息。如果在初始化的时候发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常来通知容器。其中:ServletException异常用于指明一般的初始化失败,例如没有找到初始化参数。UnavailableException异常用于通知容器该Servlet实例不可用。例如,数据库服务器没有启动,数据库连接无法建立。3.利用service处理请求在Servlet被成功初始化后,容器就便可以使用它去处理客户端发送的请求了。在使用HTTP协议发送请求时,容器必须提供代表请求和回应的HttpServletRequest对象和HttpServletResponse对象。在处理的过程中,很容易出现下面的问题:多线程问题。容器可能将多个来自客户端的请求同时发送给一个Servlet实例的service方法,这就表示开发者必须编写可以处理这种并发事件的方法。如果开发者想避免这种事件的发生,那么可以让他编写的Servlet程序继承SingleThreadModel类,该类的主要作用是可以确保在执行service方法时一次只有一个线程在运行并且执行完毕,其他的请求就会线程一样,在排队等待。处理请求中的异常。在初始化的过程中,如果出现错误就会抛出ServletException或者UnavailableException异常。ServletException表示在处理请求的过程中发生了错误,可以使用相应方法解除请求;而UnavailableException表示暂时或永远将不能对Servlet的请求做处理。那么,此时这个请求就没有继续存在的意义,必须将它从Servlet容器中移除。4.利用destroy()方法终止服务在Servlet执行完毕或是在处理请求过程中出现UnavailableException异常,需移除Servlet。在移除之前,Servlet会调用destroy()方法让Servlet自动释放占用的资源。容器在能够调用destroy方法前,它必须允许那些正在service方法中执行的线程执行完或者在服务器定义的一段时间内执行(这个时间段在容器调用destroy之前)。如果destroy方法一旦被调用,那么容器就不会向该实例发送任何请求。如果容器需要再使用该servlet,那么它必须重新创建的实例。destroy方法完成后,容器必须释放servlet实例以便它能够被垃圾回收5.生命周期的实例下面给出一个演示init方法和destroy方法的实例,具体代码如下所示:程序5-1Life_Cycle.javapackagechp05;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;01publicclassLife_CycleextendsHttpServlet{02publicvoiddestroy(){03System.out.println(Servlet已经被移除!);04}05publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)06throwsServletException,IOException{07System.out.println(正在运行Servlet的doGet方法!);08}09publicvoidinit()throwsServletException{10System.out.println(Servlet正在初始化……);11}12}输入,首先会执行第10行,接着执行第7行。其运行结果如图5.2所示:图5.2运行结果输入=/JavaWeb,执行第3行,其运行结果如图5.3所示:图5.3运行结果再次输入,其运行结果如图5.4所示:图5.4运行结果5.3HttpServlet类本节将介绍当客户端使用HTTP发送请求时,Servlet会通过使用HttpServlet中的doGet、doPost和service方法处理请求。HttpServlet类是只针对使用HTTP协议的抽象类,所以它需要子类去实现,HttpServlet的子类至少必须重写以下方法之一:doGet,如果servlet支持HTTP的Get请求。doPost,用于HTTP的Post请求。doPut,用于HTTP的Put请求。doDelete,用于HTTP的Delete请求。init和destroy,用于管理Servlet的生命周期内保存的资源。getServletInfo,Servlet使用它提供有关其自身的信息。5.3.1doGet方法的使用doGet方法是由服务器通过service方法调用,允许Servlet处理客户端的Get请求,也就自动支持了HTTPHEAD请求。HEAD请求是一个返回响应中没有正文、只有请求头字段的Get请求。由于在HTTP中,响应头必须在正文发送之前提交,所以在提交响应前,Servlet容器必须写入响应头。还可以使用HttpServletResponse类的setContentLength方法设置Content-Length头,其作用是可以让Servlet容器使用持久连接向客户端返回响应,如果响应缓冲区能够容纳整个响应,则自动设置内容长度。如果使用不正确地格式化请求时,那么doGet将返回BadRequest的消息。下面给出一个演示doGet方法的示例。建立一个DoGet_Demo.java类,具体代码如下:程序5-2DoGet_Demo.javapackagechp05;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;01publicclassDoGet_DemoextendsHttpServlet{02publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{03response.setContentType(text/html;
本文标题:05 Servlet技术基础知识
链接地址:https://www.777doc.com/doc-6319028 .html