要掌握Servlet,就需要掌握Servlet开发所涉及的相关知识:良好的Java编程基础、熟悉XML、HTTP协议和WEB站点管理、熟悉HTML语言、CSS和JavaScript、有一定的数据库理论和开发基础。本段视频是Servlet入门,分别讲述Servlet API介绍、编写与编译Servlet程序、Servlet的注册与运行、Servlet激活器、缺省Servlet、Servlet的类装载器和编写一个自动编译工具。
首先介绍一下Servlet API(Servlet Application Programming Interface),它是SUN公司定义的一套专门用于开发Servlet程序的Java类和接口。早期包装Servlet API的jar包被称之为JSDK(Java Servlet Development Kit,即Java Servlet开发工具包),最新版本的Java Servlet开发工具包已经被集成到了SUN公司的Java EE(J2EE升级后的名称,即Java企业级版本)开发工具包中,这些开发工具包都可以从http://java.sun.com站点上下载到。想要精通Servlet,应结合Servlet API帮助文档来学习和应用Servlet API,边学边查、边用边查。必须了解HTTP协议和WEB服务器的内部运行方式、以及Servlet引擎的一些实现机制后,才能够在看懂帮助文档中的英文单词的基础上去了解和掌握一些Servlet API的用途与用法,才能够使用Servlet来实现一些特殊的WEB功能。
学习编程,最重要的是要多动手实践,从错误中学习知识点。了解了Servlet相关知识后,应该学习如何编写一个Servlet程序,并动手实践一下。事实上,一个Servlet程序就是一个实现了javax.servlet.Servlet接口的Java类,Servlet接口定义了Servlet引擎与Servlet程序之间通信的协议约定。在这个规范中,javax.servlet.GenericServlet类实现了Servlet接口,它实现了Servlet程序的基本特征和功能。而javax.servlet.http.HttpServlet类是GenericServlet的子类,它在GenericServlet类的基础上进行了一些针对HTTP特点的扩充。客户端每次访问一个支持HTTP的Servlet程序时,Servlet引擎都将调用Servlet的service方法来进行处理。service方法接受两个参数,一个是用于封装HTTP请求消息的对象,其类型为HttpServletRequest,另一个是代表HTTP响应消息的对象,其类型为HttpServletResponse。调用HttpServletResponse对象的getWriter方法可以获得一个文本输出流对象,向这个流对象中写入的数据将作为HTTP响应消息的实体内容部分发送给客户端。下面就是一个具体的Servlet的例子:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet extends HttpServlet
{
//从HttpServlet类的帮助文档中复制service方法的声明部分可避免书写错误
public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException,IOException
{
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<font size=30 color=red>www.it315.org</font><br>");
out.println("<marquee>" + new java.util.Date() + "</marquee>");
out.println("</html>");
}
}
这里有个小知识点以后会学到,那就是这个service方法并不是Servlet引擎所要调用的,因为Servlet引擎只会调用Servlet规范定义的方法。但在HttpServlet中,规范定义的service方法调用了该上面重写的方法。所以该service方法是被间接调用的。
编写了一个Servlet程序后,接下来就是Servlet的注册与运行。Servlet程序必须通过Servlet引擎来启动运行,并且储存目录有特殊要求,通常需要存储在<WEB应用程序目录>/WEB-INF/classes/目录中。Servlet程序必须在WEB应用程序的web.xml文件中进行注册和映射其访问路径,才可以被Servlet引擎加载和被外界访问。一个<servlet>元素用于注册一个Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。另外一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。因此,<servlet>元素和<servlet-mapping>元素一般是配套使用的。下面就是以上Servlet一个注册示例:
<web-app>
......
<servlet>
<servlet-name>AnyName</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
......
<servlet-mapping>
<servlet-name>AnyName</servlet-name>
<url-pattern>/demo/hello.html</url-pattern>
</servlet-mapping>
......
</web-app>
当部署好后,在浏览器中输入域名加资源路径名,就能收到Servlet引擎返回的相应Servlet的执行结果。Servlet映射有两点值得注意:
1.同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。
2.在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。
最后一段视频讲解了缺省Servlet的有关知识。如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。我们可以查看Tomcat中的配置文件来验证一下。在<tomcat的安装目录>/conf/web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,这个Servlet就是缺省Servlet。当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet。