380 likes | 605 Views
互联网软件开发与应用. 任课教师:陆 铭 联系电话: 66134267 QQ: 22839978 PoPo:richard.du@163.com 教学网站: mingler.ccshu.org. 第八章 Java Servlet 技术介绍. 8.1 Servlet 简介 8.1.1 什么是 Servlet 8.1.2 为什么要使用 Servlet 8.1.3 编写 Servlet 需要什么 8.1.4 运行 Servlet 要做些什么 8.1.5 Java Servlet 与现有网络技术的差别 8.2 Servlet API
E N D
互联网软件开发与应用 任课教师:陆 铭 联系电话:66134267 QQ: 22839978 PoPo:richard.du@163.com 教学网站:mingler.ccshu.org
第八章 Java Servlet技术介绍 • 8.1 Servlet简介 • 8.1.1 什么是Servlet • 8.1.2 为什么要使用Servlet • 8.1.3 编写Servlet需要什么 • 8.1.4 运行Servlet要做些什么 • 8.1.5 Java Servlet与现有网络技术的差别 • 8.2 Servlet API • 8.3 Servlet的生命周期 • 8.4 一个Servlet实例 • 8.4.1 基本流程 • 8.4.2 编写一个简单的实例
Servlet简介 • Java 是 Internet 发展中在 客户机/服务器 计算方面最为瞩目的新技术之一 • Java 不仅定义了一种计算机语言,而且提供了一整套 客户机/服务器 解决方案,在这个解决方案中,程序可以自动地下载到客户端,并予以执行 • 过去大家的主要注意力是如何在客户端开发Applet和图形用户界面(GUI—Graphical User Interface) • Applet是客户机/服务器计算环境的重要组成部分 • Applet仅仅是问题的一个方面,Servlet是问题的另外一面 应用小程序 服务器端小程序
什么是Servlet • Servlet可以被认为是服务器端的Applet,Servlet被Web服务器加载和执行,就如同Applet被浏览器加载和执行一样。Servlet从客户端(通过Web服务器)接受请求,执行某种作业,然后返回结果。 • 由于Servlet是在服务器上执行,通常与Applet相关的安全性的问题并不需要实现 • Servlet使相当数量的不可能或者至少是很难由Applet实现的功能得以实现 • Web浏览器并不直接同Servlet通信,Servlet是由Web服务器加载和执行的。如果用户的Web服务器有防火墙保护,则Servlet也将得到防火墙的保护
使用Servlet的基本流程 • 客户端(一般为Web浏览器)通过HTTP提出请求 • Web服务器接受该请求并将其发送给Servlet,如果这个Servlet尚未被加载,Web服务器将把它加载到Java虚拟机并且执行它 • Servlet将接受该HTTP请求并执行某种处理 • Servlet将向Web服务器返回应答 • Web服务器将从Servlet收到的应答返回给客户端
Servlet可完成的功能 • 创建并返回基于客户请求的动态HTML页面 • 创建并嵌入到现有的HTML页面中的部分HTML页面(HTML片段) • 与其他服务器资源(如数据库或基于Java的应用程序)进行通信 • 接受多个客户机的输入并将结果传播到多个客户机上 • Servlet可以实现支持多个参与者的游戏服务器等 • 根据客户请求采用特定的MIME类型对数据过滤 • 进行图象格式转换等
Servlet的作用 • Servlet可以很好地替代通用网关接口(CGI)脚本 • 通常CGI脚本是用Perl或者C语言编写的,它们总是与特定的服务器平台紧密相关 • Servlet是用Java编写的,因此是与平台无关的 • Java的“编写一次就可以在任何平台上运行”(Write Once,Run Anywhere)的承诺同样可以在服务器上实现
Servlet的独特优点 (1) • Servlet是持久的 • Servlet只需Web服务器加载一次,而且可以在不同请求之间保持服务(如一次数据库的连接) • CGI脚本是短暂的、瞬态的。每一次对CGI脚本的请求都会使Web服务器加载并执行该脚本。一旦这个CGI脚本运行结束,它就会被从内存中清除,然后将结果返回客户端 • CGI脚本的每一次使用,都会造成程序初始化过程的重复执行 • Servlet是可扩展的 • 由于Servlet是用Java编写的,它就具备了Java所能带来的所有的优点 • Java是健壮的、面向对象的编程语言,它很容易扩展以适应需求,Servlet自然也具备了这些特征
Servlet的独特优点 (2) • Servlet是安全的 • 从外界调用一个Servlet的唯一方法就是通过Web服务器,这就提供了高水平的安全保障,尤其是在用户的Web服务器具有防火墙保护的时候显得尤为突出 • Servlet可以在多种多样的客户机上使用 • 由于Servlet是用Java编写的,所以可以很方便地在HTML中使用它们,就象使用Applet一样 • 使用Servlet的方式多得超出想象,如果考虑到在服务器上所能访问到的所有服务,使用Servlet的方式实际可能是无限的
Servlet开发环境 • Sun Microsystem的Java软件部称为JavaSoft,提出的目标:尽量使Servlet的开发能够既方便又快捷 • 开发Servlet需要的软件工具包括 • JSDK,Java Servlet开发工具包 • 可以从JavaSoft的主页(http://java.sun.com)上下载 • JDK,Java开发工具包 • 1.2版以后JSDK成为JDK的组成部分,但使用JDK 1.1版的用户需要另外下载JSDK • Java核心框架是所有使用Java的产品必须包含的 • JSDK中包含了Java Servlet API(标准的Java扩展API) • JSDK不是Java核心框架的组成部分,可以由供应商将其作为附加包来提供 • Javax.Servlet包中提供了Servlet API
Servlet的运行环境 • 运行Servlet的全部需求就是一个支持Servlet API的Web服务器 • JavaSoft提供的Java Web服务器 • 第三方厂商提供的Java Web服务器
Servlet与Applet的差别 • Servlet与Applet是截然相反的,Servlet可以被视为服务器端的Applet • Servlet在网络服务器内运行,Applet在网络浏览器内运行 • 浏览器提交一个请求执行Servlet的命令,浏览器可直接命令Applet,所以它可以在运行时单机运行
Servlet与CGI的差别 • 与传统的CGI和其他许多类似CGI的技术相比,Java Serlet具有更高的效率,更容易使用,功能更强大,具有更好的可移值性,更节省投资 • 在传统的CGI中,每个请求都要启动一个新的进程,如果CGI本身的执行时间较短,启动进程所需要的开销很可能超过实际执行时间 • 使用Servlet时,服务器上仅有一个Java虚拟机在运行,只有当Servlet被调用时,它才会被加载,直到Servlet更改时,它才会被再次加载。 • 在传统的CGI中,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中将重复被装载N次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码 • 在性能优化方面,Servlet也比CGI有着更多的选择,比如缓冲以前的计算结果,保持数据库连接的活动,等等
Servlet的框架 • Servlet的框架是由两个Java包组成 • javax.servlet • 定义了所有的Servlet类都必须实现或扩展的通用接口和类 • javax.servlet.http • 定义了采用HTTP协议通信的HttpServlet类 • Servlet的框架的核心是javax.servlet.Servlet接口 • 所有的Servlet都必须实现这一接口 • 在Servlet接口中定义了 5 个方法,其中 3 个方法代表了Servlet的生命周期 • Init方法,负责初始化Servlet对象 • Service方法,负责响应客户的请求 • Destroy方法,当Servlet对象退出生命周期时,负责释放占用的资源
GenericServlet实现Servlet接口HttpServlet扩展GenericServletGenericServlet实现Servlet接口HttpServlet扩展GenericServlet ServletAPI 类图 《Interface》 javax.servlet.ServletConfig 《Interface》 javax.servlet.Servlet java.io.Seializable getInitParameter( ) getServletContext( ) getInitParameterNames( ) init( ) getServletConfig( ) service( ) getServletInfo( ) destroy( ) javax.servlet.GenericServlet javax.servlet.http.HttpServlet getServletContext( ) getInitParameter( ) getInitParameterNames( ) log( ) getServletInfo( ) init( ) getServletConfig( ) service( ) destroy( ) doGet( ) doPost( ) doPut( ) doDelete( ) doTrace( ) doOptions( ) getLastModified( ) service( )
用户扩展类 • 用户开发自己的Servlet时,必须扩展下列类中的一个 • 扩展GenericServlet类 • 如果扩展本类,则必须实现service方法,因为本类中的该方法是个抽象方法 • service方法的声明形式 public abstract void service(ServletRequest request, ServletResponse response) throws ServletException, IOException ; • 扩展HttpServlet类 • 如果扩展本类,通常不需要实现service方法,因为该方法在HttpServlet类中已经实现了 • service方法的声明形式 • protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException ; 参数2:service方法将响应的客户结果通过对象ServletResponse传给客户 参数1:servlet容器将客户请求信息封装在ServletRequest对象中传给service方法 首先从HttpServletRequest对象中获取HTTP请求方式的信息,然后根据请求方式调用相应的方法,如doGet或doPost。Servlet中的两个参数则分别扩展了ServletRequest和ServletResponse类
基本概念 • Servlet的生命周期定义了一个Servlet如何被加载、初始化,以及怎样接受请求、响应请求、提供服务 • 代码中,Servlet生命周期由接口javax.servlet.Servlet定义 • 所有的Java Servlet必须直接或间接地实现javax.servlet.Servlet接口才能在Servlet Engine上运行 • Servlet Engine提供network service,响应MIME request,运行Servlet Container • javax.servlet.Servlet接口定义了一些方法,在Servlet生命周期中,这些方法会在特定时间按照一定的顺序被调用
Servlet生命周期图 (状态图) 不存在Servlet实例 结束Servlet 对应Servlet的destroy方法 Servlet生命周期 容器装载Servlet 创建Servlet实例 初始化Servlet 对应Servlet的init方法 调用Service方法 对应Servlet的service方法
Servlet生命周期的四项重要活动 (1) • Servlet的装载(Load)和实例化(Instantiated) • Servlet Engine负责装载和实例化Servlet,这个过程可以在Servlet Engine加载时执行,可以在Servlet响应请求时执行,也可以在两者之间的任何时候执行 • Servlet的初始化(Initialized) • Servlet Engine加载好Servlet后必须要初始化,初始化时Servlet可以从数据库里读出初始数据,建立JDBC Connection,或者建立对其他有价值的资源的引用 • 初始化阶段init( )方法被调用,这个方法在javax.servlet.Servlet接口中定义 • init()方法以一个Servlet配置文件(ServletConfig型)为参数Servlet configuration对象由Servlet Engine实现,可以让Servlet从中读取一些name-value对的参数值 • ServletConfig对象还可以让Servlet接受一个Servlet Context对象
Servlet生命周期的四项重要活动 (2) • Servlet处理请求 • Servlet初始化后九处于响应请求的就绪状态 • 每个对Servlet的请求由一个Servlet Request对象代表,Servlet给客户端的响应由一个Servlet Response对象代表 • 当客户端有一个请求时,ServletRequest和ServletResponse对象将由Servlet Engine转发给Servlet,这两个对象以参数的形式传给service方法.这个方法是由javax.servlet.Servlet定义并由具体的Servlet实现的 • Servlet还可以实现ServletRequest和ServletResponse接口 • ServletRequest接口可以让Servlet获得客户端请求中的参数,如form data、request信息等 • Servlet可以从ServletInputStream流中读取request数据 • ServletResponse接口允许Servlet设置response headers和status codes.实现这个接口可以使Servlet能访问ServletOutputStream流,用来向客户端返回数据
Servlet生命周期的四项重要活动 (3) • Servlet被释放 • Servlet Engine没必要在Servlet生命周期的每一段时间内都保持Servlet的状态, Servlet Engine可以随时随意使用或释放Servlet,因此,不能依赖Servlet class或其他成员存储信息 • 当Servlet Engine判断一个Servlet应当被释放 (如Engine准备shutdown或需要回收资源)时,Engine必须让Servlet能释放其正在使用的任何资源,并保持其持续性的状态信息。这可以通过调用Servlet的destroy方法实现 • 在Servlet Engine释放一个Servlet以前,必须让其完成当前实例的service方法或是等到timeout(如果Engine定义了timeout) • 当Engine释放了一个Servlet后,Engine将不能再将请求转发给他,Engine必须彻底释放该Servlet,并将其标明为可回收的(garbage collextion)
Servlet实例说明 编写一个简单的Servlet,要求可以接受一个HTML POST请求,处理参数,并形成HTML结果发送给客户(也可以是浏览器)
基本流程说明 • 客户(浏览器)向服务器发送一个请求以加载一个HTML网页 • 服务器上HTTP Web服务将会接受到该请求,识别出这是一个读HTML文件的请求。 • 然后调用文件Servlet实现实际的文件输入/输出,该HTML网页将会被返回给客户并在浏览器中显示 • 若web浏览器发出了HTML POST请求,则web服务会再次收到该请求,若POST请求要求加载一个Servlet,则该请求将会发送给调用者Servlet,并由调用者Servlet调用请求打开的Servlet • 该Servlet进行某种处理并将返回的数据通过HTTP发送回客户
服务器如何知道要调用Servlet • HTTP Web服务器如何知道要调用Servlet? • 客户首先要指定一个URL,它能命名要调用的那个Servlet http://some.server.com/servlet/my_servlet?arguments • 上述URL使用了HTTP协议所以HTTP Web服务器将接受到这个请求,在web服务种有一个配置文件,为每个Servlet起了个别名,可以将Servlet与请求它的URL联系起来。通过该页面管理的Servlet别名使得别名“/Servlet”被分配给Servlet调用者,一旦web服务从URL中找到“/Servlet”,调用者Servlet会被调用以响应该请求 • Servlet的基本流程 • 加载Servlet、初始化Servlet、调用doPost( )、执行某种处理并通过输出流返回应答、响应最初由HTTP Web服务接受 • Servlet容器响应客户请求流程的UML时序图 (如P212 图8-3)
Servlet Container HttpServletResponse Web Client HttpServlet HttpServletRequest 1: send HTTP request 2: parse HTTP request 3: new Instance) 4: new Instance 5. call service method 6. get request information 7. output request information 8. send HTTP response Servlet 容器响应客户请求的时序图
一个简单的实例编写 • 编写响应HTML请求的Servlet只需要两步 • 创建一个扩展了javax.servlet.http.Httpservlet接口的Servlet类 • javax.servlet.http.Httpservlet这个接口是javax.Servlet.GenericServlet的扩展接口,它包含了分析HTML首部和将客户端信息打包到javax.servlet.httpHttpServlet Request类中的那些代码 • 重写doGet和doPost方法之一或全部 • 重写init和destroy的典型例子就是在init方法中建立数据库连接,并在destroy方法中断开它 • 实例的操作内容 • 把一个含有客户信息、所有提交的参数以及所有服务器系统属性的HTML网页返回给客户 • 实例的程序代码 • 见P.213起
关于复习练习 • 在全面通读教材的基础上练习各项练习题 • 练习时先按实战要求自己完成,做完后再看答案 • 看答案时不要只是背答案,而要认真分析答案给出的解题思路,并能举一反三,真正弄懂弄通,达到融会贯通的效果 • 在反复练习的基础上,逐步练习完整的试卷 • 试卷练习同样要以实战为基点,按时按量进行联系,时间到了立即停止,然后按照答案进行评分 • 对做错的题进行认真分析,找到错误的原因。同样不是背答案,掌握解题思路,及时总结每套试卷练习中的得失。 • 模拟试卷是综合练习,也是按照考试的要求命题的,因此练习时也要按照考试的要求进行,以便调整做题心态,养成良好的临场状态