Servlet :
Servlet 能够完全发挥Java API 的威力,包括网络和URL 存取、多线程 (Multi-Thread)、影像处理、RMI (Remote Method Invocation)、分布式服务器组件 (Enterprise Java Bean)、对象序列
化
(Object Serialization) 等。若想写个网络目录查询程序,则可利用JNDI API;想连接数据库,
则可利用
JDBC,有这些强大功能的API 做后盾,相信Servlet 更能够发挥其优势。
一开始我们必须导入
(import) javax.servlet.*、javax.servlet.http.*。
javax.servlet.* :存放与HTTP 协议无关的一般性Servlet 类;
javax.servlet.http.* :除了继承javax.servlet.* 之外,并且还增加与HTTP协议有关的功能。
所有
Servlet 都必须实现javax.servlet.Servlet 接口(Interface),但是通常我们都会从
javax.servlet.GenericServlet 或javax.servlet.http.HttpServlet 择一来实现。若写的Servlet
程序和
HTTP 协议无关,那么必须继承GenericServlet 类;若有关,就必须继承HttpServlet 类。
一开始和
Applet 一样,也有init( )的方法。当Servlet 被Container 加载后,
接下来就会先执行
init( )的内容,因此,我们通常利用init( )来执行一些初始化的工作。
关于在命令行里面转换当前目录的命令:
C:\Documents and Settings\fxl>cd /d d:\
D:\>
关于编译
HelloServlet.java 的方法:
(1) 将servlet-api.jar 加入至CLASSPATH之中,直接使用javac 来编译HelloServlet.java。
其中servlet-api.jar 可以在{Tomcat_Install}\common\lib 找到。
(2) 直接使用Ant 方式编译HelloServlet.java,请参见1-4 节“安装Ant 1.6”。
编译好HelloServlet.java 之后,再来设定web.xml,如下:
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>tw.com.javaworld.CH2.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
Servlet的生命周期:
Container可以在同一个JVM 上执行所有Servlet,所以Servlet
之间可以有效地共享数据,但是Servlet 本身的私有数据亦受Java 语言机制保护。
Servlet 从产生到结束的流程如图2-2 所示。
(1) 产生Servlet,加载到Servlet Engine中,然后调用init( )这个方法来进行初始化工作。
(2) 以多线程的方式处理来自Client 的请求。
(3) 调用destroy( )来销毁Servlet,进行垃圾收集 (garbage collection)。
Servlet 生命周期的定义,包括如何加载、实例化、初始化、处理客户端请求以及如何被移除。
这个生命周期由javax.servlet.Servlet 接口的init ( )、service( )和destroy( )方法表达。
1. 加载和实例化
当Container一开始启动,或是客户端发出请求服务时,Container会负责加载和实例化一个Servlet。
2. 初始化
Servlet 加载并实例化后,再来Container必须初始化Servlet。初始化的过程主要是读取配置
信息(例如JDBC连接)或其他须执行的任务。我们可以借助ServletConfig 对象取得Container的
配置信息. 因此,可以在HelloServlet程序中使
用ServletConfig 对象的getInitParameter("user")方法来取得browser。
3. 处理请求
Servlet 被初始化后,就可以开始处理请求。每一个请求由ServletRequest 对象来接收请求;
而ServletResponse 对象来响应该请求。
4. 服务结束
当Container 没有限定一个加载的Servlet 能保存多长时间,因此,一个Servlet 实例可能只
在Container 中存活几毫秒,或是其他更长的任意时间。一旦destroy( )方法被调用时,Container
将移除该Servlet,那么它必须释放所有使用中的任何资源,若Container 需要再使用该Servlet
时,它必须重新建立新的实例。
Servlet 范例程序:
Sayhi.html
Sayhi.java
从Sayhi.java的程序当中,可以发现Servlet是利用HttpServletRequest类的getParameter( )
方法来取得由网页传来的数据。不过数据通过HTTP协议传输时会被转码,因此在接收时,必须再做转
码的工作,才能够正确地接收到数据。
编译Sayhi.java 之后,再来设定web.xml:
<servlet>
<servlet-name>Sayhi</servlet-name>
<servlet-class>tw.com.javaworld.CH2.Sayhi</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Sayhi</servlet-name>
<url-pattern>/CH2/Sayhi</url-pattern>
</servlet-mapping>
执行http://localhost:8080/JSPBook/CH2/Sayhi
注意:在Sayhi.java 里面修改了一下,如果要马上看到效果的话,需要把该类编译一下,然后放到classes里面,
然后再重新启动tomcat 即可。如果没有重新启动的话,打开网页访问,提示连接不到Servlet 或者连接的是
以前的Servlet。