`

Servlet技术实战

阅读更多

Servlet的框架是由两个java包组成的:javax.servlet和javax.servlet.http.     

javax.servlet包含了支持普通协议无关的Servlet的类。

javax.servlet.http包括了对HTTP协议的特别支持。
  servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。在Servlet接口中定义了5个方法,其中有3个方法代表了Servlet的生命周期:
  (1)init方法,负责初始化Servlet对象
  (2)service方法,负责初始响应客户的请求
    (3)destroy方法,当Servlet对象退出生命周期时,负责释放占用的资源
Servlet技术

 

由上图可知,GenericServlet实现了Servlet接口,HttpServlet扩展了GenericServlet。用户开发自己的Servlet类时,扩展HttpServlet类即可如果Servlet类扩展了HttpServlet类,通常不必实现service方法,因为HttpServlet类已经实现了service方法。在HttpServlet的service方法中,首先从HttpServletRequest对象中获取HTTP请求方式的信息,然后再根据请求方式调用相应的方法。
该方法的声明形式如下:
protected void service(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
在HttpServlet的service方法中,有两个参数:HttpServletRequest和HttpServletResponse,这两个类分别扩展了javax.servlet.ServletRequest和javax.servlet.ServletResponse接口。
ServletRequest接口:ServletRequest接口封装了客户请求信息,如客户请求方式、参数名和参数值、客户端正在使用的协议,以及发出客户请求的远程主机信息等。ServletRequest接口还为Servlet提供了直接以二进制数方式读取客户请求数据流的ServletInputStream。ServletRequest的子类可以为Servlet提供更多的与特定协议相关的数据
ServletRequest接口:ServletRequest接口为Servlet提供了返回响应结果的方法。它允许Servlet设置返回数据的长度和MIME类型,并且提供了输出流ServletOutputStream。ServletResponse子类可以提供更多和特定协议相关的方法。

HttpServlet能够根据客户发出的HTTP请求,生成相应的HTTP响应结果。HttpServlet首先必须读取HTTP请求的内容。Servlet容器负责创建HttpRequest对象,并把HTTP请求信息封装到HttpRequest对象中,这样通过调用HttpServletRequest的相关方法,就可以方便地读取HTTP请求中的任何一部分消息。

 

Servlet生命周期

 

阶段一:Servlet实现类的加载

 

(1)所有的web-server加载Servlet实现类的时候,都将搜索web-app根目录下WEB-INF目录的子目录lib和classes,在lib目录中搜索*.jar文件,在classes目录中搜索*.class文件;它将遍历WEB-INF目录下的web.xml配置文件,根据文件中的Servlet标签下Servlet-class子标签的内容加载相应的class文件。

(2)tomcat安装的根目录下的common目录的子目录lib中存放webapps目录下所有web-app的公共jar包,当web-app使用jar包时首先搜索本app中的lib,如果没有找到需要的jar包,将在common目录的lib中找jar包;

(3)web服务器启动时加载Servlet实现类的方法(配置WEB-INF目录下的web.xml)

在web.xml文件中与Servlet实现类相对应的Servlet标签中添加子标签,如:

<load-on-startup>1</load-on-startup>

标签内部的文本应是正整数,当多个Servlet实现类相对应的Servlet标签都添加了子标签时,根据该文本对应整数之的大小加载相应的Servlet实现类;整数值越小,加载顺序越靠前;值相等时,加载顺序由web-server决定。

 

阶段二:Servlet对象的创建与初始化

 

(1)大多数web-server会在客户端第一次访问服务器时加载Servlet实现类,创建对象并执行初始化方法,(如果设置服务器启动时加载,则服务器启动时创建对象并执行初始化方法,客户端第一次访问服务器时,直接进入service阶段执行service方法);以后每个客户端在发送请求就不会再调用init方法,也就是说它只能被调用一次。一个Servlet对象的初始化方法只执行一次;

(2)为Servlet对象设置初始化参数(配置WEB-INF目录下的web.xml)

1> 在web.xml文件中与Servlet实现类相对应的Servlet标签中添加子标签,如:

<init-param>

<param-name>参数名</param-name>

<param-value >参数值</param-value>

</init-param>

每对init-param标签只能设置一个初始化参数,如果要设置多个初始化参数,需重复以上四行代码;参数名一般都不能改,因为我们要在java程序中用到;参数值可以修改。

2> Servlet实现类中覆盖无参的init()方法,方法内部使用getInitParameter("参数名")获得相应的参数值,该方法在javax.Servlet.ServletConfig,javax.Servlet.GenericServlet两个类中都有定义,一般使用后者(即在Servlet实现类中直接使用getInitParameter("参数名")获得相应的参数值);

3> HttpServlet直接继承了GenericServlet类中init(ServletConfig)方法,GenericServlet类的init()方法有两种形式:常规初始化、由初始化参数控制的初始化

   public void init()throws ServletException{} //可以调用不带参数的方法

   public void init(ServletConfig config)throws ServletException{

   this.config=config;//初始化成员变量config

   init(); //这里直接调用了不带参数的init方法。

 }

 

常规初始化:创建、载入在servlet生命周期内用到的一些数据,如为即将处理的请求建立数据库连接共享、将数据文件载入HashMap等

 

由初始化参数控制的初始化

   1. 通过向web.xml的servlet元素添加init-param子元素,可以指定初始化参数的名称和值

   2. 在servlet的init方法中,调用getServletConfig,获取ServletConfig对象的引用

   3. 以init方法的参数名称为参数,调用ServletConfig的getInitParameter方法,返回值就是init参数的值,或null——如果在web.xml文件中没有找到这个init参数。

 

init(ServletConfig)方法中第一行初始化了config成员变量,GenericServlet类中getInitParameter("参数名")方法返回的是getConfig().getInitParameter("参数名");当Servlet实现类中直接使用 getInitParameter("参数名"),由于没有初始化成员变量config,getConfig()将返回null;故会产生空指针异常,所以应该总是在第一行加上super.init(con)。

 

 阶段三:Servlet对象根据客户端的请求提供service

 

(1)HttpServlet类继承自Servlet的实现类javax.Servlet.GenericServlet,HttpServlet类中覆盖的service()方法完成了由一个service方法向多个方法(doGet、doPost、doDelete等方法)转换的过程,细化了service方法的功能,doGet、doPost分别表示当客户端"method”属性设置为get和post时调用;HttpServlet的子类中只需要覆盖其中的一个功能方法;

(2)Service方法会在服务器被访问时调用,Servlet对象的生命周期中service方法可能被多次调用,由于web-server启动后,服务器中公开的部分资源将处于网络中,当网络中的不同主机(客户端)并发访问服务器中的同一资源,服务器将开设多个线程处理不同的请求,多线程同时处理同一对象时,有可能出现数据并发访问的错误。多线程同时处理同一变量时(如:对同一文件进行写操作),且有读写操作时,必须考虑是否加上同步(synchronized),同步添加时,不要添加范围过大,有可能使程序变为纯粹的单线程,大大削弱了系统性能;只需要做到多个线程安全的访问相同的对象就可以了;

在servlet中需要同步的有:成员变量,网络资源,文件,静态变量,数据库连接等,用到这些一定要考虑线程同步,安全的问题。

 

阶段四:Servlet对象的销毁(destroy()方法)

 

当程序中的Servlet对象不再使用时,web-server将有可能销毁该对象,不同的web-server销毁时机不同;一个Servlet对象的销毁(destroy()方法)只执行一次;

我们可以在这个方法里做关闭数据库,关闭流,终止后台线程等收尾工作。注意:不要把持久化的对象存入内存中,程序结束时统一转移到外部存储设备;因为在web-server异常退出(断电等因素引起)的时候,未能来得及转移数据,这样的话会造成数据丢失。

 

 

 

从另一个角度看:

Servlet的生命周期

        在每个Servlet实例的生命中有三种类型事件,这三种事件分别对应于由Servlet引擎所唤醒的三个方法。
        (1) init()
       当Servlet第一次被装载时,Servlet引擎调用这个Servlet的init()方法,只调用一次。如果某个Servlet需要特殊的初始化需要,那么Servlet编写人员可以重写该方法来执行初始化任务。这是个可选的方法。如果某个Servlet不需要初始化,那么默认情况下将调用它的父类的init方法。系统保证,在init方法完成前,是不会调用Servlet去处理任何请求的。
        (2)service()
           这是Servlet最重要的方法,是真正处理请求的地方。对于每个请求,Servlet引擎将调用Servlet的service方法,并把Servlet请求对象和Servlet响应对象作为参数传递给它。
        (3)destroy()    

        这是相对于init的可选方法,当Servlet即将被卸载时由Servlet引擎来调用,这个方法用来清除并释放在init方法中分配的资源。

     Servlet的生命周期可以分以下几步:

          1 装载Servlet,这一项操作一般是动态执行的。然而,Servlet通常会提供一个管理的选项,用于在Servlet启动时强制转载和初始化特定的Servlet。

          2 服务器创建一个Servlet实例。

          3 服务器调用Servlet的init方法。

          4 一个客户端请求到达服务器端。

          5 服务器创建一个请求对象。

          6 服务器创建一个响应对象。

             7 服务器激活Servlet的service()方法,传递请求对象和响应对象作为参数。

          8 service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息。

          9 service()方法使用响应对象的方法。将响应传回服务器,最终到达客户端。service()方法可以激活其他方法以处理请求。如doGet(),doPost()或者程序员自己开发的其他方法。

         10 对于更多的客户端请求,服务器创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这两个对象作为参数传给它,如此重复以上的循环,但无需再次调用init()方法,Servlet一般只初始化一次。

         11 当服务器不再需要Servlet时,比如当服务器要关闭时,服务器调用Servlet的destroy()方法。

 

 

Servlet的工作过程

         Servlet的主要功能在于交互式的浏览和修改数据,生成动态Web内容。这个基本工作过程如下:

        (1) 客户端发送请求至服务器端。

        (2) 服务器上的Web容器装入Servlet,并为Servlet进程创建线程。请注意,Servlet是在出现第一个请求时装入的,在服务器关闭之前不会卸载它。Servlet也可以配置为Web应用程序启动时自动装载。

        (3)Web容器将请求信息发送至Servlet。

        (4)Servlet生成响应内容并将其返回给Web容器。响应内容动态生成,通常取决于客户端的请求。

        (5)Web容器将响应返回给客户端。

        (6)服务器关闭或者Servlet空闲时间超过一定限度时,调用destroy()方法退出

 

 

 

 Servlet容器响应Web客户请求的步骤

 

1:Web客户向Servlet容器发出HTTP请求;
2:Servlet容器解析Web客户的HTTP请求;
3:Servlet容器创建一个HttpRequset对象,在这个对象中封装了HTTP请求信息;
4:Servlet容器创建一个HttpResponse对象;
5:Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象;
6:HttpServlet调用HttpResponse的有关方法,获取HTTP请求信息
7:HttpServlet调用HttpResponse的有关方法,生成响应数据
8:Servlet容器把HttpServlet的响应结果传给Web客户

 

SERVLET API中forward() 与redirect()的区别?


答:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。

分享到:
评论

相关推荐

    servlet技术初步入门

    Servlet技术是Java Web开发中的核心组件之一,它用于扩展服务器的功能,处理来自客户端(通常是Web浏览器)的HTTP请求,并向客户端发送响应。本教程将引导初学者了解Servlet的基本概念、工作原理以及如何在实际项目...

    Servlet+JDBC+JSP项目实战源代码

    总之,"Servlet+JDBC+JSP项目实战源代码"提供了一个实际的Web应用示例,让学习者能够深入了解这三种技术的结合使用,提升其在Web开发领域的技能。通过研究源代码,开发者可以学习到如何构建和部署实际的Web应用,这...

    韩顺平.j2ee视频实战教程servlet迅雷地址

    根据提供的信息,我们可以了解到这是一套由韩顺平老师教授的J2EE视频实战教程,主要聚焦于Servlet技术。接下来,我们将对这一课程的主要知识点进行详细的解析与介绍。 ### J2EE简介 J2EE(Java 2 Platform, ...

    JavaWeb开发实战宝典-servlet篇

    本教程聚焦于Servlet的实际应用,以《JavaWeb开发实战宝典》第四章内容为基础,通过一系列源码示例和习题,深入解析Servlet的核心概念和用法。 首先,我们来看一下Servlet的生命周期,它包括加载、实例化、初始化、...

    ACCP 6.0 S2-5-使用JSP/Servlet/Ajax技术开发新闻发布系统 PPT课件

    【ACCP 6.0 S2-5】课程主要涵盖了使用JSP(JavaServer Pages)、Servlet和Ajax技术来开发新闻发布的系统。这是一个典型的Web应用程序开发主题,旨在教授学员如何利用这些技术构建动态、交互式的网站。 JSP是Java...

    ACCP S2 使用JSP/Servlet技术开发新闻发布系统

    【ACCP S2 使用JSP/Servlet技术开发新闻发布系统】是一个面向初学者的课程,旨在教授如何使用Java服务器页面(JSP)和Servlet技术来构建一个动态、交互式的新闻发布平台。这个课程涵盖了从基础概念到实际开发的完整...

    Servlet Jsp 技术概述 pdf

    8. **实战示例**:可能包含创建简单的登录注册系统、CRUD操作或者用户会话管理等实践案例,其中会用到Servlet和JSP的组合。 学习Servlet和JSP对于理解Java Web开发至关重要,它们是许多企业级应用的基础。通过深入...

    J2EE中Servlet技术帮助文档(超详细和易懂)

    Servlet技术在J2EE开发中扮演着至关重要的角色,它是Java服务器端编程的核心组件,用于接收和处理来自客户端(如浏览器)的HTTP请求,并生成响应返回给客户端。本帮助文档旨在提供一个超详细且易懂的教程,帮助初学...

    使用JSP/Servlet技术开发新闻发布系统.7z

    本项目“使用JSP/Servlet技术开发新闻发布系统”是一个典型的教学案例,旨在帮助学员掌握这两项技术的实战应用。北大青鸟ACCP 8.0 完整版课程体系中,此案例作为S2阶段给教员的素材,旨在深化学员对Web开发的理解。...

    综合实战-servlet

    在IT行业中,Servlet技术是Java Web开发的核心组件之一,它为服务器端提供了处理HTTP请求的能力。本实战项目“综合实战-servlet”旨在强化对Servlet的理解和应用,通过实现用户登录注册以及一系列的增删改查功能,...

    Java Web技术整合应用与项目实战 JSP+Servlet+Struts2+Hibernate+Spring3_13336769.zip.003

    Java Web技术整合应用与项目实战 JSP+Servlet+Struts2+Hibernate+Spring3_13336769.zip.003 Java Web技术整合应用与项目实战 JSP+Servlet+Struts2+Hibernate+Spring3_13336769.zip.003

    猜数字游戏-servlet练习

    【猜数字游戏-Servlet练习】是一个适合初学者的项目,旨在帮助学习者深入理解Servlet技术。Servlet是Java Web开发中的核心组件,它扩展了Web服务器的功能,允许我们编写动态、交互式的网页应用。在这个练习中,我们...

    [转载] JDBC+Servlet+JSP整合开发之-JSP项目实战

    【标题】:“JDBC+Servlet+JSP整合开发之-JSP项目实战” 在这个主题中,我们将深入探讨如何使用Java的三大Web开发技术——JDBC(Java Database Connectivity)、Servlet和JSP(JavaServer Pages)来构建一个完整的...

    Java实训教程 Java软件开发实战 web开发技术 第3章 servlet 共101页.pptx

    ### Java Web 开发实战之 Servlet 技术详解 #### 一、Servlet 技术简介 在 Java Web 开发中,Servlet 是一项非常重要的技术。它主要用于处理来自客户端的 HTTP 请求,并生成相应的响应。Servlet 作为 Java 平台的...

    servlet 心的练习

    在这个"Servlet 心的练习"中,我们可以通过一系列的实例来深入理解和掌握Servlet技术。下面将详细讲解Servlet的基本概念、工作原理以及如何进行实践操作。 一、Servlet基本概念 Servlet是一种Java类,它遵循Servlet...

    java web 实战宝典_JSP+Servlet+Struts_2+Hibernate+Spring+Ajax

    根据标题、描述和部分内容,知识点覆盖范围主要集中在Java Web开发领域,并且包括了JSP、Servlet、Ajax以及SSH框架(Struts 2、Spring、Hibernate)的技术整合和实战案例分析。 JSP(Java Server Pages)是一种动态...

    servlet+vue后端代码

    【标题】"servlet+vue后端代码"指的是使用Java Servlet技术与Vue.js前端框架结合,构建的一个Web应用。在这样的应用中,Servlet通常作为后端处理逻辑,负责与数据库交互,处理HTTP请求并返回相应的数据。Vue.js则...

    韩顺平 j2ee视频实战教程》servlet + jsp的视频

    综上所述,韩顺平老师的这套J2EE视频实战教程涵盖了JSP、Servlet、数据库连接等多个方面的内容,非常适合希望深入学习Java Web开发的初学者和技术人员。通过这些系统的课程学习,学员不仅可以掌握理论知识,还能通过...

    《JSPServlet技术开发动态网页》课程标准(高职).docx

    《JSPServlet技术开发动态网页》是一门专为高职软件技术专业学生设计的专业核心课程,旨在教授学生如何利用JSP和Servlet技术构建动态Web应用程序。这门课程在专业教学体系中占据重要位置,是对之前学习的Java程序...

    servlet+mysql+jsp+ajax 注册 登陆 查询 修改 的简单demo

    开发人员可以通过解压这个文件,然后在本地环境(如Tomcat服务器和MySQL数据库)上运行,以观察和学习这些技术的实战应用。 总的来说,这个项目展示了如何结合Servlet、MySQL、JSP和Ajax构建一个基本的用户管理系统...

Global site tag (gtag.js) - Google Analytics