概述Java Web基础
1.Java Web与Servlet概述
Java Web应用程序的开发,是Java网络环境应用的重要部分。1996年,人们发现利用Java语言的优点来开发服务器端的应用程序非常有利。于是,许多软件厂商开始发展一些技术来帮助Java开发出更高效的服务端程序。但这些技术都必须搭配特殊的服务器或者专门设计。1997年,JavaSoft提出了Java Servlet概念,它是一个单一、标准、通用的机制,因而很快在服务器端的应用程序开发方面表现出明显优势。
Servlet是用Java编写的Server端程序,与协议和平台无关,运行于某个支持Java语言的服务器组件之上,且可以访问服务器上的资源。Java Servlet是一种可以动态加载模块,是Java Web应用的一个组件。因此,可以动态地扩展服务器能力,并采用请求-响应模式提供Web服务。Servlet响应客户请求的过程:
→ ←
客户 ← 服务器组件 → Servlet
最早用来产生动态网页的方法是CGI(公共网关接口)。它是透过服务器把客户端的请求发送给服务器上的一个程序,这个程序处理完后再将结果传回客户端。CGI程序的缺点就是非常耗费系统资源,每个请求都会让CGI产生一个新进程来处理。
而在Servlet中不同请求是由同一个进程下的独立线程来处理,而且相同的请求会由同一个线程来执行。并且,还解决了CGI程序开发困难、不可移植等问题。因此,Servlet由于可移植、稳健、易开发等优势,Servlet成为了很好的CGI替代品。
Servlet主要功能如下:
·创建并返回基于客户请求的动态HTML页面。
·创建可嵌入到现有HTML页面中的HTML片段。
·与其他服务器资源通信,如连接数据库或基于Java的应用程序。
·创接受多个客户机数据,并可以广播数据到多个客户机,如用Servlet实现多人游戏服务器。
·根据客户请求的特定MIME类型进行数据过滤,如图像格式的转换。
2.Servlet开发环境
使用Servlet编程,需要安装JSDK(Java Servlet Development Kit),包含了编译Servlet应用程序所需的Java类库及相关文档。开发Servlet首先需要把servlet.jar包复制到JDK的扩展目录(%JAVA_HOME%/jre/lib/ext)中。
除了开发工具外,还需要一个支持Java Servlet的Web服务器,或在现有的服务器上安装Servlet软件包。我们把支持Java Servlet的Web服务器称为Servlet容器(Servlet Container)。可以在Sun网站上查看到所有支持Servlet的服务器软件清单。目前支持Servlet的Java Web应用服务器有Tomcat、Resin、Webspher、Weblogic等。
3.Servlet程序的结构
Java Servlet API是一个标准的Java扩展程序包,由javax.servlet和javax.servlet.http两个包组成:
·javax.servlet包;定义了所有Servlet类都必须实现或扩展的通用接口和类。
·Javax.servlet.http包:定义了采用HTTP通信协议的HttpServlet类。
Servlet的框架核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这个接口。这个接口中定义了5个方法,其中init()、service()、destroy()3个方法将在Servlet生命周期的3个不同阶段调用。
Servlet程序通常要继承两个包中的javax.servlet.GenericServlet和javax.servlet.http.HttpServlet这两个类中的其中之一,且HttpServlet继承自GenericServlet抽象类。继承GenericServlet的程序通常用于编写基于客户自定义协议的程序,但通常我们编写的是HTTP通信协议的程序,所以要继承自HttpServlet类。HttpServlet类专门用于处理HTTP请求,并提供了实现此功能的方法doGet()、doPost()。
注意,GenericServlet类已经实现了Servlet的部分接口方法。用户开发自己Servlet类时必须扩展这两个类中的一个。因为,HttpServle继承自GenericServlet抽象类, 而且扩展了GnercicServlet类,所以客户Servlet类则必须实现
public abstract void service ( ServletRequest request , ServletResponse response ) throws ServletException , IOException;
抽象方法。而扩展HttpServlet类则通常不必实现service方法,因为HttpServlet类中已经实现了该方法:
protected void service ( HttpServletRequest request , HttpServletResponse response ) throws ServletException , IOException;
![](https://p-blog.csdn.net/images/p_blog_csdn_net/adousen/ClassDiagram1.jpg)
图1.1 Servlet API 类框图
需要特别注意,实现HttpServletRequest和HttpServletResponse接口的类是在HTTP服务器(Servlet容器)的程序中定义的,它们继承自ServletRequest和ServletResponse接口,分别代表客户的请求和服务器的响应。因为,只有实现了它们,Servlet容器才能创建并将封装有客户请求信息且实现了HttpServletRequest接口的客户类实例传递给service()方法进行处理。实现ServletRequest和HttpServletRequest这两个接口的不同之处在于,后者封装了HTTP请求信息,并且提供了提取这些信息的方法,如getCookies()、getHeader()等。ServletResponse和HttpServletResponse差别也类似。我们也可以把它们称为HttpRequest和HttpResponse。
4.Tomcat与Servlet容器
Jakarta Tomcat服务器是SUN公司的JSWDK(JavaServer Web DevelopmentKit)的基础上发展起来的Servlet/JSP容器,是Apache-Jakarta组织的一个子项目。因为是开源软件,所以得到开源社区的广泛支持,可以与多数主流HTTP服务器(如Apache和IIS)一起工作。同时,Tomcat作为Java Web服务器,还具有如Tomcat管理、平台控制、安全域管理、Tomcat阀等一些服务器特有功能。如今,Tomcat已成为开发企业Java Web应用的最佳选择之一。下载地址:http://tomcat.apache.org,最新版本是Tomcat 6.0。
Tomcat作为Servlet容器,负责把客户请求传送给Servlet后并返回处理结果,Servlet容器(Tomcat)与Servlet之间的接口是由Java Servlet API定义。这个API中定义了使用Servlet的各种方法,在Servlet生命周期的不同阶段被Servlet容器(Tomcat)调用;另外,Servlet API中还定义了可由Servlet容器(Tomcat)创建,且传递到Servlet的对象类,如请求对象ServletRequest和相应对象ServletResponse。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/adousen/123123.jpg)
图1.2 Servlet容器响应客户请求的过程
5.Tomcat的工作模式
Tomcat作为Servlet容器,实际上有着好几种工作模式:
①独立的Servlet容器:
在这种模式下,Tomcat作为独立的Java Web服务器,Servlet容器则作为构成Web服务器的一部分而存在。这是Tomcat的默认模式。
②进程内的Servlet容器:
Servlet容器实际分为Web服务器插件和Java容器两部分。先由Web服务器插件,在其他的服务器内部地址空间打开一个Java虚拟机(JVM)。然后,再由Java容器在此JVM上运行Servlet。如果有客户端发出调用Servlet请求,也是先由插件获得对此请求的控制,再使用JNI通信机制将请求传递给Java容器。因此,进程内的Servlet则可以创建单进程、多线程的服务器,可以提供较高的运行速度。但是,这种工作模式,缺乏伸缩性。
③进程外的Servlet容器:
进程外Servlet容器有别于进程内Servlet的地方就是Web服务器插件是在服务器外部地址空间打开一个JVM。因此,插件与Java容器之间采用的是IPC通信机制传递客户端Servlet调用请求。虽然,进程外Servlet容器对客户请求的响应速度不如进程内容器,但它具有更高的伸缩性和稳定性。
因此,Tomcat可以与其他的Web服务器集成(如Apache、IIS和Netscape等),工作在后两种工作模式下。
6.Servlet的生命周期
Servlet的生命周期开始于Servlet类对象实例被装载入Servlet容器中,结束于被终止或重新装入时。
Servlet的生命周期可以分为初始化、响应客户请求和终止三个阶段,各阶段各自先后调用javax.servlet.Servlet接口中的init()、service()、destroy()3个方法。
①初始化阶段。在下列情形Servlet容器装入Servlet:
·Servlet容器启动时。此时将自动载入某些Servlet。一个Servlet是否在启动时装载,由Tomcat中的网站配置文件web.xml中的有关Servlet设置的<load-on-startup>属性来设定。
·Servlet容器启动后,客户首次向Servlet发出请求时。此时,容器会新创建一个Servlet线程处理客户请求。
·Servlet的类文件更新后。此时是重装如Servlet。
Servlet被装入后,Servlet容器首先创建该Servlet对象的实例,并调用init()方法初始化。在Servlet生命周期中,init()方法只调用一次。init有被重载为2种带参形式:
public void init ( ServletConfig config ) throws ServletException; //ServletConfig对象是Servlet容器用Servlet初始化信息来组装的类对象
public void init () throws ServletExcepton;
因此需要注意,如果客户定义的Servlet类需要覆盖重写Servlet中的init(config)方法,则应该调用super.init(config)方法,确保初始化配置信息。如果是重写init(),则不需要调用super.init()。如果需要访问ServletConfig对象,也可以调用Servlet接口中的getServletConfig()方法。
②响应客户请求阶段。
在这个阶段,Servlet接受到的客户请求,并创建特定于该请求的ServletRequest对象和ServletResponse对象,然后传递给在此阶段调用的service()方法。Service()则负责根据获取的ServletRequest对象中的客户信息进行请求的处理,最后通过Servlet对象将响应处理的结构返给客户。
③终止阶段。当Web应用程序被终止,或者Servlet容器终止运行,或Servlet容器重载Servlet的新实例时,Servlet容器会先调用该Servlet实例的destroy()方法,释放占用的资源。
索引:
CGI(Common Gateway Interface):公共网关接口
MIME(Mutilpurpose Internet Mail Extensions):多功能网际邮件扩充协议
JSDK(Java Servlet Development Kit):Java Servlet开发工具包
JSWDK(JavaServer Web DevelopmentKit):Java服务器Web开发工具包。SUN公司推出的小型Servlet/JSP调试工具
Servlet Container:Servlet容器
JVM(Java Virtual Machine):Java虚拟机
JNI(Java Native Interface):Java本地调用接口。通过此接口,Java程序可以和采用其他语言编写的本地程序进行通信。
IPC(Internet Process Connection):进程之间通过开放命名管道来通信的一种机制
参考:
孙卫琴、李洪城:《Tomcat与Java Web开发技术详解》,2005年版。
张曜、张青、郭立山:《Java程序设计教程》,冶金工业出版社2002年版。